Java Play 2.3 F.承诺没有实体管理器绑定到此线程
我试图使用F.Promise并发访问mysql数据库以获取对象列表,但我得到: 没有实体管理器绑定到此线程 虽然在方法内部调用了存储过程,但我使用JPA.WithTransactionSync对其进行了包装,但仍然得到相同的错误Java Play 2.3 F.承诺没有实体管理器绑定到此线程,java,mysql,concurrency,playframework,Java,Mysql,Concurrency,Playframework,我试图使用F.Promise并发访问mysql数据库以获取对象列表,但我得到: 没有实体管理器绑定到此线程 虽然在方法内部调用了存储过程,但我使用JPA.WithTransactionSync对其进行了包装,但仍然得到相同的错误 import play.libs.F.*; import play.mvc.*; import java.util.concurrent.Callable; import static play.libs.F.Promise.promise; public
import play.libs.F.*;
import play.mvc.*;
import java.util.concurrent.Callable;
import static play.libs.F.Promise.promise;
public class Application extends Controller {
public static Promise<Result> index() {
return promise(new Function0<Integer>() {
public Integer apply() {
return getUserId();
}
}).map(new Function<Integer,Result>() {
public Result apply(Integer i) {
return ok("Got " + i);
}
});
这是一个已知的问题-您可以看到关于它的讨论 引用詹姆斯·罗珀的话
跨线程使用事务会导致死锁。问题是:
- 请求获取连接
- 请求A执行一些异步操作,并生成其线程
- 请求B获取线程,尝试获取连接,但由于连接池为空而阻塞
- 请求A的异步操作完成后,它进入队列执行,并最终将连接返回池,但它无法执行,因为线程被请求B占用,等待连接,它永远不会得到连接,因为它正在等待A返回连接,它无法
因此,您有3种选择:
JPA.withTransaction
而不是JPA.withtransactionsync
public static int getUserId()
{
return JPA.withTransactionAsync(.........);
}