我正在使用heroku远程PostgreSQL数据库,在我的应用程序中,我也使用hibernate和c3p0。已设置最大连接,并在使用后关闭连接,但所有这些都无法关闭数据库中的空闲连接。我的代码中的错误?因为如果我只更改url并连接到本地MySQL,它就可以工作。所以我认为PostgreSQL很特别。或者是因为heroku远程数据库限制?
hibernate.cfg.xml是这样的。我改变它以适应本地mysql,它确实关闭连接。
<session-factory>
<!-- hibernate connection configuration -->
<property name="connection.url">jdbc:mysql://localhost/website</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- hibernate performance configuration -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
<property name="show_sql">true</property>
<!-- c3p0 configuration -->
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.idle_test_period">10</property>
<property name="c3p0.max_statements">3</property>
<property name="c3p0.max_size">2</property>
<property name="c3p0.min_size">1</property>
<property name="c3p0.timeout">90</property>
<property name="transaction.auto_close_session">true</property>
<property name="idleConnectionTestPeriod">60</property>
<property name="maxIdleTime">30</property>
<!-- presistance objects -->
<mapping class="pojo.WebSiteCommentPOJO"/>
</session-factory>
HibernateUtil是这样的:
public class HibernateUtils {
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
if (sessionFactory != null) {
return sessionFactory;
}
Configuration conf = new Configuration().configure();
StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();
serviceRegistryBuilder.applySettings(conf.getProperties());
/*ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();*/
SessionFactory sf = conf.buildSessionFactory();
return sf;
}
public static Session getSession() {
return getSessionFactory().openSession();
}
}
以下代码是我如何使用hibernate。
public WebSiteComment getSingle(int id) {
Session ss = HibernateUtils.getSession();
ss.beginTransaction();
WebSiteCommentPOJO w = ss.get(WebSiteCommentPOJO.class,id);
ss.getTransaction().commit();
return new WebSiteComment(w.getId(), w.getComment(), w.getEmail(), w.getDate());
}
答案 0 :(得分:1)
您需要关闭session
才能关闭连接。当事务提交时,会话和连接未关闭,因为您可以开始新事务或对会话执行其他操作。可能,MySQL有大量可以打开的连接。当然,Heroku的连接数量有限。
使用finally
块以任何方式关闭session
。您可以使用this模式处理会话。
只需执行此操作即可配置会话工厂
SessionFactory sf = new Configuration().configure().buildSessionFactory();
如果出现错误,您需要回滚事务。
<强>更新强>
由于使用
,我的回答可能不太正确 <property name="transaction.auto_close_session">true</property>
答案 1 :(得分:0)
最后我修正了错误。我从here找到了一个标准HibernateUtil.java
。现在我的代码是这样的。
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
关键区别可能是final
的{{1}};但我认为在我以前的版本中,在初始化之后,我仍然返回相同的sessionFactory对象。
此外,我使用一些不同的方法来获取sessionFactory
。
花2天时间,感谢v.ladynev的帮助。希望我的解决方案有所帮助。