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

时间:2016-11-03 09:57:26

标签: java multithreading jdbc wildfly wildfly-8

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

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. 关闭连接
  6. 在变体1中 - 所有工作都完美,没有错误。第一次和第二次调用中的连接都有autoCommit = false。

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

1 个答案:

答案 0 :(得分:2)

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