c3p0 中的关闭连接
closed connections in c3p0
我开始使用 Hibernate。
因为我读到我需要配置池连接,所以我开始使用 C3P0
一切正常,但是当我达到最大连接数时应用程序冻结,我必须关闭应用程序并重新启动它。
这是我在 hibernate.cfg.xml
中的 C3P0 部分
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_size">15</property>
<property name="hibernate.c3p0.timeout">3000</property>
<property name="hibernate.c3p0.max_statements">20</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
在我的函数中,当我保存对象时关闭会话。
public void Save item(Item item)throws Exception{
try{
SessionFactory sf= NewHibernateUtil.getSessionFactory();
Session session;
session = sf.openSession();
Transaction tx= session.beginTransaction();
session.save(item);
tx.commit();
session.close();
}
catch(Exception ex){
throw new Exception(ex);
}
}
如果我检查 MySql 中的连接,我发现所有连接都处于休眠状态,但应用程序冻结。
我在这里错过了什么?
您没有可靠地 close()
ing 连接(包含在会话中),因此它们会泄漏。考虑发生异常时会发生什么。
要么使用 Java 7+ try-with-resources(如果 Session 支持),要么使用旧的健壮的清理惯用语,请参阅 Appendix to my answer here。
如果您修复此问题后仍然遇到连接泄漏,c3p0 有 configuration parameters 可以帮助您追踪泄漏。
我开始使用 Hibernate。 因为我读到我需要配置池连接,所以我开始使用 C3P0
一切正常,但是当我达到最大连接数时应用程序冻结,我必须关闭应用程序并重新启动它。
这是我在 hibernate.cfg.xml
中的 C3P0 部分<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_size">15</property>
<property name="hibernate.c3p0.timeout">3000</property>
<property name="hibernate.c3p0.max_statements">20</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
在我的函数中,当我保存对象时关闭会话。
public void Save item(Item item)throws Exception{
try{
SessionFactory sf= NewHibernateUtil.getSessionFactory();
Session session;
session = sf.openSession();
Transaction tx= session.beginTransaction();
session.save(item);
tx.commit();
session.close();
}
catch(Exception ex){
throw new Exception(ex);
}
}
如果我检查 MySql 中的连接,我发现所有连接都处于休眠状态,但应用程序冻结。
我在这里错过了什么?
您没有可靠地 close()
ing 连接(包含在会话中),因此它们会泄漏。考虑发生异常时会发生什么。
要么使用 Java 7+ try-with-resources(如果 Session 支持),要么使用旧的健壮的清理惯用语,请参阅 Appendix to my answer here。
如果您修复此问题后仍然遇到连接泄漏,c3p0 有 configuration parameters 可以帮助您追踪泄漏。