我们有一个spring,它在启动时从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异常。它在使用Postgresql 8.4.2时运行良好,没有任何异常,但在使用Postgresql 8.4.8时,大多数情况下(并不总是)抛出异常。
我们在运行windows 7或2008服务器的4台不同的计算机上测试了它,Tomcat 6.0.32,最新版本的java 1.6,所有数据库服务器都运行在同一台机器上。结果集包含大约8000行(两列;字符变化(200)和字符变化(1000))。这里有什么问题吗?
顺便说一句,我们更改了代码,以便在第一次使用消息而不是启动应用程序时加载它们,它运行良好。因此,只有在启动时使用init-方法调用代码时才会引发此异常。
提前感谢
发布于 2011-08-04 02:02:05
我最初的想法是,在Spring容器bean被完全初始化之前,您可能正在使用它。这有时会导致不一致的行为(当发生配置更改或库更改时,事情可能不会按照相同的顺序初始化)。最后一段还指出了依赖性初始化问题。
Spring使用参考线来决定应该先初始化哪些bean。但是,如果init方法访问容器bean (而不是使用注入bean),Spring不知道这一点,您可能正在访问已构造但尚未初始化的bean。缓存器和静态初始化器似乎是这种悲伤的典型候选者。
对于我来说,您将缓存构建活动转移到Spring容器构建之后的解决方案似乎是一个很好的解决方案。如果这是一个依赖项初始化问题,并且您可以猜测哪个bean不完整(例如连接池),则可以在bean配置中使用“依赖-on”来强制首先对另一个bean进行初始化。
如果这是一个初始化问题,那么当您得到“结果集关闭”异常时,它总是处于while(resultSet.next())语句的第一次命中,您的缓存中将没有任何异常。要么事情没有被正确地初始化并且它立即失败,要么事情正确地初始化并填充您的缓存。如果缓存被部分填充,结果集错误在读取结果集的过程中发生,那么整个初始化理论就不再有意义了。
https://stackoverflow.com/questions/6881992
复制相似问题