当前位置: 首页 > 面试题库 >

Java 在池中关闭JDBC连接

胡野
2023-03-14
问题内容

我们使用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:html" target="_blank">mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}

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


问题答案:

使用连接池时,应该在最后关闭连接吗?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。

是的,当然你也需要关闭池化连接。实际上,它是实际连接的包装。它可以在幕后将实际连接释放回池中。由池进一步决定实际的连接是实际上是关闭还是重新用于新getConnection()呼叫。因此,无论是否使用连接池,都应始终以相反的顺序在获取它们finallytry块中关闭所有JDBC资源。在Java 7中,可以通过使用try-with-resourcesstatement 进一步简化此操作。

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

这个例子很可怕。你仅需要DataSource在应用程序启动期间在整个应用程序范围的数据库配置类的某些构造函数/初始化中查找/初始化一次。然后,只需getConnection()在应用程序的整个生命周期中调用一个相同的数据源即可。不需要同步也不需要nullchecks。



 类似资料:
  • 问题内容: 我们使用JDBC的标准代码部分是… 问题1:使用连接池时,是否应该在最后关闭连接?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。 问题2:以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager

  • 我正在Java中运行Apache HTTP POST请求,每当我超过1300个请求时,就会出现以下错误,我需要发出更多的请求,大约40k,我可以做些什么来纠正相同的错误?

  • 问题内容: 我有一个使用Tomcat JDBC连接池的服务器应用程序。 这是我用来创建数据源的代码: 然后我有一种方法可以从池中获得连接 每当我想执行一条语句时,我都会调用以下代码: 这是对先前代码的调用示例: 我面临的问题是,每隔X秒在线程中执行一次调用时,就会时不时地收到“语句已关闭”的异常。我不确定为什么会这样。我在想这可能是驱动程序错误或与数据库(在不同服务器上运行)的连接失败。 我没主意

  • 我有一个使用Tomcat JDBC连接池的服务器应用程序。 这是我用来创建数据源的代码:

  • 嗨,我只知道这是一个古老的问题,但今天只是好奇。正如我们所知connection.close也会关闭preared语句(如果我错了请纠正我)。但是如果我关闭连接然后关闭preared语句会怎样 我会得到一个空指针异常吗? 有人说这取决于jvm的速度。有时,ps.close()会在conn.close完成其工作之前运行并首先关闭,因此您不会得到null指针。 为了测试它,我修改了代码 但是我没有得到

  • 当我使用CloseableHttpClient和do Execute方法时,它在第一次正常工作,但之后从未成功。它将引发表示“连接池关闭”的异常 有人说是因为我还没有关闭客户端有人说是httpClient 4.3中的bug 我的项目不存在上述问题,但仍然无法正常工作