首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ResultSet对象是关闭的- jtds

问ResultSet对象是关闭的- jtds
EN

Stack Overflow用户
提问于 2011-11-10 23:38:04
回答 1查看 2K关注 0票数 0

我正在使用JTDS连接到MS-SQL2005。我使用c3p0作为DB连接池,并配置了Spring。

我在一个SQLException脚本中随机获得了一个Groovy:Invalid state, the ResultSet object is closed,在这个脚本中我传递了一个对连接池的引用。脚本每隔一段时间就会由计时器执行。所谓随机,我的意思是,脚本在99%的时间里都能正常工作,但当它失败时,它会这样做几次,然后再次正常工作,从它停止的地方继续工作。所有关键工作都是在一个事务中完成的,从一个消息队列中拉出。

逻辑如下:

代码语言:javascript
复制
    //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()应该简单地将其返回到池中。

有没有其他人看过这个,或者我错过了什么重要的东西?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-15 05:24:54

我们解决了这个问题。C3P0被配置为删除签出时间超过30秒的连接,我们这样做是为了防止数据库中出现死锁(我们无法控制调整)。其中一个事务花费了非常长的时间才能完成,而C3P0正在丢弃连接,从而导致了ResultSet关闭错误。然而,令人惊讶的是,C3P0没有记录事件,所以我们在应用程序的日志中没有看到这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8082094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档