Java JDBC连接意外变为空
我与JDBC(DB2)的数据库连接有问题。我最近在一个代码块上实现了事务管理(commit/rollback),并且对数据库上的所有查询/操作使用相同的连接。我们从不明确关闭每个查询/操作之间的连接。然而,在运行时,我们得到一个异常,表明我们的连接无效(closed/null)。当我一步一步地调试时,连接字段似乎意外地变为null。它看起来是随机的,而且不会发生在同一条线上。我确信我们自己不会关闭连接!我们在Tomcat中使用一个连接池 下面是一个代码示例:Java JDBC连接意外变为空,java,tomcat,jdbc,db2,connection-pooling,Java,Tomcat,Jdbc,Db2,Connection Pooling,我与JDBC(DB2)的数据库连接有问题。我最近在一个代码块上实现了事务管理(commit/rollback),并且对数据库上的所有查询/操作使用相同的连接。我们从不明确关闭每个查询/操作之间的连接。然而,在运行时,我们得到一个异常,表明我们的连接无效(closed/null)。当我一步一步地调试时,连接字段似乎意外地变为null。它看起来是随机的,而且不会发生在同一条线上。我确信我们自己不会关闭连接!我们在Tomcat中使用一个连接池 下面是一个代码示例: try { connecti
try {
connection = DB.getConnection();
connection.setAutoCommit(false);
savepoint = connection.setSavepoint("avantModif");
/* * Here are some queries and operations that runs without error
when the connection is not null */
connection.commit();
}
catch(Exception e) {
if (connection != null && !connection.isClosed() && savepoint != null)
{
connection.rollback(savepoint);
}
throw e;
}
finally
{
if(connection != null){
connection.close();
}
以下是显示连接对象内容的调试器屏幕截图:
以下是Tomcat的server.xml中的连接池定义:
<Resource
name="jdbc/dbcpGlobal"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.ibm.as400.access.AS400JDBCDriver"
url="jdbc:as400://lvq400/apilib;naming=system;errors=full;date format=iso;prompt=false;trace=false;reconnect=true"
username="[here_is_our_username]" password="[here_is_our_password]"
maxIdle="7" maxActive="15" maxWait="5"
removeAbandoned="true" removeAbandonedTimeout="120" logAbandoned="true"
testOnBorrow="true" testOnReturn="true" validationQuery="select 1 from sysibm/sysdummy1" />
对象不是真的空,它的内容变成空
JDBC连接内容变为空有什么原因吗?我很确定您实际上应该关闭连接。因为您得到的是一个代理对象,“关闭”它只会将其返回到池中。我猜Tomcat在某个时候开始破坏你的连接,因为它们看起来被抛弃了。发生这种情况时,日志中是否有任何内容,因为您已经放弃了logretained=“true” “连接对象内容”到底是什么意思?如果您提供一个堆栈跟踪和一些示例代码,那么帮助您就容易多了……现在您有了更多的细节!好的,谢谢。现在,
DB.getConnection()
做什么?您是否在多个线程中使用相同的连接?它从tomcat连接池返回一个连接。我在帖子中添加了连接池定义(在Tomcat的server.xml中)。该连接不与其他线程共享。谢谢你的关注!在调试器中单步执行代码需要多长时间?如果超过120秒,也许这就是问题所在。。。连接池认为它已被放弃,并将其关闭。感谢您的回复。我们确保在Tomcat日志中记录了所有异常,并且在尝试执行sql查询时,我们可以看到的唯一异常类似于“错误:连接已关闭”。当我们停止在连接对象上使用事务(提交、回滚)时,问题就消失了。我们设法在抛出任何异常时手动回滚。问题解决了,但我仍然不知道是什么原因造成的!