java – 如何处理:通信链接失败

我们使用的是Spring 2.5.4 / Hibernate 3.2 / Websphere Application Server 6.1.0.17.我们已经在AIX机器上部署了该应用程序.第二天,当我进来时,我尝试登录应用程序.我在页面上遇到此异常:

错误500:请求处理失败;嵌套异常是org.springframework.dao.DataAccessResourceFailureException:无法执行查询;嵌套异常是org.hibernate.exception.JDBCConnectionException:无法执行查询

我查看了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中再次检查它.将发布结果更新.

更新#2:

使用dbcp-commons BasicDataSource似乎可以解决这个问题,这似乎是一个网络问题. Websphere已经汇集了连接,如果AS400端存在网络问题,它将尝试使用它具有的连接,它不知道是“陈旧”.使用带有时间间隔的validationQuery是解决此问题的一种廉价(但有效)的方法 – 但在配置下,Websphere端可能有更好的方法.但是,不妨改变那些没有被破坏的东西,所以直到失败,这可能是我们未来的解决方案.

最佳答案
啊,这就是我要说的……问题必须在连接池中解决,通过在返回之前验证连接. DBCP有validationQuery,JBoss也有类似的东西;我确信Websphere必须在其连接池中有类似的东西才能在发送之前验证连接.即使您不使用testWhileIdle,如果发现连接无效,也会创建一个新连接并由池传递给您而不是无效的连接.

转载注明原文:java – 如何处理:通信链接失败 - 代码日志