我们有一个关于从Glassfish连接池使用的DB2的间歇性问题。会发生什么:
在数据库(ZOS上的DB2)处于压力之下的情况下,我们的应用程序(使用通过Glassfish连接池与DB2连接的多线程应用程序)会停止执行任何操作。
观察到以下情况:
1)使用JConsole查看服务器,我们可以看到一个线程在DB2驱动程序的getConnection()方法中无限期地等待。我们还可以看到它已经锁定了驱动程序中的Vector。其他几个线程也在驱动程序中调用getConnection()方法,并且正在等待释放Vector上的锁定。
2)查看数据库本身,我们可以看到Glassfish服务器的连接已打开并等待使用。似乎Glassfish上的连接池与实际对DB2开放的连接之间存在某种不匹配。
之前有没有人遇到过这个问题?或类似的东西?如果您还需要我提供的更多信息,请告诉我们!
答案 0 :(得分:0)
相关或许: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4263113
你在jdk1.5吗?
来自博客:
在Java 1.5及更早版本中,java.sql.DriverManager上的所有方法都是同步的。您对DriverManager.getConnection(...)的初始调用会触发HA-JDBC的启动。当HA-JDBC初始化时,它最终会为集群中的每个数据库URL调用DriverManager.getDriver(...)。对DriverManager.getDriver(...)的调用发生在与应用程序线程不同的线程中,因此出现死锁。
此问题至少有2种已知的解决方法:
升级到Java 1.6。在永远坚持java.sql.DriverManager的全面同步不是缺陷之后,Sun在Java 1.6中默默地修复了这个问题。
不是使用DriverManager.getConnection(...)来获取连接,而是使用DriverManager.getDriver(...)。connect(...)。这将绕过死锁,因为DriverManager.getDriver(...)不会触发HA-JDBC启动并且Driver.connect(...)不同步。