JDBC连接挂起

时间:2009-08-07 21:17:13

标签: sql-server jdbc database-connection

我们的一位客户有一个新问题:应用程序停止运行。线程转储显示所有线程在JDBC调用中都挂在网络IO上。

我们/我从未见过这些'网络IO'挂起。通常,具有DB问题的慢速机器具有a)一个或两个长时间运行的查询或b)某种类型的锁定/死锁。在任何一种情况下,线程都会“挂起”在不同的方法上。我从未见过所有30多个线程挂在网络IO上。

下面我已经包含了一个来自线程转储的摘录。所有HTTP线程都挂在同一个java.net.SocketInputStream.read调用上。

我和他们的dba和系统管理员谈过。据他们说,最近在环境中“没有任何变化”会导致这个问题。

数据库环境

MSSQL 2005 64位Service Pack 2 驱动程序:sqljdbc.jar:1.0 809 102

注意:它们正在运行较旧的jdbc驱动程序。 AFAIK他们尝试从1.0升级到1.2驱动程序,但还有其他一些问题。

其他环境问题

他们在VMWare VM中同时运行应用服务器和数据库服务器。我不知道这种设置如何影响网络性能。

显然这是唯一具有此问题的应用程序。我对他们的网络架构一无所知。

问题 *有关此问题的任何见解? *如果是网络,还有其他分析步骤吗?

附录A:摘自线程转储

所有HTTP连接都挂在同一方法上:

"TP-Processor31" daemon prio=5 tid=0x04085b78 nid=0x970 runnable [0x0764d000..0x0764fd6c]
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at com.microsoft.sqlserver.jdbc.DBComms.receive(Unknown Source)
    at com.microsoft.sqlserver.jdbc.IOBuffer.sendCommand(Unknown Source)
    - locked  (a com.microsoft.sqlserver.jdbc.DBComms)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.sendExecute(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteQuery(Unknown Source)

2 个答案:

答案 0 :(得分:8)

我们遇到了类似的问题,并追溯到一个错误的JDK更新(1.6.29)。

我们下载了1.6.27(http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u27-oth-JPR),设置JAVA_HOME环境,我们又回到正轨。

答案 1 :(得分:2)

这是版本1.6 u29中JSSE的更改。更改是部分修补CVE-2011-3389CVE-2011-3560

如果没有部署applet并使用java web-start。您也许可以使用1.6 u27 jsse.jar。您仍然会遇到此漏洞,但它将允许sqljdbc.jar和sqljdbc4.jar工作。

迁移到Java 7的其他选项,sqljdbc4.jar在该环境中可以正常工作。

补丁未完全修复。所以期待未来补丁的更多变化。