从不同线程调用时查询超时

Query timeout when calling from different threads

服务器在 servlet 中接收 http 请求,从 servlet 调用 ejb 组件中的方法。

public void ejbMethodVariant1(...) {
    //calling stored proc
    ...
    //calling same stored proc
}

public void ejbMethodVariant2(...) {
    //calling stored proc
    ...
    Thread t = new Thread(() -> {
             //calling same stored proc
        });
    t.start();
    try {
        t.join();
    } catch (InterruptedException e){
        ...
    }
}

存储过程始终相同。 "Calling stored proc" 表示:

  1. 正在从数据源获取连接
  2. 正在创建可调用语句
  3. 正在执行可调用语句
  4. 结束语
  5. 关闭连接

在变体 1 中 - 一切正常,没有错误。第一次和第二次调用中的连接具有 autoCommit=false。

在变体 2 中 - 第一次调用成功完成,第二次 - 2 分钟后超时(com.microsoft.sqlserver.jdbc.SQLServerException:查询已超时。)。第一次调用中的连接有 autoCommit=false,第二次调用中有 autoCommit=true.

您正在启动一个没有复制事务上下文、安全上下文等的新线程。如果您想使用新线程来 运行 语句,请考虑使用 Java EE 7 中的 EE Concurrency 实用程序。