2

数据库:db2,应用服务器:websphere 8

我们有更新/检索数据库中/从数据库中的值的休息服务。该服务每天最多使用两次。所以休息电话之间的时间段几乎是 24 小时。

对于每个第一个/第二个请求,它都会引发staleConnection异常。第三次重试通过。

做了以下链接中指定的所有内容。

如何处理陈旧的连接?

http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.nd.multiplatform.doc/info/ae/ae/tdat_pretestconn.html

http://www.thejavacode.com/websphere-adapters-stale-connection-problem-t34.html

但仍然出现staleConnection异常。我们使用的是 Spring JDBC,所以我没有看到使用后不关闭连接的问题。另外,我在单个请求中编写了重试逻辑,在遇到连接异常时尝试获取有效连接 3 次。

第一次遇到staleconnection异常时,服务等待三秒并重试连接,但后续重试正在抛出

ObjectClosedException: DSRA9110E: 连接已关闭。

我怀疑随后的重试是否试图打开现有的陈旧连接。如何解决这个问题?

如果我包含错误的标签,我深表歉意。

4

3 回答 3

3

#1 解决方案是:不要导致连接失效。DB2 驱动程序或服务器中没有任何东西会导致这种情况发生。99% 的陈旧连接是由具有 TCP 超时的防火墙损坏引起的。修复您的防火墙产品对使用的网络路由的超时设置。

#2解决方案是:

  • 根据您提供的链接设置预测试。确保您的 SQL 查询有效(例如SELECT current date FROM sysibm.sysdummy1
  • 在池设置中设置收获、未使用和老化超时,以在一定时间后销毁未使用的连接。(如果金额低于池的最小值,将立即建立新的)
  • 将清除策略设置为 EntirePool。但是请注意,这将意味着池中的一个连接出现 StaleConnectionException 将强制 WAS 从池中删除所有内容并创建新连接以满足最小数量要求。这可能会导致性能问题。
于 2013-03-11T20:38:53.807 回答
1

我同意答案(user918176),只是想添加另一个解决问题的简单设置,为了完整起见;将最小连接池大小设置为零。

StaleConnectionException通常发生在一段时间不活动之后(例如早上的第一个请求,午休后),在此期间某些网络设备终止底层 TCP 连接。

将最小池大小设置为零会导致所有旧连接在相当短的一段时间后被丢弃(在 之后unused timeout,默认情况下是在最后一次使用连接后 1800 秒)。因此,在不活动期之后,池中没有任何连接(否则将是陈旧的)。此解决方案导致最小的配置更改和最小的性能损失(仅在非活动期后的第一个请求等待重新初始化数据库连接,而不是获得准备使用的连接)。

于 2013-03-19T22:07:22.080 回答
0

将最小连接池调整为 0,默认为 1。

于 2016-06-21T14:46:08.963 回答