Java 挂起在Glassfish连接池中的DB2驱动程序连接

Java 挂起在Glassfish连接池中的DB2驱动程序连接,java,db2,glassfish,connection-pooling,Java,Db2,Glassfish,Connection Pooling,围绕从Glassfish连接池使用的DB2,我们有一个间歇性的问题。结果是: 在数据库(ZOS上的DB2)处于压力之下的情况下,我们的应用程序(这是一个通过Glassfish连接池连接到DB2的多线程应用程序)停止执行任何操作 观察到以下情况: 1) 查看使用JConsole的服务器,我们可以在DB2驱动程序的getConnection()方法中看到一个线程无限期地等待。我们还可以看到,它已经锁定了驱动程序中的一个向量。其他几个线程也在调用驱动程序中的getConnection()方法,并挂起等

围绕从Glassfish连接池使用的DB2,我们有一个间歇性的问题。结果是:

在数据库(ZOS上的DB2)处于压力之下的情况下,我们的应用程序(这是一个通过Glassfish连接池连接到DB2的多线程应用程序)停止执行任何操作

观察到以下情况:

1) 查看使用JConsole的服务器,我们可以在DB2驱动程序的getConnection()方法中看到一个线程无限期地等待。我们还可以看到,它已经锁定了驱动程序中的一个向量。其他几个线程也在调用驱动程序中的getConnection()方法,并挂起等待释放向量上的锁

2) 查看数据库本身,我们可以看到Glassfish服务器的连接已打开并等待使用。Glassfish上的连接池与实际打开到DB2的连接之间似乎存在某种不匹配

以前有人遇到过这个问题吗?还是类似的?如果您需要我没有提供的更多信息,请告诉我

可能相关:

你在jdk1.5上吗


从博客:

在Java 1.5及更早版本中,Java.sql.DriverManager上的所有方法都是同步的。您对DriverManager.getConnection(…)的初始调用会触发HA-JDBC的启动。随着HA-JDBC的初始化,它最终将为集群中的每个数据库url调用DriverManager.getDriver(…)。对DriverManager.getDriver(…)的调用发生在与应用程序线程不同的线程中,因此出现死锁

此问题至少有两种已知的解决方法:

  • 升级到Java1.6。在始终坚持java.sql.DriverManager的整体同步不是缺陷之后,Sun在java 1.6中默默地修复了这一问题

  • 与其使用DriverManager.getConnection(…)获取连接,不如使用DriverManager.getDriver(…).connect(…)。这将避免死锁,因为DriverManager.getDriver(…)不会触发HA-JDBC启动,并且Driver.connect(…)未同步


听起来像是内部驱动程序问题。您正在运行IBM的最新驱动程序版本吗?我们正在运行最新的驱动程序-iti是导致问题的驱动程序版本之一。我们现在正在尝试一个更老的版本,它是DB2V8驱动程序的最新版本。我们还没有任何确凿的证据证明这已经解决了这个问题,但它已经一个星期没有结束了,所以这至少是令人沮丧的!