ResultSet对象已关闭 - jtds

时间:2011-11-10 15:38:04

标签: java sql-server-2005 jdbc c3p0 jtds

我正在使用JTDS连接到MS-SQL 2005.我使用c3p0作为数据库连接池,使用Spring配置。

我在Groovy脚本中随机获取了一个SQLException:Invalid state, the ResultSet object is closed,其中我已经传递了对连接池的引用。脚本每隔一段时间就由一个计时器执行。通过随机,我的意思是该脚本在99%的时间内完美运行,但是当它失败时,它将会这样做几次,然后再次正常工作,从它停止的地方开始。所有关键工作都在一个事务中完成,从而消除了一个Message Queue。

以下逻辑:

    //passed into the groovy context
    DataSource source = source;
    Connection conn = source.getConnection();

    ...
    //Have to omit proprietary DB stuff... sorry...
    PreparedStatement fooStatement = conn.prepareStatement("INSERT INTO foo (x,y,z) VALUES (?,?,?) select SCOPE_IDENTITY();");        
    ResultSet identRes = fooStatement.executeQuery();

    //This is where the execption is thrown.
    identRes.next();

    ...

    try{
         log.info("Returning SQL connection.");
         conn.close();
    }catch(Exception ex){}

有一个单独的计时器线程运行类似的groovy脚本,我们还没有看到这个问题。该脚本使用类似的调用来获取连接,然后关闭它。

最初,我们认为第二个脚本可能已经从池中获取相同的连接,先完成,然后关闭连接。但是c3p0的文档说调用conn.close()应该只是将它返回池中。

有没有人看过这个,或者我在这里错过了什么?

感谢。

1 个答案:

答案 0 :(得分:2)

我们解决了这个问题...... C3P0配置为丢弃超过30秒检出的连接,我们这样做是为了防止数据库死锁(我们不控制调优)。其中一个事务花了很长时间才完成,而C3P0正在丢弃连接,导致ResultSet Closed错误。然而,令人惊讶的是,C3P0没有记录事件,因此我们在应用程序的日志中没有看到这一点。