【问题标题】:Does oracles close JDBC connections sometimes?oracles 有时会关闭 JDBC 连接吗?
【发布时间】:2016-10-26 16:58:00
【问题描述】:

我正在使用 JDBC 连接到 oracle,并且我没有显式关闭 JDBC 连接,但是在运行我的应用程序几天后,我看到 SQL 语句因“java.sql.SQLException: Closed Connection”而失败。

这可能是什么原因,我确定我没有通过调用 java.sql.Connection.close() 方法来关闭它。

【问题讨论】:

  • 如果在指定时间内不使用连接,java会在超过空闲超时时间后关闭连接....如果在连接对象创建过程中不指定该参数有一个我不记得正确的默认值......因此,当超过这个时间时,连接会自动关闭
  • @Abhishek 请提供此断言的来源。
  • @Abhishek 我一直在使用该连接。我将再次检查我的代码。谢谢
  • 你在使用try-with-resources吗?还是连接池?
  • 所以你的连接池,“由你的开发者设计”是迄今为止最有可能过早关闭的嫌疑犯。而不是Java。我只能建议他们进行更多测试。更好的是,把它扔掉并使用一个已经有效的,比如 Apache DBCP。

标签: java oracle jdbc


【解决方案1】:

但在运行我的应用程序几天后

Oracle 可能会在您的应用程序和 Oracle 之间的某处空闲时间或代理后关闭连接。 保持连接活动的最佳方法是保持心跳链接。 大多数数据库都提供验证查询,即“SELECT 1”或其他内容。

如果使用池化机制,它只是一种配置。 否则你必须自己手动完成。

java.sql.Connection.isValid(timeout)

如果没有,刷新连接

【讨论】:

  • 我们之前使用了验证查询,但它导致了我们的性能问题。如果我们刷新它,我们可以使用封闭连接吗?
  • 如果服务器关闭连接,您将收到不同的错误消息。这表明连接已在客户端关闭,这使手工连接池受到质疑。
  • 我不是 100% 说是 Oracle 关闭了连接。此外,添加验证查询不应影响性能。这只是一个 PING。可能是防火墙 - zhefeng.wordpress.com/2009/06/15/…
  • 你 100% 说它不是客户端,如果它不是客户端,那将是一条不同的错误消息。在这种情况下,“服务器”包括“代理”。
猜你喜欢
  • 1970-01-01
  • 2014-04-06
  • 2017-05-24
  • 2012-11-03
  • 1970-01-01
  • 2015-06-24
  • 2012-08-28
  • 2018-09-09
  • 1970-01-01
相关资源
最近更新 更多