日期:2014-05-16  浏览次数:20503 次

最近在弄数据库连接池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,并实现拦截器自定义绑定策略