gpt4 book ai didi

java - Spring Web 应用程序中意外的结果集已关闭异常

转载 作者:行者123 更新时间:2023-12-01 05:42:05 25 4
gpt4 key购买 nike

我们有一个 spring bean,它在启动时从 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 close 异常。使用 Postgresql 8.4.2 时它工作正常,没有任何异常,但在使用 Postgresql 8.4.8 时大多数时候(并非总是)会抛出异常。
我们在4台不同的计算机上进行了测试,运行Windows 7或2008服务器,Tomcat 6.0.32,最新版本的java 1.6,所有数据库服务器都运行在同一台计算机上。结果集包含大约 8000 行(两列;charactervarying(200) 和charactervarying(1000))。这里可能出了什么问题?

  • 在我们处理完结果集之前,池是否可能正在关闭连接或重用它?
  • 或者可能与数据库版本有关?

顺便说一句,我们更改了代码以在第一次使用消息而不是应用程序启动时加载消息,并且运行良好。因此,只有在启动时使用 init-method 调用代码时才会引发此异常。

提前致谢

最佳答案

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

Spring 使用引用连接来决定应该首先初始化哪些 bean。但是,如果您的 init 方法访问容器 bean(而不是使用注入(inject)的 bean),Spring 并不知道这一点,并且您可能正在访问已构造但尚未初始化的 bean。缓存和静态初始化器似乎是这种悲伤的典型候选者。

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

如果是初始化问题,那么我希望当您收到“结果集已关闭”异常时,它始终出现在 while(resultSet.next())) 语句的第一次命中,并且您将一无所有在你的缓存中。要么事情没有正确初始化并且它立即失败,或者事情确实初始化并且您的缓存填充。如果缓存已部分填充,并且在读取结果集的过程中发生结果集错误,那么整个初始化理论就不再有意义。

关于java - Spring Web 应用程序中意外的结果集已关闭异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6881992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com