• 不要使用Hibernate自带的连接池

    2004-03-03

    Hibernate自带的连接池有比较严重的问题,如果没有使用事务,或者使用了事务但是没有提交(回滚),那么它会经常得不到新增加的数据,建议使用DBCP或其它的连接池.

    例如,下面的代码,如果在新增加了数据或修改后,它不会马上得到新的数据,惟一的方法就是把注释去掉,在多数据情况下它会得到新的数据。

    HibernateBase hb = new HibernateBase();
      try {
       //hb.begin();
       List list = hb.listQuery("select company from Company company",null);
       Iterator ir = list.iterator();
       while(ir.hasNext()){
        Company c = (Company)ir.next();
        System.out.println("compnay name:"+c.getName());
        
       }
       //hb.commit();或//hb.rollback();
      }
      catch (PersistentException e) {   
       e.printStackTrace();
       throw e;
      }
      finally{
       hb.release();
      }

    这个问题可能是由于Hibernate自带连接池的实现问题,具体情况有待于以后证实。其实这个连接池在实际项目中使用的并不多,但是在开发、测试的时候有较多的使用,所以如果在测试时发现这种问题,更换连接池试试:)

     

     

     


    收藏到:Del.icio.us




    评论

  • 这也算是问题啊,我都不想自动commit
  • 不错不错啊,我在开发中总是遇到 hibernate中添加完数据,数据库中存在了但是查询不到,还有删除后的数据数据库中不存在了还可以被查询出来,刷新后又变没有了,在刷新又出来了。今天因为要上线了产品 所以换了c3p0,无意看到你这样写,真好啊,以前我搜索这个问题都搜索不到呢,谢谢哥们了啊。没事发发邮件咱们
  • 若未设置边境池,Hibernate就使用其自代的连接池,也就是类DriverManagerConnectionProvider,从其代码中可以看出从中取出的连接,其autoCommit都是false, 也就是说, 必须在事务中使用,否则肯定是不能保存到数据库的,也就会出现你所说的严重问题. 其实在代码中有下面的log: "Using Hibernate built-in connection pool (not for production use!)", 可见Hibernate的内建连接池只是用于测试环境的.
    agilejava回复jxb8901说:
    确实如此,它使用了自己的连接池,而且我看了它的连接池的实现,在调用close的时间,它没有把相关connection的状态重设,而DBCP的实现就完成了此工作,因此在事务的隔离级高的时候的,没有连接池中有的connection无法取得新插入的数据,而在访问量大的时候会新打开一些connection,这样就出了有的connection可以得到最新数据,而有的却不能。
    2004-04-03 14:55:44

发表评论

您将收到博主的回复邮件
记住我