我正在使用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()
应该只是将它返回池中。
有没有人看过这个,或者我在这里错过了什么?
感谢。
答案 0 :(得分:2)
我们解决了这个问题...... C3P0配置为丢弃超过30秒检出的连接,我们这样做是为了防止数据库死锁(我们不控制调优)。其中一个事务花了很长时间才完成,而C3P0正在丢弃连接,导致ResultSet Closed错误。然而,令人惊讶的是,C3P0没有记录事件,因此我们在应用程序的日志中没有看到这一点。