【问题标题】:Query timeout when calling from different threads从不同线程调用时查询超时
【发布时间】:2017-03-16 20:40:45
【问题描述】:

服务器在 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){
        ...
    }
}

存储过程总是相同的。 “调用存储过程”的意思是:

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

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

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

【问题讨论】:

  • 请注意,根据JEE规范,ejb中不允许创建和管理线程。见this answerthis

标签: java multithreading jdbc wildfly wildfly-8


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 2021-05-10
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多