随笔-153  评论-235  文章-19  trackbacks-0

前几天用spring+hibernate+struts写了个增/删/改/查的例子。调试期间问题就来了,当查询结果翻页好几次就没N久没有响应了。最后控制报错。网上查了,它说数据库连接(池)问题。

出现错误如下:

<2007-9-30 下午120303 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteThread: '13' for queue: 'weblogic.kernel.Default' has been busy for "901" seconds working on the request "Http Request: /admin/school.do", which is more than the configured time (StuckThreadMaxTime) of "600" seconds.>

先说下我配置

1.环境:

spring 2.0.6,hibernate 3.2.3,struts 1.2.9,oracle 10.2,weblogic 8.1.4

jdbc是ojdbc14.jar

2.连接池用DBCP

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">   
    
<property name="driverClassName" value="${jdbc.driverClassName}"/>   
    
<property name="url" value="${jdbc.url}"/>   
    
<property name="username" value="${jdbc.username}"/>   
    
<property name="password" value="${jdbc.password}"/>   
bean>   

3.分页方法(参考springside的),此类继承HibernateDaoSupport
public Page listByPage(Class entityClass, int pageNo, int pageSize, List criterions, List orders) {    
    Criteria criteria 
= createCriteria(entityClass, criterions);    
    CriteriaImpl impl 
= (CriteriaImpl) criteria;    
   
    
// 先把Projection和OrderBy条件取出来,清空两者来执行Count操作    
    Projection projection = impl.getProjection();    
    
//获取总记录数    
    int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();    
   
        
    
if(totalCount < 1) {    
        
return new Page();    
    }    
        
    
//加排序    
    if(orders != null) {    
        
for(int i=0; i 
            criteria.addOrder((Order) orders.get(i));    
        }    
    }    
    
//原来的投影    
    criteria.setProjection(projection);    
    
int startIndex = Page.getStartOfPage(pageNo, pageSize);    
    
//取得结果    
    List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();    
        
    
return new Page(startIndex, totalCount, pageSize, list);    
}    
   
public Criteria createCriteria(Class entityClass, List criterions) {    
    Criteria criteria 
= getSession().createCriteria(entityClass);    
    
if(criterions != null) {    
        
for(int i=0; i 
            criteria.add((Criterion) criterions.get(i));    
        }    
    }    
        
    
return criteria;    
}   

另外,没有用OpenSessionInViewFilter,struts与spring的整合:DelegatingRequestProcessor、action path与bean name同名。

 

翻页不过10次,服务器就没响应了,最后出现上面的错误的了。

刚用weblogic,也刚用ssh套餐。郁闷。

前天解决了。

问题解决,问题的原因是数据库连接耗尽,我用HiberanteDaoSupport的getSession()方法取得Session后没有释放Session。

出问题的代码处(红色部分):

public Criteria createCriteria(Class entityClass, List criterions) {        
    Criteria criteria 
= getSession().createCriteria(entityClass);        
    
if(criterions != null) {        
        
for(int i=0; i     
            criteria.add((Criterion) criterions.get(i));        
        }        
    }        
            
    
return criteria;        
}   

用完Session释放后就没事了,调用HiberanteDaoSupport的releaseSession(session);方法后即可解决。


现在正确的代码:


public Page listByPage(Class entityClass, int pageNo, int pageSize, List criterions, List orders) {    
    Session session 
= getSession();    
    
//创建criteria    
    Criteria criteria = session.createCriteria(entityClass);    
    
//为criteria添加criterions    
    createCriteria(entityClass, criteria, criterions);    
    CriteriaImpl impl 
= (CriteriaImpl) criteria;    
   
    
// 先把Projection和OrderBy条件取出来,清空两者来执行Count操作    
    Projection projection = impl.getProjection();    
    
//获取总记录数    
    int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();    
   
        
    
if(totalCount < 1) {    
        
return new Page();    
    }    
        
    
//加排序    
    if(orders != null) {    
        
for(int i=0; i 
            criteria.addOrder((Order) orders.get(i));    
        }    
    }    
    
//原来的投影    
    criteria.setProjection(projection);    
    
int startIndex = Page.getStartOfPage(pageNo, pageSize);    
    
//取得结果    
    List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();    
    
//释放hiberante资源,一定要释放,要不然就数据库连接耗尽.    
    releaseSession(session);    
    
return new Page(startIndex, totalCount, pageSize, list);    
}    
   
