Java 挂起在Glassfish连接池中的DB2驱动程序连接
围绕从Glassfish连接池使用的DB2,我们有一个间歇性的问题。结果是: 在数据库(ZOS上的DB2)处于压力之下的情况下,我们的应用程序(这是一个通过Glassfish连接池连接到DB2的多线程应用程序)停止执行任何操作 观察到以下情况: 1) 查看使用JConsole的服务器,我们可以在DB2驱动程序的getConnection()方法中看到一个线程无限期地等待。我们还可以看到,它已经锁定了驱动程序中的一个向量。其他几个线程也在调用驱动程序中的getConnection()方法,并挂起等待释放向量上的锁 2) 查看数据库本身,我们可以看到Glassfish服务器的连接已打开并等待使用。Glassfish上的连接池与实际打开到DB2的连接之间似乎存在某种不匹配 以前有人遇到过这个问题吗?还是类似的?如果您需要我没有提供的更多信息,请告诉我 可能相关: 你在jdk1.5上吗Java 挂起在Glassfish连接池中的DB2驱动程序连接,java,db2,glassfish,connection-pooling,Java,Db2,Glassfish,Connection Pooling,围绕从Glassfish连接池使用的DB2,我们有一个间歇性的问题。结果是: 在数据库(ZOS上的DB2)处于压力之下的情况下,我们的应用程序(这是一个通过Glassfish连接池连接到DB2的多线程应用程序)停止执行任何操作 观察到以下情况: 1) 查看使用JConsole的服务器,我们可以在DB2驱动程序的getConnection()方法中看到一个线程无限期地等待。我们还可以看到,它已经锁定了驱动程序中的一个向量。其他几个线程也在调用驱动程序中的getConnection()方法,并挂起等
从博客: 在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(…)未同步