在池中关闭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();

问题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);

}

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


慕盖茨4494581
浏览 496回答 3
3回答

慕桂英546537

使用连接池时,应该最后关闭连接吗?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。是的,当然您也需要关闭池化连接。实际上,它是围绕实际连接的包装。它会在幕后将实际连接释放回池中。由池进一步决定实际的连接是实际上是关闭还是重新用于新getConnection()呼叫。因此,无论是否使用连接池,都应始终以相反的顺序在获取它们finally的try块中关闭所有JDBC资源。在Java 7中,可以通过使用try-with-resourcesstatement 进一步简化此操作。以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager。我们甚至不确定哪个部分在运行时执行。重复以上问题,是否应该关闭这种方法产生的连接?这个例子很吓人。您只需要DataSource在应用程序启动期间在整个应用程序级数据库配置类的某些构造函数/初始化中查找/初始化一次。然后,只需getConnection()在应用程序的整个生命周期中调用一个相同的数据源即可。不需要同步也不需要nullcheck。

梵蒂冈之花

池通常返回包装的Connection对象,在该对象中将覆盖close()方法,通常将Connection返回到池。调用close()可以,并且可能仍然需要。close()方法可能如下所示:public void close() throws SQLException {  pool.returnConnection(this);}对于第二个问题,您可以添加一个记录器以显示底部是否运行过。我可以想象,尽管您只希望一种或另一种方式来配置数据库连接。我们仅将池用于数据库访问。无论哪种方式,关闭连接对于防止泄漏都是非常重要的。

冉冉说

实际上,连接管理的最佳方法是不要将它们植入任何地方的任何代码中。创建一个SQLExecutor类,该类是打开和关闭连接的唯一位置。然后,应用程序的其余部分将语句泵送到执行程序中,而不是从池中获取连接并在各处进行管理(或管理不当)。您可以根据需要拥有任意数量的执行程序实例,但是没有人可以编写自己代表打开和关闭连接的代码。方便地,这还使您可以从一组代码中记录所有SQL。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
MySQL