是否应该关闭从休眠会话中获得的连接?

时间:2013-12-05 06:42:41

标签: java hibernate database-connection connection-pooling

我是否需要手动关闭从休眠会话中获取的连接?

如果我这样做,我将关闭连接池中的一个连接吗?

如果不这样,休眠会自动关闭连接吗?

            Connection con = null;
            PreparedStatement ps = null;
            ResultSet rs = null;

            String query = "sql query";
            try {
                Session session = this.sessionFactory.getCurrentSession();
                con = session.connection();
                ps = con.prepareStatement(query);
                rs = ps.executeQuery();
                while (rs.next()) {
                    //read result set
                }
            } catch (SQLException exp) {
                log.error("Error: ", exp);
            } finally{
               if(ps != null)
                   ps.close();
               if(con != null)
                   con.close();  //Is this required?
            }

3 个答案:

答案 0 :(得分:3)

一般情况下,你不应该关闭那个连接。 hibernate会话可能仍然希望稍后在会话的生命周期中使用相同的连接对象来关闭其连接。管理该连接对象的生命周期是hibernate的工作。

例外情况是described in the javadoc,如果你打开了ConnectionReleaseMode.AFTER_STATEMENT并且JDBC提供程序支持该模式。通常情况并非如此,因为您必须处于自动提交模式才能工作。

答案 1 :(得分:1)

是的,你应该close连接。如果您使用的是连接池,则应该disconnect会话,这实际上不会关闭它,但它会将其释放回池中。

对于非连接池。在javadocs中它声明了

  

注意:在垃圾回收时,Connection对象会自动关闭。某些致命错误也会关闭Connection对象。

然而,由于它将被关闭,最好自己做。

答案 2 :(得分:1)

Hibernate应该发布JDBC连接。默认情况下,将保持JDBC连接,直到会话显式关闭或断开连接。对于应用程序服务器JTA数据源,使用after_statement在每次JDBC调用后积极地释放连接。对于非JTA连接,通常使用after_transaction在每个事务结束时释放连接是有意义的。 auto将为JTA和CMT事务策略选择after_statement,为JDBC事务策略选择after_transaction。

e.g。自动(默认)| on_close | after_transaction | AFTER_STATEMENT