4

我们正在使用 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”。我将让应用程序运行并在上午再次检查它。将发布结果的更新。

更新#2:

使用 dbcp-commons BasicDataSource 似乎可以纠正这个问题,这似乎是一个网络问题。Websphere 具有池连接,如果 AS400 端出现网络问题,它会尝试使用它拥有的连接,但它不知道该连接是否“陈旧”。使用具有时间间隔的validationQuery 是解决此问题的一种廉价(但有效)的方法——但在Websphere 端,在配置下可能有更好的方法。但是,最好不要改变没有破坏的东西,所以在这失败之前,这可能是我们前进的解决方案。

4

1 回答 1

1

啊,这就是我要说的......问题必须在连接池中解决,通过在返回连接之前验证连接。DBCP有validationQuery,JBoss也有类似的;我确信 Websphere 在其连接池中必须有类似的东西来验证连接,然后再分发它们。即使您不使用 testWhileIdle,如果发现连接无效,池也会创建一个新的连接,而不是无效的连接。

于 2008-11-18T19:25:37.877 回答