写连接池时碰到的一个问题:怎样知道连接是否还有效?

source0 2003-08-20 03:23:11
Connection接口中没有可以判断连接是否有效的方法,只有一个isClosed()方法可以判断连接是否因调用过close()方法而关闭。在碰到诸如网络暂时故障后,连接就不可用了。此时用什么方法知道连接是否还有效呢?

如果不用连接池,这个问题倒是挺简单,捕获异常就知道了。但是用连接池以后,连接池在给出连接时,无法知道该连接是不是有效的。等到执行Connection.createStatement()方法(DB2下)甚至是在进行查询的时候(MS SQLServer2000下)才能知道连接已经无效了,此时再回过头来告诉连接池连接已经无效,需要重新连接等等,显然已经晚了。必须在连接池给出连接前判断连接是否还有效,以决定是重建连接还是告知用户发生了错误。

因为各种数据库在连接无效时,抛出异常的位置都不相同(例如,DB2是在Connection.createStatement()方法时抛出,而MS SQLServer2000需要在执行SQL语句的时候才知道),而且抛出的异常也不同(MS SQLServer2000抛出一个java.sql.SQLException异常,而DB2抛出一个COM.ibm.db2.jdbc.DB2Exception异常),所以,想找到一个在各种数据库下都能够正常工作的检测连接是否有效的方法似乎比较困难。

本来想到一个办法,就是在连接池内给出连接前,先执行一条所有数据库中都能运行的并且几乎不会消耗数据库执行时间的SQL语句,捕获执行过程中抛出的异常,这样就可以知道连接是否还有效。但是,一来不知道这么做会不会大量增加连接池运行时的开销(执行一条SQL语句前后要做不少事情),二来也还没有找到符合条件的SQL语句。所以,这个办法看来行不通。

还有一个比较笨的办法,就是实现Connection和Statement接口,覆写相关方法,然后再……大家都知道,此乃下下之策,不提也罢。

那位大虾有办法解决这个问题呢?
...全文
363 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruolink 2003-08-26
  • 打赏
  • 举报
回复
如果你用weblogic的链接池,可以设定扫描时间来清理长时间不用的连接,这部分连接往往因为异常而被抛弃的。
lijunisbug 2003-08-26
  • 打赏
  • 举报
回复
你用的什么连接池?

我自己写的一个就解决了这个问题的
pweb@yiii.net
source0 2003-08-25
  • 打赏
  • 举报
回复
这个问题真的很难吗?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