繁体   English   中英

播放框架:关闭JDBC连接

[英]Play framework: closing JDBC connection

是否需要在Play中手动关闭数据库连接(JDBC)! 框架(2.3.0)后的每个请求?

此处的示例仅执行DB.getConnection(),而未说明关闭连接的方法: http ://www.playframework.com/documentation/2.3.x/JavaDatabase

所以我假设对每个GET / POST请求执行一个DB.getConnection()是可以接受的,并且我不需要关闭任何东西。 sql语句呢?

conn = ds.getConnection();
stmt = conn.createStatement();
stmt.execute("SOME SQL QUERY");
stmt.close();

这可能是一个非常糟糕的假设,具体取决于您的数据库供应商。

连接是客户端和数据库服务器组件的稀缺资源。 客户端上的垃圾收集器当然可以清理Connection对象,但这不会通知服务器连接已关闭。 您很快就会用完服务器端的连接,因为它们是有限的资源。 StatementResultSet相同(服务器端的光标)。

更好的解决方案是使用JDBC连接池来分摊创建连接的成本,并在完成连接后管理关闭它们。

您还应该在finally块中关闭SQL资源,该块包含在单独的try / catch块中:

public class DatabaseUtils {

    private DatabaseUtils() {}

    // Similar for Statement and ResultSet
    public static void close(Connection c) {
        try {
            if (c != null) {
                c.close();
            }
        } catch { Exception e) {
            log.error(e);
        }
    }
}

在您的代码中:

Connection c = null;
try {
    c = ds.getConnection();    
    // Do something with the connection
} finally {
    DatabaseUtils.close(c);  // same for Statement and ResultSet
}

如果仔细阅读文档,您会发现它们确实回答了您的第一个问题:

重要的是要注意,结果连接不会在请求周期结束时自动处理。 换句话说,您有责任在代码中的某个位置调用它们的close()方法,以便可以将它们立即返回到池中。

关于SQL语句,我想您不必显式关闭它。 在Javadoc中的Connection.close()中,他们说:

立即释放此Connection对象的数据库和JDBC资源,而不是等待它们自动释放。

如果我正确理解这一点,Connection.close()也应该释放Statement资源。

Scala有一种更优雅的方式(已通过Play 2.6测试):

但是,当然,您需要在打开的连接上的某个时刻调用close(),以将其返回到连接池。 另一种方法是让Play管理为您关闭连接:

// access "default" database
db.withConnection { conn =>
  // do whatever you need with the connection
}

请参阅文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM