【发布时间】: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 中 - 一切正常,没有错误。第一次和第二次调用中的连接具有 autoCommit=false。
在变体 2 中 - 第一次调用成功完成,第二次 - 2 分钟后超时(com.microsoft.sqlserver.jdbc.SQLServerException:查询已超时。)。第一次调用的连接有 autoCommit=false,第二次调用有 autoCommit=true。
【问题讨论】:
-
请注意,根据JEE规范,ejb中不允许创建和管理线程。见this answer 或this
标签: java multithreading jdbc wildfly wildfly-8