本帖最后由 u012403749 于 2014-08-01 15:43:52 编辑

解决方案 »

  1.   

    看看线程有没有block的。
      

  2.   

    tomcat没有error日志,那就是processRequest线程没有挂掉,那么,应该是block住了,jconsole应该会有记录哦
      

  3.   

    jconsole再哪里可以查找到线程的BLOCK信息,我在线程里看线程堵塞数的确很多,但是,并没有死锁呀!
      

  4.   

    我上面说错了,在jconsole 的线程里
    阻塞总数 和 等待总数 的确很多,是不是指这个呢?
      

  5.   

    谢谢提示,那么一般情况下SSH2项目阻塞是因为什么情况下设计不合理造成的呢?像数据连接池,SESSION都交给SPRING解决,
    名称: com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2
    状态:TIMED_WAITING 在 com.mchange.v2.async.ThreadPoolAsynchronousRunner@84bb67 上
    阻塞总数:647  等待总数: 1,367这个都是C3PO的情况造成的阻塞,我的基础DAO层
    @Override
    public List<T> listAll() {
    log.debug("listAll " + this.entityClass + " instance");
    return getSession().createQuery(
    "from " + getEntityName(entityClass) + " as model ").list();
    }
      <filter>
        <filter-name>openSessionInView</filter-name>
        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>openSessionInView</filter-name>
        <url-pattern>*.do</url-pattern>
      </filter-mapping>
    进行控制 的,怎么会造成数据库未释放呢?
      

  6.   

    spring不熟,等高人来帮忙分析一下。
      

  7.   

    不过看了一会线程我怀疑是不是我理解线程BLOCK错了,
    jconsole里的 阻塞总数 和 等待总数 的数字跟阻塞没有关系吧?
    因为我操作了一会儿程序,发现jvisualvm的Thread Dump里面"com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2" daemon prio=6 tid=0x1fd7b400 nid=0x169c in Object.wait() [0x215ef000..0x215efb94]
       java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x08b39990> (a com.mchange.v2.async.ThreadPoolAsynchronousRunner)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
    - locked <0x08b39990> (a com.mchange.v2.async.ThreadPoolAsynchronousRunner)   Locked ownable synchronizers:
    - None随便复制了一个,未发现
    java.lang.Thread.State:  BLOCK 状态的,
    还有觉的 jconsole里的 (已启动的线程总数: 64)=(  活动线程: 41) + (已完成的线程数)
    就像上面假死一样,线程数只有41个,并没有大量的线程产生!
    下面的图用jconsole 查看的线程状态这帖子好冷清呀!各位看客大侠,麻烦你们给点意见和看法,即使解决不了,我相信通过大家的讨论也能学习到很多知识的!
      

  8.   

    楼主,我觉得最大的可能是你的C3P0连接池,使用以后连接未释放。去查一查show processlist; 是不是hibernate获取到session以后,session没有clear或close?
      

  9.   

    getSession().createQuery(
                "from " + getEntityName(entityClass) + " as model ").list();这里,你应该是没有关闭session。最后就会导致这个结果。 public List findByPage(Page page) {
    Session session = getSession(true);
    Criteria cri = session.createCriteria(page.getListClass());
    List<Criterion> criterions = page.getParam();
    if(criterions != null){
    for (int i = 0; i < criterions.size(); i++) {
    cri.add(criterions.get(i));
    }
    }
    if(page.getOrder() != null){
    cri.addOrder(page.getOrder());
    }
    if(page.getStart()!=0){
    cri.setFirstResult((page.getStart()-1)*page.getLimit());
    cri.setMaxResults(page.getLimit());
    }
    List list = null;
    try{
    list = cri.list();
    }catch(Exception e){
    }
    session.clear();
    session.close();
    return list;
    }这是我程序里的公用查询的代码,用的QBC,其实类似于你那个查询,不过也得获取到session,然后查询,最后关闭session啊。
      

  10.   

    -最好把事务也交给spring管理 ,这样会自动帮你关掉session的.你确定你没有自己手动管理session,比如说你在dao层自己又打开了session,然后关闭,如果都没有的话,那么我觉得可能是这个问题。
     <filter>
        <filter-name>openSessionInView</filter-name>
        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>openSessionInView</filter-name>
        <url-pattern>*.do</url-pattern>
      </filter-mapping>我在整合hibernate4的时候发现这个配置完全没有用!至今不知道为什么,我觉得最有可能的就是这里的原因了
      

  11.   

    用spring管理数据库事务会造成数据源的死锁,无法解决,能不用spring最好还是别用。但你这个我看像tomcat的问题,换个版本或者重新安装一下。
      

  12.   

    我也看到过关于SPRING事务所造成的文章,好像是说:OpenSessionInViewFilter 也是SPRING写的云云,现在对于这样的问题暂时只能多多设置修改一下TOMCAT增加线程内存配置等等,换换版本看看,
      

  13.   

    这年头 怎么还getsession 万一有一个session忘了关闭 
      

  14.   

    我的配置已经完成SPRING管理了,从LOG4J的日志就可以看出
    Spring[  Closing Hibernate Session in OpenSessionInViewFilter]
    Hibernate [Releasing JDBC connection]
    C3PO [trace com.mchange.v2.resourcepool.BasicResourcePool][2014-08-01 15:24:41.375] [DEBUG] [http-bio-8080-exec-19] [com.opensymphony.xwork2.interceptor.I18nInterceptor:65] - intercept } 
    [2014-08-01 15:24:41.375] [DEBUG] [http-bio-8080-exec-19] [org.springframework.orm.hibernate4.support.OpenSessionInViewFilter:160] - Closing Hibernate Session in OpenSessionInViewFilter
    [2014-08-01 15:24:41.375] [DEBUG] [http-bio-8080-exec-19] [org.hibernate.engine.jdbc.internal.LogicalConnectionImpl:232] - Releasing JDBC connection
    [2014-08-01 15:24:41.375] [DEBUG] [http-bio-8080-exec-19] [com.mchange.v2.resourcepool.BasicResourcePool:1644] - trace com.mchange.v2.resourcepool.BasicResourcePool@ca8735 [managed: 2, unused: 1, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@a312c6)
    [2014-08-01 15:24:41.375] [DEBUG] [http-bio-8080-exec-19] [org.hibernate.engine.jdbc.internal.LogicalConnectionImpl:250] - Released JDBC connection
    [2014-08-01 15:24:41.375] [DEBUG] [http-bio-8080-exec-19] [org.springframework.security.web.access.ExceptionTranslationFilter:115] - Chain processed normally对于  luodaoren1984 同学,我不推荐这个种方法
    自己主动关掉SESSION会将HIBERNATE 关联映射弱化。C3P0连接池应该是释放掉的。
    1.从jconsole线程数,发现只有三个。
    2.windows的性能监控图,只有8个3.通过查看SQL SERVER 2008  查看使用连接数 (语句好多)
    SP_WHO 'sa'SELECT*FROM sys.dm_exec_sessions WHERE host_name IS NOT NULLSELECT * FROM 
    [Master].[dbo].[SYSPROCESSES] WHERE [DBID] 
    IN 
    (
      SELECT 
       [DBID]
      FROM 
       [Master].[dbo].[SYSDATABASES] 
      WHERE 
       NAME='minbao'
    )SELECT login_name,COUNT(session_id)AS session_count  
     
    FROM sys.dm_exec_sessions  
     
    GROUP BY login_name; SELECT COUNT(*) AS CONNECTIONS FROM master..sysprocesses select connectnum=count(distinct net_address)-1 from master..sysprocesses SELECT cntr_value AS User_Connections FROM master..sysperfinfo as p  
    WHERE p.object_name = 'SQLServer:General Statistics' And p.counter_name = 'User Connections' 
    里面有多条查看语句,看的结果没有多大变化。