Java SpringWeb应用程序出现意外结果集关闭异常

Java SpringWeb应用程序出现意外结果集关闭异常,java,spring,jdbc,Java,Spring,Jdbc,我们有一个Springbean,它在启动时从Postgresql(8.4)数据库加载应用程序消息。 Bean定义如下: 代码非常简单: get a connection (we are using a dbcp pool) Create a statement (plain jdbc, nothing special) execute the query, get the result set while(resultSet.next())){ cacheMap.put(resultS

我们有一个Springbean,它在启动时从Postgresql(8.4)数据库加载应用程序消息。 Bean定义如下:

代码非常简单:

get a connection (we are using a dbcp pool)
Create a statement (plain jdbc, nothing special)
execute the query, get the result set
while(resultSet.next())){
    cacheMap.put(resultSet.getString("column1"), resultSet.getString("column2"));       
}
在应用程序启动时,代码有时会在while循环中抛出ResultSet is closed异常。 它在使用Postgresql 8.4.2时运行良好,没有任何异常,但在使用Postgresql 8.4.8时,大多数情况下(并非总是)都会抛出异常。
我们在4台运行Windows7或2008Server、Tomcat6.0.32、最新版本的Java1.6的不同计算机上测试了它,所有数据库服务器都在同一台机器上运行。 结果集包含大约8000行(两列;字符变化(200)和字符变化(1000))。 这里有什么问题

  • 在我们处理结果集之前,池是否可能正在关闭或重用连接
  • 或者可能与数据库版本有关
顺便说一下,我们更改了代码,以便在首次使用消息而不是应用程序启动时加载消息,并且工作正常。因此,只有在启动时使用init方法调用代码时才会引发此异常


提前感谢

我最初的想法是,在Spring容器bean完全初始化之前,您可能正在使用它。这有时会导致不一致的行为(当配置更改或库更改时,事情可能不会以相同的顺序初始化)。最后一段还指出了依赖项初始化问题

Spring使用refwirings来决定应该首先初始化哪个bean。但是,如果您的init方法访问容器bean(而不是使用注入bean),Spring不知道这一点,您可能正在访问一个已经构建但尚未初始化的bean。缓存和静态初始值设定项似乎是这种悲伤的典型候选对象

您将缓存构建活动移动到Spring容器构建之后的某个时间,这对我来说似乎是一个很好的解决方案。如果这是一个依赖项初始化问题,并且您可以猜测哪个bean不完整(比如连接池),那么您可以在bean配置中使用“dependens-on”来首先强制初始化另一个bean


如果这是一个初始化问题,那么我希望当您得到“result set closed”异常时,它总是在while(resultSet.next())语句的第一次命中时,您的缓存中将没有任何内容。要么事情没有正确初始化并且立即失败,要么事情没有正确初始化并且缓存被填充。如果缓存被部分填充,并且结果集错误在读取结果集的过程中发生,那么整个初始化理论就不再有意义了。

谢谢您的回答。我们只使用spring管理的bean。结果集关闭异常不会在第一个结果时抛出。缓存被部分填充。例如,如果我们通常有8k行,则在处理2k行左右(不是实际的数字)后会引发异常。不知怎的,结果集,我认为语句在循环过程中被关闭。文档说明,如果在同一个连接上执行另一个查询,则该语句将关闭。可能连接池正在将该连接传递给执行另一个查询的另一个线程。但这种情况对我来说没有意义。