Hibernate无法关闭Postgresql的连接

时间:2016-02-25 04:51:43

标签: hibernate postgresql connection c3p0

我正在使用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());
}

2 个答案:

答案 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的帮助。希望我的解决方案有所帮助。