2016-12-29 25 views
1

我在我的应用程序中运行几个月后面临一个问题: 我在WebSphere Application Server中配置了连接池,但没有最大连接数为20,最小连接数1,收获时间180秒,未使用时间1800秒,数据源(oracle)中的老化超时0秒用于我的应用程序。 从前几天我们看到一个问题,突然在早上我们开始在应用程序中获取超时,然后出现一个奇怪的行为,我们没有得到任何异常,但用于运行过程的可调用语句返回零结果,即使所有执行数据在数据库中。数据库中总会话的数量与websphere中的连接池中设置的数据库不相同

问题开始发生时,系统输出或系统错误日志中没有例外。我们能看到的例外是一个陈旧的连接异常和数据库会话杀例外

java.sql.SQLRecoverableException: ORA-00028: your session has been killed 
ORA-00028: your session has been killed 

但是这件事发生6小时应用程序超时之前。

而且在检查中没有数据库连接,我们可以看到只有9届在那里虽然我们已经配置的连接池20中使用下面的查询,以检查TOTAL_CON:

SELECT s.machine 
, s.username 
, count(decode(s.STATUS, 'ACTIVE', 1)) as active_con 
, count(decode(s.STATUS, 'INACTIVE', 1)) as inactive_con 
, count(*)        as total_con 
FROM v$session s 
WHERE type <> 'BACKGROUND' 
GROUP BY username, machine 
ORDER BY total_con DESC; 

我们做了一个WAS服务器重启并解决了这个问题,并且还将数据库中的会话数量增加到了20.

所以我有两个问题: 1.什么会导致应用程序端的ORA-00028,因为数据库团队说没有会话从他们身边被杀死。 2.数据库中的总会话数是否少于数据源中配置的最大连接数是否正常,如果不是,则会导致此问题。

+0

您已经将连接池配置为拥有最多20个连接,因此在某个点上只有9个连接并不一定看起来很奇怪。如果一个会话被杀死了,那是从服务器端发生的。如果DBA没有手动杀死一个,那么可能是资源限制导致会话被自动终止?有没有比平常少的流量,所以一些会议闲置(你没有提到保持活力),导致听众或数据库或防火墙放弃它们?是否有网络问题导致甲骨文认为客户已经死亡? –

+0

连接超时设置为180秒。我不认为这是因为资源限制发生的,因为它发生在凌晨3点左右,当时流量最小。你提到“如果一个会话被杀死了,那是从服务器端发生的事情”,那么这是什么原因造成的呢? – Neel

+0

我仍在检查是否有一些防火墙的TCP超时时间少于收割时间。在此期间也没有发现网络问题 – Neel

回答

0
  1. 什么能引起从应用端ORA-00028数据库团队说,没有会议从他们身边杀害。

我建议您检查网络上的任何防火墙设置。由于此问题发生在凌晨3点,当流量最小时,问题很可能是由单个连接暂时搁置一段时间,然后由外部超时(例如防火墙空闲超时)终止。

在你说你的TCP保持活动时间设置为1800秒(30分钟)的评论中,所以我们假设20分钟后TCP连接变坏。

你的配置被设置为:

  • 丢弃1800秒(30分钟)
  • 运行池维护每180秒(3分钟)
  • 的时间无限量推移unsused的连接可以打开单个连接,因为老化超时时间为0

通过这些设置,单个连接可以由websphere汇集超过20分钟,因此我建议将老龄化超时设置为大约900秒(15分钟),因此单个连接将不会合并超过20分钟。

注意的时间总量的连接可以由WebSphere汇集是:

aged_timeout + reap_time = max_pooled_connection_time 

而且你总是想firewall_timeout > max_pooled_connection_time

  • 它是正常的数据库中的总会话数不少于数据源中配置的最大连接数,否则会导致此问题。
  • 是的,这是完全正常的和理想的。 WebSphere将根据需要池连接,最大池大小。一旦您达到最大池大小一致,性能瓶颈开始发生。

    +0

    我现在已将Min连接更改为0,因为我期望发生旧的连接问题。我是否还应该从零开始改变老化超时?此外,如果您可以提供一些关于可能导致此问题的意见 - “从过去几天我们看到一个问题,突然在早上我们开始在应用程序中超时,然后出现一个奇怪的行为,我们没有发现任何异常,但Callable Statement用于运行过程返回零结果的所有执行,即使数据在数据库中有“ – Neel