java - 结果集对象已关闭 - jtds

标签 java sql-server-2005 jdbc c3p0 jtds

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

我在 Groovy 脚本中随机收到 SQLException:无效状态,ResultSet 对象已关闭,在该脚本中我传递了对连接池的引用。该脚本由计时器每隔一段时间执行一次。我所说的随机,是指该脚本在 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() 应该只是将其返回到池中。

还有其他人看过这个吗?还是我错过了一些大事?

谢谢。

最佳答案

我们解决了这个问题...C3P0 配置为删除 check out 时间超过 30 秒的连接,我们这样做是为了防止数据库中出现死锁(我们不控制调整)。其中一项事务需要非常长的时间才能完成,并且 C3P0 正在断开连接,从而导致 ResultSet Closed 错误。然而,令人惊讶的是,C3P0 没有记录该事件,因此我们没有在应用程序的日志中看到这一点。

关于java - 结果集对象已关闭 - jtds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8082094/

相关文章:

sql - MS SQL Server 优化器和不同的表和字段别名

java - 无论连接 URL 为何,DriverManager 总是返回我的自定义驱动程序

java - 代码抛出 SEVERE : No value specified for parameter 1 excetion

java - 为了节省内存并在java中快速运行,我应该使用哪种方式

c# - 将 Selenium 用于 Java 与 .NET 应用程序的优点/缺点是什么?

java - 如何在应用服务器上部署简单的JMS应用程序?

spring - 在 JDBC 中启用 PostgreSQL 扩展

java - Spring数据CrudRepository和悲观锁

sql-server - 在插入存储过程之前检查是否存在

c# - Sql server 2005 Express Edition中的数据抓取技巧