关闭池中的JDBC连接

Man*_*pta 104 java mysql connection-pooling jdbc

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

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();
Run Code Online (Sandbox Code Playgroud)

问题1:使用连接池时,是否应该在结束时关闭连接?如果是这样,汇集失败的目的不是?如果没有,DataSource如何知道什么时候释放Connection的特定实例并且可以重用?我对这个有点困惑,任何指针都赞赏.

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

谢谢, - MS.

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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:我认为我们正在进行池化连接,因为我们没有看到堆栈跟踪.

Bal*_*usC 115

使用连接池时,应该在结束时关闭连接吗?如果是这样,汇集失败的目的不是?如果没有,DataSource如何知道什么时候释放Connection的特定实例并且可以重用?我对这个有点困惑,任何指针都赞赏.

是的,当然你也需要关闭池化连接.它实际上是实际连接的包装器.它将在封面下释放回到池的实际连接.这是进一步向上池来决定是否实际连接将实际上关闭或一个新的可重复使用getConnection()的呼叫.因此,无论您是否使用连接池,都应该始终在已获取它们的finally块的try块中以相反的顺序关闭所有JDBC资源.在Java 7中,可以使用try-with-resourcesstatement 进一步简化.


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

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

也可以看看:

  • @yat:你必须在与你获取/创建它们的`try`块相同的`finally`块中对所有这些块调用`close()`.这完全不管它是否是汇集连接. (2认同)

tae*_*aer 21

这些池通常会返回一个包装的Connection对象,其中覆盖close()方法,通常会将Connection返回到池中.调用close()是可以的,可能仍然需要.

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

public void close() throws SQLException {
  pool.returnConnection(this);
}
Run Code Online (Sandbox Code Playgroud)

对于第二个问题,您可以添加一个记录器来显示底部块是否运行.我想,虽然你只想要一种方式来配置数据库连接.我们只使用池来进行数据库访问.无论哪种方式,关闭连接对于防止泄漏非常重要.