JDBC连接意外地变为空

时间:2014-03-05 14:55:31

标签: java tomcat jdbc db2 connection-pooling

我遇到与JDBC(DB2)的数据库连接问题。我最近在代码块上实现了事务管理(提交/回滚),并且我对数据库上的所有查询/操作使用相同的连接。我们从不显式关闭每个查询/操作之间的连接。但是,在运行时,我们得到一个异常,表明我们的连接无效(closed / null)。当我逐步调试时,似乎连接字段意外地变为空。它看起来是随机的,它永远不会发生在同一条线上。我确信我们不会自己关闭连接!我们在Tomcat中使用连接池。

以下是代码示例:

 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();

} 

这是一个显示Connection对象内容的调试器屏幕截图:

enter image description here

这是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" />

该对象实际上不为null,其内容为空!

有没有理由让JDBC连接内容变为空?

1 个答案:

答案 0 :(得分:0)

我很确定你真的应该关闭连接。因为你得到的是一个代理对象,“关闭”它只会将它返回到池中。我猜Tomcat在某些时候开始杀死你的连接,因为它们似乎被抛弃了。发生这种情况时,日志中是否有任何内容,因为您有logAbandoned =“true”?