看看你程序运行时内存和cpu的消耗以及对数据的性能影响,是否有打开的连接没有关闭,如果用到了spring,各个方法是否符合spring的事物管理原因有很多

解决方案 »

  1.   

    估计就是数据库连接只开不关。
    要不就是你的java逻辑部分里面存在着内存泄露,仔细检查下!
      

  2.   

    楼上说的对。 你执行sql增删改,都要close一下。 或者用hibernate那个你就不用管了
      

  3.   

    谢谢楼上的几位大哥。
    我是用struts2+spring+hibernate
    每次运行开始的时候一切正常,发帖、回复,注册等都正常,但我试过了,如果连续发帖7、8个,或连续回复7、8贴。往往回复到第8个贴的时候,程序就基本上处于失去响应的状态,等很久也没结果出来。
      

  4.   


    就是发帖发到第7、8个左右,就不动了,必须重启tomcat,这个和tomcat版本有关吗?
    控制台也不报错,也不显示“无法显示该网页”,浏览器就是一直在哪转,我不停止tomcat,他就什么也显示不出来,感觉就是程序卡住了。但如果说死循环,我只是实现一些简单的功能啊,比如注册,登录,尤其我测试的时候只是测试发帖这个单一的action,但连续7、8次程序就卡死。连续单独测试回复贴子也是一样的情况。
      

  5.   

    谢谢各位大哥,问题已经解决了。我在数据配置那里加了一段代码,就没出现死机了。我连续发了很多帖子就正常了。
    加的代码:
    <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>这一段配置设置了最大连接数,等待时间等。不过小弟还是不大明白为什么少了这一段配置就会出那样的问题。望高手指点一下,谢谢!
      

  6.   

    恐怕不是你10楼贴出来这个问题你这个改法只是增大了连接池的容量,建议你缩小容量再测试:
    <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次帖子来试试看是否还能活着。我认为本质问题你可能还没找到。
      

  7.   

    你说的这种情况应该和STRUTS没关系  。。应该是你打开数据库连接 或者别的连接 使用后并没有关闭连接。。
      

  8.   


    这位大哥您说的对,我按照你给的设置了一下,果然当我连续回复贴,每次都是回复到第四贴的时候,又失去响应,这次打出了异常,如下
    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行,报错的行
    }上面如果那一行报错,为什么前面四次回帖又是正常呢,每次都第四次报错?
    请大哥及各路高手帮忙看下,谢谢!!!
      

  9.   

    其实我在3楼说了,应该是你的数据库连接没有关闭所致的。但是你这里用的是 HibernateTemplate ,照理来说,应该会自动关闭才对,这比较奇怪。你还有别的地方使用了Hibernate的session么?
      

  10.   


    没有啊,我新建了一个分页与查询的PageDAO,public class PageDAO extends HibernateDaoSupport implements IPageDAO,其中就是上诉那个findByProperty方法以及一个findByPropertyPage的方法我在网上查,说Hibernate的内置连接池无法自己释放?
      

  11.   

    这个是postAction的发帖函数
    @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);谢谢!!
      

  12.   


    我自己发现问题了,是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; 这样子解决了!请这位大哥再看下这样是否正确,再次感谢,要不是你前面指出我的问题,我自己都不知道原来是这里的问题。
    谢谢!!!!!!!!
      

  13.   


    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();
    }
      

  14.   

    谢谢楼主,我也遇到这个问题 Spring的数据库配置那里加上你说得那些配置 好了
      

  15.   

    我也遇到这个问题,弄了一下午终于找到了这个帖子!!太感谢了!我的问题原来是session未关闭,已解决