MSSSQLJDBC:运行集成测试时出现明显死锁

MSSSQLJDBC:运行集成测试时出现明显死锁,jdbc,mssql-jdbc,Jdbc,Mssql Jdbc,我的应用程序是一个spring引导应用程序,使用mssql jdbc(6.1.0.jre8)连接到Azure SQL数据库。但是,当我运行集成测试时,会出现以下错误: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@641c9759 --明显的僵局!!!为未分配的挂起任务创建紧急线程 所以我做了一个jstack并看到了一些可运行的线程: java.lang.Thread.State: RUNNABLE at

我的应用程序是一个spring引导应用程序,使用mssql jdbc(6.1.0.jre8)连接到Azure SQL数据库。但是,当我运行集成测试时,会出现以下错误:

com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@641c9759 --明显的僵局!!!为未分配的挂起任务创建紧急线程

所以我做了一个jstack并看到了一些可运行的线程:

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)
java.lang.Thread.State:可运行
位于java.net.SocketInputStream.socketRead0(本机方法)
[...]
位于com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2438)
-锁定(一个java.lang.Object)
位于com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:208)
[...]
位于com.wk.neo.components.reports.ReportRepoImpl.getReport(ReportRepoImpl.java:42)
正在查找等待0x00000006c1d34e58锁的线程,我看到一些线程在尝试关闭其连接时被阻止:

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)
java.lang.Thread.State:已阻止(在对象监视器上)
位于com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2418)
-等待锁定(java.lang.Object)
位于com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:208)
[...]
位于com.microsoft.sqlserver.jdbc.SQLServerStatement.close(SQLServerStatement.java:662)
为什么我看到很多阻塞的线程在关闭连接之前等待另一个线程?所有这些线程都是只读查询,所以我很困惑为什么会看到锁争用


非常感谢您的帮助。

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

没有代码就不可能分辨。看起来您在多个线程上共享一个连接。JDBC连接应该是线程安全的,因此在内部,MicrosoftSQLServerJDBC驱动程序可能正在执行一些锁定/同步,以确保它是线程安全的;这与只读连接无关。我使用spring boot和JPA,所以所有的连接管理都从我这里抽象出来。所以我注入PersistenceContext并调用:entityMgr.createNativeSQL(sql);