服务器在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中 - 所有工作都完美,没有错误。第一次和第二次调用中的连接都有autoCommit = false。
在变体2中 - 第一次调用成功完成,第二次在2分钟后完成(com.microsoft.sqlserver.jdbc.SQLServerException:查询已超时。)。第一次通话中的连接有autoCommit = false,第二次通话中的连接有autoCommit = true 。
答案 0 :(得分:2)
您正在启动一个新的线程,该线程没有复制到它的事务上下文,安全上下文等。如果要使用新线程来运行该语句,请考虑使用Java EE 7中的EE Concurrency实用程序。