我正在使用JTDS连接到MS-SQL2005。我使用c3p0作为DB连接池,并配置了Spring。
我在一个SQLException脚本中随机获得了一个Groovy:Invalid state, the ResultSet object is closed,在这个脚本中我传递了一个对连接池的引用。脚本每隔一段时间就会由计时器执行。所谓随机,我的意思是,脚本在99%的时间里都能正常工作,但当它失败时,它会这样做几次,然后再次正常工作,从它停止的地方继续工作。所有关键工作都是在一个事务中完成的,从一个消息队列中拉出。
逻辑如下:
//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()应该简单地将其返回到池中。
有没有其他人看过这个,或者我错过了什么重要的东西?
谢谢。
发布于 2011-11-15 05:24:54
我们解决了这个问题。C3P0被配置为删除签出时间超过30秒的连接,我们这样做是为了防止数据库中出现死锁(我们无法控制调整)。其中一个事务花费了非常长的时间才能完成,而C3P0正在丢弃连接,从而导致了ResultSet关闭错误。然而,令人惊讶的是,C3P0没有记录事件,所以我们在应用程序的日志中没有看到这一点。
https://stackoverflow.com/questions/8082094
复制相似问题