msssql-jdbc:运行集成测试时的APPARENT DEADLOCK

时间:2018-04-23 14:40:58

标签: jdbc mssql-jdbc

我的应用程序是一个Spring启动应用程序,使用mssql-jdbc(6.1.0.jre8)连接到Azure SQL数据库。但是,当我运行集成测试时,我收到以下错误:

  

com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@641c9759    - 表面上的死锁!为未分配的待处理任务创建紧急线程!

所以我做了一个jstack并看到一些RUNNABLE线程:

java.lang.Thread.State: RUNNABLE
 at java.net.SocketInputStream.socketRead0(Native Method)
 [...]
 at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2438)
 - locked <0x00000006c1d34e58> (a java.lang.Object)
 at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:208)
 [...]
 at com.wk.neo.components.reports.ReportRepoImpl.getReport(ReportRepoImpl.java:42)

寻找等待0x00000006c1d34e58锁定的线程我看到一些线程BLOCKED试图关闭它的连接:

java.lang.Thread.State: BLOCKED (on object monitor)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2418)
    - waiting to lock <0x00000006c1d34e58> (a java.lang.Object)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:208)
    [...]
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.close(SQLServerStatement.java:662)

为什么我看到很多BLOCKED线程在关闭其连接之前等待另一个线程?所有这些线程都是只读查询,所以我很困惑为什么我会看到这种锁争用?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

将驱动程序升级到最新版本后,死锁异常消失了!再次感谢您的帮助!