【发布时间】:2021-03-24 04:57:00
【问题描述】:
我的应用程序是一个 Spring Boot 应用程序,并使用 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 线程在关闭连接之前等待另一个线程?所有这些线程都是只读查询,所以我很困惑为什么我会看到这个锁争用?
任何帮助将不胜感激。
【问题讨论】:
-
没有代码就无法分辨。看起来您正在多个线程上共享单个连接。 JDBC 连接应该是线程安全的,因此在内部,Microsoft SQL Server JDBC 驱动程序可能会进行一些锁定/同步以确保它是线程安全的;这与它是只读连接无关。
-
我正在使用 Spring Boot 和 JPA,因此所有连接管理都从我身上抽象出来。所以我正在注入 PersistenceContext 并调用: entityMgr.createNativeSQL(sql);
标签: jdbc mssql-jdbc