我的一段hibernate代码
VioFineDAO fineDao = new VioFineDAO();
while((temp=reader.readLine())!=null){                   //Thread.sleep(10);
String jdsbh = temp.split("[|]")[2].trim();
if(!jdsbhs.contains(jdsbh)){
VioFine fine = fineDao.findById(SecretUtil.getDESEncString(jdsbh));
if(null!=fine){
VioFine realFine = SecretUtil.DesVioFine(fine);
}
.
.
.
这段代码就是一直到数据库查数据,我看数据库的session有的时候是到达一个数目后就稳定了,有的时候一直增加。
如果把上面的Thread.sleep(10)取消注释,就正常。这是什么原因啊。getSession方法是正常的没有问题的。一个线程就一个hibernate的session

解决方案 »

  1.   

    跟Hibernate线程池的使用策略有关
    当判断一个session正在忙碌时,会启用新的session在做你的新的事务》
    如此,当线程池里面session达到一定数量后,就不会在生成,而是等待其他session使用用完后回归到线程池后在取一个空闲session做事务。
      

  2.   

    Thread.sleep(10) 会导致该线程(session)暂时停止,而新事务到来时,发现该session正在忙碌,就会启用新线程(session),所以你才会发现session会增长,到达一定数量后又不在增长了
      

  3.   

    你是没有使用多线程,但Hibernate里面使用的是多线程。你只是从他那获取session,但这个session是Hibernate提供给你的。
      

  4.   

    你find一次,哪就请求了一个会话
    hibernate会根据情况给你新开会话或者给你一个空闲会话
      

  5.   

    是不是和机器情况也有关啊,我放到服务器上运行,很正常数据库session就刚开始拿的3个,在我的机器上运行有的时候就疯长,有的时候运行也能数据库session也能稳定到一定数据,反正每循环一次sleep一下的话也能稳定
      

  6.   

    Thread.sleep(10) 会导致该线程(session)暂时停止
      

  7.   

    我的这个sleep是让程序停一下嘛,让hibernate的session从忙碌到空闲嘛,大概就是这个意思
      

  8.   

    这个策略是Hibernate自己内部管理的,你不需要控制的。