我们使用的是Spring 2.5.4 / Hibernate 3.2 / Websphere Application Server 6.1.0.17。我们已经在AIX机器上部署了该应用程序。第二天,当我进来时,我尝试登录应用程序。我在页面上看到了这个例外:
Error 500: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: could not execute query; nested exception is org.hibernate.exception.JDBCConnectionException: could not execute query
我检查了System.Out日志并查看了更多详细信息。 (使用了pastebin,因为日志格式化确实搞砸了页面布局)
导致我们异常的代码行是:
List loginList = getHibernateTemplate().find("from Login
where storeId =" + id + " and password ='" + password + "'");
我们在Spring的applicationContext.xml中连接连接。我们知道AS400上的连接有时会丢失(它们可能会在一夜之间重启系统 - 我不确定)。但是,当我们连接applicationContext中的所有内容时,我们最好不要打开新连接。
无论使用DataSource / JNDI还是JDBC
,都会出现此问题是否有人知道要添加到Spring或Hibernate的任何设置以检查连接是否过时,如果是,请删除它并创建一个新设置?或者其他任何想法来解决这个问题?如果您需要更多信息/代码,请与我们联系。
非常感谢,
克里斯
查看了Spring社区论坛上的一些帖子,我用commons-dbcp实现了我的DataSource,它有一些属性,比如'testWhileIdle'和'validationQuery'。我要让应用程序继续运行并在AM中再次检查它。将发布结果更新。
使用dbcp-commons BasicDataSource似乎可以解决这个问题,这似乎是一个网络问题。 Websphere已经汇集了连接,如果AS400端存在网络问题,它将尝试使用它具有的连接,它不知道是“陈旧”。使用带有时间间隔的validationQuery是解决此问题的一种廉价(但有效)的方法 - 但在配置下,Websphere端可能有更好的方法。但是,不妨改变那些没有破坏的东西,所以直到失败,这可能是我们未来的解决方案。
答案 0 :(得分:1)
啊,这就是我要说的......问题必须在连接池中解决,通过在返回之前验证连接。 DBCP有validationQuery,JBoss也有类似的东西;我确信Websphere必须在其连接池中有类似的东西才能在发送之前验证连接。即使您不使用testWhileIdle,如果发现连接无效,也会创建一个新的连接,而不是无效的连接池。