【问题标题】:msssql-jdbc: APPARENT DEADLOCK when running integration testsmsssql-jdbc:运行集成测试时出现明显的死锁
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-05
    • 2019-07-16
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2020-04-03
    相关资源
    最近更新 更多