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

DBCP返回关闭的连接

翟誉
2023-03-14
问题内容

我们看到的情况是,我们的数据库连接由于org.apache.commons.dbcp.BasicDataSource套接字写入错误而终止:

com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error

当然,所有随后的写入连接的尝试都会失败:

com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.

在更新代码以捕获此类异常并在发生连接时请求新连接后,该连接再次失败。我是否怀疑DataSource#getConnection()每次调用实际上都不在提供新的连接?难道不只是重用已关闭的现有连接吗?

如果我是正确的,那么丢弃旧的连接并请求新的连接的正确方法是什么?

编辑:这是我想知道的更简洁的版本:

Connection c1, c2;
c1 = DatabaseManager.getConnection();
// c1.close() not called
c2 = DatabaseManager.getConnection();

“ c1 == c2”是正确的说法吗?还是分配了两个连接?如果是后者,则将这样的代码表示“连接池泄漏”:

Connection c1;
c1 = DatabaseManager.getConnection();
// c1.close() not called
c1 = DatabaseManager.getConnection();

问题答案:

池连接已被数据库关闭。这可能意味着两件事:

  1. 连接池使连接打开时间过长。
  2. DB在过短的时间后关闭连接。

从理论上讲,增加/减少双方的超时以使其一致可以解决该问题。

在DBCP上,最好的选择是在通过testOnBorrow=truevalidationQuery设置返回之前验证连接,例如SELECT 1。您可以在Tomcat JDBC数据源文档中找到配置选项。

更新 按照您的更新:

这是我想知道的更简洁的版本:

Connection c1, c2;
c1 = DatabaseManager.getConnection();
// c1.close() not called
c2 = DatabaseManager.getConnection();

“ c1 == c2”是正确的说法吗?还是分配了两个连接?

这是两个不同的连接。仅当您致电时,c1.close()才有可能c2返回相同的连接。

如果是后者,则将这样的代码表示“连接池泄漏”:

Connection c1;
c1 = DatabaseManager.getConnection();
// c1.close() not called
c1 = DatabaseManager.getConnection();

是的,因为它永远不会返回到池中,因此肯定会泄漏第一个连接。您应该 始终 在一个try- finally块中以尽可能短的范围关闭所有数据库资源。但是,可以配置一些不错的连接池以获取废弃的连接,但是,绝对不应该将其用作“替代方法”。



 类似资料:
  • 我正在使用DBCP连接池,并创建了一个MBean来在Jconsole中显示连接池的统计信息。我观察到的是,即使应用程序上没有活动(意味着没有页面点击等),连接池统计数据也会显示活动连接。 我们在上面看到的16个虚拟连接并没有降到零。我不知道为什么?有人能解释一下吗? 谢谢

  • 使用来自DBCP的BasicDataSource,如果我们执行getConnection()并且在最后一个块中我们关闭连接,它是真的将连接返回到池还是关闭连接。我正在检查的代码片段是这样的 我正在检查BasicDataSource的源代码,并访问了这个包装类以获取连接。 委托对象的类型为java。sql。联系包装器代码调用委托的close方法,该方法将关闭集合,而不是将连接返回到池。这是DBCP的

  • 问题内容: 返回null。 我最初是在最后一次加载javascript的,以确保无需担心onload事件。我也尝试使用onload事件。这很诡异。任何想法或帮助将不胜感激。 问题答案: 原因可能是: 无效的HTML语法(某些标记未关闭或类似错误) 重复的ID-有两个具有相同ID的HTML DOM元素 也许您试图通过ID获取的元素是动态创建的(由ajax加载还是由脚本创建)? 请发布您的代码。

  • 问题内容: 看来我关闭时会自动关闭。但是我想返回并在另一种方法中使用它,所以我不知道在何处关闭and 。 我进入catch块是因为我发现,如果将它放在finally块中,我将在它返回之前立即丢失我的数据。现在当我想关闭时,我无法关闭和。有什么解决办法吗? 问题答案: 使用用于断开后持有信息

  • 当我尝试使用JDBC驱动程序4.2从JSP连接到MSSQLServer 2017 Express实例时,我得到以下错误。 com.microsoft.sqlserver.jdbc.SQLServerException:驱动程序无法通过使用安全套接字层 (SSL) 加密建立与 SQL Server 的安全连接。错误:“SQL 服务器未返回响应。连接已关闭。 请帮我解决这个问题。

  • 编辑问题以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。这将有助于其他人回答这个问题。 代码不返回值,而是返回“?”。编译时我没有遇到任何错误。请协助。 代码需要返回需要支付的剩余金额。输出代码1代码2代码3代码4