日前在弄数据库连接池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连接池
1.执行beginTransaction()时候连接jdbc connection
2.事务commit时候断开jdbc connection
关于长业务绘画实现一般有2种策略(我只知道)
1.利用托管对象
2.将session的context定义为managed,并实现拦截器自定义绑定策略