首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >关闭池中的JDBC连接

关闭池中的JDBC连接
EN

Stack Overflow用户
提问于 2011-02-09 05:13:17
回答 3查看 98.1K关注 0票数 115

我们使用JDBC的标准代码部分是...

代码语言:javascript
复制
Connection conn = getConnection(...);
Statement  stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                ResultSet.CONCUR_READ_ONLY);
ResultSet  rset = stmt.executeQuery (sqlQuery);

// do stuff with rset

rset.close(); stmt.close(); conn.close();

问题1:使用连接池时,应该在连接结束时关闭连接吗?如果是这样,那么池化的目的不是已经失去了吗?如果不是,DataSource如何知道连接的特定实例何时被释放并可以重用?在这一点上我有点困惑,感谢任何人的指点。

问题2:下面的方法是否接近标准?看起来像是试图从池中获取连接,如果无法建立DataSource,请使用老式的DriverManager。我们甚至不确定在运行时执行的是哪个部分。重复上面的问题,应该关闭来自这种方法的连接吗?

代码语言:javascript
复制
synchronized public Connection getConnection (boolean pooledConnection)
                                                        throws SQLException {
        if (pooledConnection) {
                if (ds == null) {
                        try {
                                Context envCtx = (Context)
                                        new InitialContext().lookup("java:comp/env");
                                ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
                                return ds.getConnection();
                        } catch (NamingException e) {
                                e.printStackTrace();
                }}
                return (ds == null) ? getConnection (false) : ds.getConnection();
        }
        return DriverManager.getConnection(
                "jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}

编辑:我认为我们得到了池化的连接,因为我们没有看到堆栈跟踪。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-09 05:17:18

使用连接池时,是否应该在连接结束时关闭连接?如果是这样,那么池化的目的不是已经失去了吗?如果不是,DataSource如何知道连接的特定实例何时被释放并可以重用?在这一点上我有点困惑,感谢任何人的指点。

是的,当然您也需要关闭池连接。它实际上是实际连接的包装器。它会在幕后将实际的连接释放回池。还需要由池来决定实际的连接是实际关闭还是重用于新的getConnection()调用。因此,无论您是否正在使用连接池,您都应该在获得它们的try块的finally块中以相反的顺序关闭所有的JDBC资源。在Java7中,这可以通过使用try-with-resources语句进一步简化。

下面的方法是否接近标准?看起来像是试图从池中获取连接,如果无法建立DataSource,请使用老式的DriverManager。我们甚至不确定在运行时执行的是哪个部分。重复上面的问题,应该关闭来自这种方法的连接吗?

这个例子非常可怕。在应用程序启动期间,您只需在应用程序范围的DB配置类的某个构造函数/初始化中查找/初始化DataSource一次。然后,在应用程序的剩余生命周期中,只需对一个相同的数据源调用getConnection()。不需要同步或空检查。

另请参阅:

票数 129
EN

Stack Overflow用户

发布于 2011-02-09 05:23:15

池通常返回一个包装的连接对象,其中close()方法被覆盖,通常将连接返回到池。调用close()是可以的,而且可能仍然是必需的。

close()方法可能如下所示:

代码语言:javascript
复制
public void close() throws SQLException {
  pool.returnConnection(this);
}

对于您的第二个问题,您可以添加一个记录器来显示底部块是否曾经运行过。不过,我可以想象,您只需要一种或另一种方式来配置数据库连接。我们只使用一个池来访问数据库。无论哪种方式,关闭连接对于防止泄漏都是非常重要的。

票数 23
EN

Stack Overflow用户

发布于 2018-10-11 06:37:55

实际上,连接管理的最佳方法是不将它们外包给任何地方的任何代码。

创建一个SQLExecutor类,该类是打开和关闭连接的唯一位置。

然后,整个应用程序的其余部分将语句注入到executor中,而不是从池中获取连接,然后到处管理(或管理不善)。

您可以拥有任意数量的executor实例,但任何人都不应该编写代码来代表自己打开和关闭连接。

方便的是,这还允许您从一组代码中记录所有SQL。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4938517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档