【发布时间】:2012-12-28 12:26:26
【问题描述】:
我们有一个网络服务器处理来自客户的请求。此 Web 服务器的一个组件拥有与数据库的连接。
在开始使用连接之前,我需要能够识别连接是否已关闭或以某种方式不再起作用。目前我在做类似的事情:
// Decide connection details on alias.
private String alias = null;
// I must have my own because I prepare statements.
private Connection connection = null;
public Connection getConnection() {
try {
if ( connection.isClosed() ) {
// Start afresh.
connection = null;
}
// ** More tests here to check connection is ok.
if (connection == null) {
// Make a new connection.
connection = Connections.getConnection(alias);
}
} catch (SQLException ex) {
// Cause a NPE further down the line.
connection = null;
}
return connection;
}
遗憾的是,这有时会返回如此陈旧的连接,以至于我得到了各种错误之一。一个这样的样子:
java.sql.SQLException:Io 异常:软件导致连接中止:套接字写入错误
请注意,这只是记录的错误之一,此错误发生在大约 72 小时空闲后。
我正在寻找的是一个最小的数据库通用连接测试器,它应该始终如一地判断连接是否启动、运行和稳定。这可能吗?
我不介意对它运行一个非常小的查询,但它必须与数据库无关,并且几乎不需要时间/资源。
顺便说一句:我在 Java 5 下运行,所以 Connection.isValid 不是我的解决方案。
已添加
对于那些稍后访问此问题的人 - 我最终接受了提供的建议并转移到了一个真正的连接池,这不仅非常容易做到,而且 所有 我的问题都消失了。 p>
唯一奇怪的部分是意识到使用连接池时,您必须在完成连接后close 连接 - 池拦截关闭并将其返回到幕后的池中。
【问题讨论】:
-
您对现成的连接池有什么看法,因为它们会定期验证连接?
-
@MarkoTopolnik - 什么都没有 - 因此我已经准备好附加到这些连接的声明,所以我必须自己处理它们。还是我?
-
实际上,这些池也处理准备好的语句池的问题。顺便说一句,我的选择是 boneCP。
-
是的,一个像样的游泳池应该为您处理这个问题。您的代码向我建议您决定独自完成并为自己做。
标签: java jdbc connection connection-pooling