public Criteria createCriteria(Class entityClass, Criteria criteria, List criterions) {    
    
if(criterions != null) {    
        
for(int i=0; i 
            criteria.add((Criterion) criterions.get(i));    
        }    
    }    
        
    
return criteria;    
}   


^_^
posted on 2007-10-06 21:10 流浪汗 阅读(5755) 评论(4)  编辑  收藏 所属分类: JAVA/J2EE

评论:
# re: weblogic 8.1.4服务器挂起,出现StuckThreadMaxTime错误 2009-03-16 13:47 | xukai_286
既然用了ssh,为何不用spring的申明式事务控制,而把这些事务控制加入到代码中,看着也心烦。  回复  更多评论
  
# re: weblogic 8.1.4服务器挂起,出现StuckThreadMaxTime错误 2009-04-17 09:36 | zhang3
谢谢,正需要呢  回复  更多评论
  
# re: weblogic 8.1.4服务器挂起,出现StuckThreadMaxTime错误 2009-05-13 15:33 | 365
用UFO就不会出现这类现象,www.gm365.com上发布的:
∵ 最新公告
(2009年5月11日)
  [UFO下载]:UFO 1.10版发布(点此下载)。1.10版纠正1.00版中对新建的Context需要手工创建WORK目录的问题和https状态下的几个Bug。 1.00版提供全新的examples demo,对中文乱码问题的解决给出足够的示例,可以配置多个数据库连接池,动态检查装载servlet,提供详细的Howto文档(阅读此Howto文档)。UFO自0.975版以来已很稳定地运行(作为gm365网站的web server),不会出现一个字节的内存泄漏和一个线程的不能回收。 UFO:一个支持Jsp、Servlet、静态网页、虚拟主机、数据库连接池、http、https、无线互联网mimeType标准、认证和Tag库的Web Server。

使用UFO做Web Server的好处是网站能做得很稳定,永远也不会自己down掉;UFO在托管机房丢包率很高、遭受Hacker攻击、互联网 骨干网被黑等恶劣的环境条件下仍然能很好地运行;UFO在对付Hacker方面(防Hacker弄down和Hacker抓取不该访问的资源)也有足 够措施。
另外,UFO几乎不会进行垃圾回收,消耗CPU很少,在普通的PC Server上用UFO运行网站,平时CPU占用率<0.1%,最多时也不会超 过5%。您知道,JVM的垃圾回收会导致大量的运算,消耗很多CPU,从而导致Server的负载能力和响应速度下降。UFO在对象管理方面采 用了很好的机制和算法,做得很出色。用UFO运行网站,可以一直保证高负载能力,快速的响应速度和低CPU消耗。
  回复  更多评论
  
# re: weblogic 8.1.4服务器挂起,出现StuckThreadMaxTime错误 2010-12-11 14:02 | 天蓝色
@365
配置期间超过了 WebLogic Server StuckThreadMaxTime 值
如果正在使用配置程序配置 WebLogic Server 9.2 MP2 或 10,并且完成配置花费的时间超过 600 秒,则会将以下错误返回到终端、WebLogic Server 域和服务器日志:

<Error> <WebLogicServer> <BEA-000337> <[STUCK] Exe
cuteThread: '5' for queue: 'weblogic.kernel.Default (self-tuning)' has been busy
for "681" seconds working on the request "Http Request: /opensso/setup/setSetup
Progress", which is more than the configured time (StuckThreadMaxTime) of "600"
seconds. Stack trace: ... 产生此错误是由于 WebLogic Server 超过了其“阻塞线程最长时间:”的默认值:600 秒。

解决方法。如果配置程序没有响应,则重新启动。同时,考虑将 WebLogic Server 的“阻塞线程最长时间”的值从默认的 600 秒更改为更大的值,例如 1200 秒。使用 WebLogic 控制台更改该值(base_domain >“环境”>“服务器”>“管理服务器”>“配置/调节”)。

  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: