【问题标题】:Does killing a session at the database server side also closes the connection and makes the jdbc connection object null?在数据库服务器端终止会话是否也会关闭连接并使 jdbc 连接对象为空?
【发布时间】:2011-05-11 12:42:21
【问题描述】:

假设有一个 jdbc 代码运行一些 CRUD 操作。现在,在特定情况下,恰好发生了行锁,并且会话阻塞了其他数据库会话。

在这种情况下,如果阻塞会话在数据库端被终止,相应的 java Connection 对象会发生什么?给出异常后该对象会变为空吗?如果稍后在代码中使用该连接对象而不进行检查,会出现什么行为?

我知道作为最佳实践,我们应该从池中获取连接并在完成后将其关闭,但是有相当多的遗留代码以其他方式编写,需要一些时间来清理。

如果上述连接是通过数据源、管理连接池而不是通过普通的 jdbc 连接创建的,答案会是什么?

【问题讨论】:

  • 这是哪个数据库服务器?并不是说它很重要,而是您使用的 JDBC 驱动程序可能更重要。
  • 数据库服务器是通过jdbc瘦驱动使用的Oracle 10g。

标签: java database jdbc connection connection-pooling


【解决方案1】:

任何正在进行的操作都会抛出一个SQLException 并且任何对Connection.isClosed() 方法的调用都将返回true。任何后续使用连接对象的尝试也会抛出 SQLException 并显示连接已关闭的错误。

这不会将您的连接对象设置为空。如果抛出异常或 Connection.isClosed() 返回 true,则除非您编写显式代码将对象设置为 null,否则什么都做不了。您必须手动执行此操作。

【讨论】:

  • Cavaet - 如果 控制您的连接池的驱动程序和/或应用程序/seb 服务器没有错误。我不止一次被抓到,尤其是在涉及 txns 时。 :(
  • 是的,测试这是个好主意。 SQL 驱动程序并非都是平等的。
  • 在这种情况下,应用服务器会做什么?它是否会定期检查它在池中的连接并用新连接替换任何有故障的连接,或者只是传递有故障的连接?
  • 你得问问应用服务器,或者通过实验找出来。应用服务器甚至可能具有调整此行为的设置。
  • 大多数应用服务器都有连接池,允许配置一堆选项,连接在关闭之前如何空闲以及如何测试连接是否仍然存在。如果您挂在连接实例上(而不是关闭它们 - 这将导致 返回 它们到池中),那么您就不走运了。要正确使用池,请在开始大量工作时建立连接,并在完成后关闭它。不幸的是,这会导致一堆样板代码,这就是 Spring 的 JdbcTemplate 存在的原因:goo.gl/fT6EU
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 2021-07-19
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
相关资源
最近更新 更多