日前在弄数据库连接池Proxool

最近在弄数据库连接池Proxool

注意:

<property name="hibernate.connection.release_mode">auto</property>

 

Transaction t = session.beginTransaction(); // Obtain a new JDBC connection, start transaction

 

 

session.flush();    // Only for last transaction in conversation

t.commit();         // Also return JDBC connection

session.close();    // Only for last transaction in conversation

 

于是我又分别循环调用getSession().createQuery("from Users");getHibernateTemplate().find( "FROM Users);

 

 

 

Query query = this.getSession().createQuery(queryString.toString());

 

每刷新一次它得到了一个新连接,而不是把以前的连接重新激活使用

 

Java代码
SessionFactory sf = new Configuration().configure().buildSessionFactory();   
Session session = sf.openSession();  

 

每次openSession()获得一个session就建立了一条数据库连接,一个session其实就对应着一条连接 

        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session session = sf.openSession();

 

 

以下代码连接正常,并且不会出现连接泄漏(没有关闭session)

org.hibernate.Session s = org.trundle.db.HibernateUtils.getNewSession();
s.createQuery("from Unit").list
//没有关闭连接s.close();

以下代码出现连接泄漏,如果最大连接数是100,那么代码执行100遍后出现堵塞现象

org.hibernate.Session s = org.trundle.db.HibernateUtils.getNewSession();
s.beginTransaction();
s.createQuery("from Unit").list();

以下代码正常(关闭session)

org.hibernate.Session s = org.trundle.db.HibernateUtils.getNewSession();
s.beginTransaction();
s.createQuery("from Unit").list();
s.close();

结论

hibernate session在处理查询的时候就算没有显式的s.close()也会自动将连接放回连接池。
但是如果包含事务处理,那么如果事务没有结束或者连接不关闭,那么就出现了连接被快速消耗的情况。
本次测试环境:MYSQL 4.0.X tomcat 4.1 JDK1.4 Hibernate 3.1.3 proxool 0.8.0连接池
关于session什么时候断开jdbc的连接什么时候连着是这样的:
1.执行beginTransaction()时候连接jdbc connection
2.事务commit时候断开jdbc connection
关于长业务绘画实现一般有2种策略(我只知道)
1.利用托管对象
2.将session的context定义为managed,并实现拦截器自定义绑定策略