这位大哥您说的对,我按照你给的设置了一下,果然当我连续回复贴,每次都是回复到第四贴的时候,又失去响应,这次打出了异常,如下 org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [null]; error code [0]; Cannot get a connection, pool error Timeout waiting for idle object; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:424) org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:410) org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411) org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912) pengbbs.dao.impl.PageDAO.findByProperty(PageDAO.java:215) pengbbs.Service.impl.UserService.findByProperty(UserService.java:159) pengbbs.controller.PostAction.reply(PostAction.java:196) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ......我在pengbbs.dao.impl.PageDAO.findByProperty(PageDAO.java:215)的方法是: @Override public List findByProperty(String whichclass, String[] propertyNames,Object[] values) { // TODO Auto-generated method stub StringBuffer strBuffer = new StringBuffer(); strBuffer.append("from "); strBuffer.append(whichclass); strBuffer.append(" as model where "); for (int i = 0; i < propertyNames.length; i++) { if (i != 0) strBuffer.append(" and"); strBuffer.append(" model."); strBuffer.append(propertyNames[i]); strBuffer.append("="); strBuffer.append("? "); } String queryString = strBuffer.toString(); return this.getHibernateTemplate().find(queryString, values);//这里就是215行,报错的行 }上面如果那一行报错,为什么前面四次回帖又是正常呢,每次都第四次报错? 请大哥及各路高手帮忙看下,谢谢!!!
String propertyNames[] = new String[1]; Integer values[] = new Integer [1]; propertyNames[0]="boardId"; values[0]=boardId; int allPage=1; if (page==null) { page=1; } int allRows =userService.viewAllTopics(boardId).size(); allPage= (allRows+pageSize-1) / pageSize; // 计算总页数 list=userService.PostNewTopic(userName, title, detail, boardId, page, pageSize); //Collections.reverse(list); if(!list.isEmpty()){ session.put("allPage", allPage); session.put("page", page); return SUCCESS; }else return "notPost"; }其中:userService.viewAllTopics(boardId)是: public List viewAllTopics(Integer boardId){ return pageDAO.findByProperty("Topic", new String[]{"boardId"}, new Integer[]{boardId}); }list=userService.PostNewTopic(userName, title, detail, boardId, page, pageSize); 是:@Override public List PostNewTopic(String userName, String title, String detail,Integer boardId,int page,int pageSize) { List list=null; if (userName==null || userName.equals(" ") ){ return list; } Topic topic=new Topic(); topic.setTitle(title); topic.setDetail(detail); topic.setIsNew(true); topic.setIsLock(false); topic.setIsGood(false); topic.setIsTop(false); topic.setBoardId(boardId); topic.setTopicHidden(false); topic.setUserName(userName); topic.setPostTime(new Timestamp(System.currentTimeMillis())); topicDAO.save(topic); String propertyNames[] = new String[1]; Integer values[] = new Integer[1]; propertyNames[0]="boardId"; values[0]=boardId;
list=pageDAO.findByPropertyPage("Topic", propertyNames, values, page, pageSize); return list; }pageDAO.findByPropertyPage这个和之前那个差不多,这个多了个分页的判断 @Override public List findByPropertyPage(String Whichclass, String []propertyNames, Object []values,int page, int pageSize) { StringBuffer strBuffer = new StringBuffer(); strBuffer.append("from "); strBuffer.append(Whichclass); strBuffer.append(" as model where "); for (int i = 0; i < propertyNames.length; i++) { if (i != 0) strBuffer.append(" and"); strBuffer.append(" model."); strBuffer.append(propertyNames[i]); strBuffer.append("="); strBuffer.append("? "); //Topic } if (Whichclass.equals("Topic")) { strBuffer.append("order by postTime desc "); }
要不就是你的java逻辑部分里面存在着内存泄露,仔细检查下!
我是用struts2+spring+hibernate
每次运行开始的时候一切正常,发帖、回复,注册等都正常,但我试过了,如果连续发帖7、8个,或连续回复7、8贴。往往回复到第8个贴的时候,程序就基本上处于失去响应的状态,等很久也没结果出来。
就是发帖发到第7、8个左右,就不动了,必须重启tomcat,这个和tomcat版本有关吗?
控制台也不报错,也不显示“无法显示该网页”,浏览器就是一直在哪转,我不停止tomcat,他就什么也显示不出来,感觉就是程序卡住了。但如果说死循环,我只是实现一些简单的功能啊,比如注册,登录,尤其我测试的时候只是测试发帖这个单一的action,但连续7、8次程序就卡死。连续单独测试回复贴子也是一样的情况。
加的代码:
<property name="maxIdle" value="50"></property>
<property name="maxWait" value="5000"></property>
<property name="maxActive" value="50"></property>
<property name="defaultAutoCommit" value="true"></property>
<property name="removeAbandonedTimeout" value="60"></property>这一段配置设置了最大连接数,等待时间等。不过小弟还是不大明白为什么少了这一段配置就会出那样的问题。望高手指点一下,谢谢!
<property name="maxIdle" value="5"></property>
<property name="maxWait" value="5000"></property>
<property name="maxActive" value="5"></property>
<property name="defaultAutoCommit" value="true"></property>
<property name="removeAbandonedTimeout" value="600"></property>参数修改为池大小只有5个,超时自动回收改为600秒。
你再试试看,至少发6个帖子,查询6次帖子来试试看是否还能活着。我认为本质问题你可能还没找到。
这位大哥您说的对,我按照你给的设置了一下,果然当我连续回复贴,每次都是回复到第四贴的时候,又失去响应,这次打出了异常,如下
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [null]; error code [0]; Cannot get a connection, pool error Timeout waiting for idle object; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:424)
org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:410)
org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912)
pengbbs.dao.impl.PageDAO.findByProperty(PageDAO.java:215)
pengbbs.Service.impl.UserService.findByProperty(UserService.java:159)
pengbbs.controller.PostAction.reply(PostAction.java:196)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
......我在pengbbs.dao.impl.PageDAO.findByProperty(PageDAO.java:215)的方法是:
@Override
public List findByProperty(String whichclass, String[] propertyNames,Object[] values) {
// TODO Auto-generated method stub
StringBuffer strBuffer = new StringBuffer();
strBuffer.append("from ");
strBuffer.append(whichclass);
strBuffer.append(" as model where ");
for (int i = 0; i < propertyNames.length; i++)
{
if (i != 0)
strBuffer.append(" and");
strBuffer.append(" model.");
strBuffer.append(propertyNames[i]);
strBuffer.append("=");
strBuffer.append("? ");
}
String queryString = strBuffer.toString();
return this.getHibernateTemplate().find(queryString, values);//这里就是215行,报错的行
}上面如果那一行报错,为什么前面四次回帖又是正常呢,每次都第四次报错?
请大哥及各路高手帮忙看下,谢谢!!!
没有啊,我新建了一个分页与查询的PageDAO,public class PageDAO extends HibernateDaoSupport implements IPageDAO,其中就是上诉那个findByProperty方法以及一个findByPropertyPage的方法我在网上查,说Hibernate的内置连接池无法自己释放?
@Override
public String execute() throws Exception {
Map session= ActionContext.getContext().getSession();
String userName=(String) session.get("USER_NAME");
session.put("BOARD_NAME", boardName);
String propertyNames[] = new String[1];
Integer values[] = new Integer [1];
propertyNames[0]="boardId";
values[0]=boardId;
int allPage=1;
if (page==null) {
page=1;
}
int allRows =userService.viewAllTopics(boardId).size();
allPage= (allRows+pageSize-1) / pageSize; // 计算总页数
list=userService.PostNewTopic(userName, title, detail, boardId, page, pageSize);
//Collections.reverse(list);
if(!list.isEmpty()){
session.put("allPage", allPage);
session.put("page", page);
return SUCCESS;
}else
return "notPost";
}其中:userService.viewAllTopics(boardId)是:
public List viewAllTopics(Integer boardId){
return pageDAO.findByProperty("Topic", new String[]{"boardId"}, new Integer[]{boardId});
}list=userService.PostNewTopic(userName, title, detail, boardId, page, pageSize);
是:@Override
public List PostNewTopic(String userName, String title, String detail,Integer boardId,int page,int pageSize) {
List list=null;
if (userName==null || userName.equals(" ") ){
return list;
}
Topic topic=new Topic();
topic.setTitle(title);
topic.setDetail(detail);
topic.setIsNew(true);
topic.setIsLock(false);
topic.setIsGood(false);
topic.setIsTop(false);
topic.setBoardId(boardId);
topic.setTopicHidden(false);
topic.setUserName(userName);
topic.setPostTime(new Timestamp(System.currentTimeMillis()));
topicDAO.save(topic);
String propertyNames[] = new String[1];
Integer values[] = new Integer[1];
propertyNames[0]="boardId";
values[0]=boardId;
list=pageDAO.findByPropertyPage("Topic", propertyNames, values, page, pageSize);
return list; }pageDAO.findByPropertyPage这个和之前那个差不多,这个多了个分页的判断
@Override
public List findByPropertyPage(String Whichclass, String []propertyNames, Object []values,int page, int pageSize) {
StringBuffer strBuffer = new StringBuffer();
strBuffer.append("from ");
strBuffer.append(Whichclass);
strBuffer.append(" as model where ");
for (int i = 0; i < propertyNames.length; i++)
{
if (i != 0)
strBuffer.append(" and");
strBuffer.append(" model.");
strBuffer.append(propertyNames[i]);
strBuffer.append("=");
strBuffer.append("? "); //Topic
}
if (Whichclass.equals("Topic")) {
strBuffer.append("order by postTime desc ");
}
String queryString = strBuffer.toString();
int firstResult = (page - 1) * pageSize;
Query query = this.getSession().createQuery(queryString);
query.setFirstResult(firstResult);
query.setMaxResults(pageSize);
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
return query.list();
}我单一的连续发帖,报错的总是那句findByProperty(String whichclass, String[] propertyNames,Object[] values)里的 return this.getHibernateTemplate().find(queryString, values);谢谢!!
我自己发现问题了,是findByPropertyPage函数中的Query query = this.getSession().createQuery(queryString);这行出的问题,这行调用了this.getSession()但后面没有关闭,所以导致连接无法释放。
我修改成下面....
Session s=this.getSession();
Query query = s.createQuery(queryString);
query.setFirstResult(firstResult);
query.setMaxResults(pageSize);
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
List list =query.list();
s.close();//这里关闭它
return list; 这样子解决了!请这位大哥再看下这样是否正确,再次感谢,要不是你前面指出我的问题,我自己都不知道原来是这里的问题。
谢谢!!!!!!!!
Very nice!但是我必须指出,这句话应该放在 finally 块中。Session s=this.getSession();
try {
Query query = s.createQuery(queryString);
query.setFirstResult(firstResult);
query.setMaxResults(pageSize);
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
List list =query.list();
} finally {
s.close();
}