从不同线程调用时查询超时
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 中 - 一切正常,没有错误。第一次和第二次调用中的连接具有 autoCommit=false。
在变体 2 中 - 第一次调用成功完成,第二次 - 2 分钟后超时(com.microsoft.sqlserver.jdbc.SQLServerException:查询已超时。)。第一次调用中的连接有 autoCommit=false,第二次调用中有 autoCommit=true.
您正在启动一个没有复制事务上下文、安全上下文等的新线程。如果您想使用新线程来 运行 语句,请考虑使用 Java EE 7 中的 EE Concurrency 实用程序。
服务器在 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 中 - 一切正常,没有错误。第一次和第二次调用中的连接具有 autoCommit=false。
在变体 2 中 - 第一次调用成功完成,第二次 - 2 分钟后超时(com.microsoft.sqlserver.jdbc.SQLServerException:查询已超时。)。第一次调用中的连接有 autoCommit=false,第二次调用中有 autoCommit=true.
您正在启动一个没有复制事务上下文、安全上下文等的新线程。如果您想使用新线程来 运行 语句,请考虑使用 Java EE 7 中的 EE Concurrency 实用程序。