我的应用程序是一个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线程在关闭其连接之前等待另一个线程?所有这些线程都是只读查询,所以我很困惑为什么我会看到这种锁争用?
非常感谢任何帮助。
答案 0 :(得分:0)
将驱动程序升级到最新版本后,死锁异常消失了!再次感谢您的帮助!