Old*_*eon 12 java connection connection-pooling jdbc
我们有一个Web服务器处理来自客户端的请求.此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;
}
Run Code Online (Sandbox Code Playgroud)
可悲的是,这有时会返回这种陈旧的连接,我会得到各种错误之一.其中一个看起来像:
java.sql.SQLException:Io异常:软件导致连接中止:套接字写入错误
请注意,这只是记录的错误之一,这个错误在大约72小时空闲后发生.
我正在寻找的是一个连接的最小数据库通用测试器,它应该始终如一地告知连接是否已启动,运行和稳定.这可能吗?
我不介意针对它运行一个非常小的查询,但它必须是数据库不可知的并且几乎没有时间/资源.
BTW:我在Java 5下运行,所以Connection.isValid对我来说不是解决方案.
添加
对于那些你以后访问这个问题的人 - 我最终接受了提供的建议,并转移到一个真正的连接池,不仅是非常容易做到,但我的所有问题都消失了.
唯一奇怪的部分是认识到,使用连接池时,您必须close完成连接 - 池拦截关闭并将其返回到幕后的池中.
duf*_*ymo 13
最好的办法是做一个简单的SQL语句像SELECT 1或SELECT 1 FROM DUAL甲骨文.(请参阅您的数据库以获取特定于供应商的语法.)
如果失败,请刷新连接.这就是像WebLogic这样的Java EE应用服务器在配置它们时如何测试它们.
Evg*_*eev 10
尝试
java.sql.Connection.isValid(int timeout)
Run Code Online (Sandbox Code Playgroud)
如果连接尚未关闭且仍然有效,则返回true.
每个数据库都有一个不依赖于现有表的查询。对于 Oracle,请尝试
select 1 from dual
Run Code Online (Sandbox Code Playgroud)
对于许多其他数据库(MySQL、H2),请尝试
select 1
Run Code Online (Sandbox Code Playgroud)
DB2 有它自己独特的语法:
values 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20234 次 |
| 最近记录: |