Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Play 2.3 F.承诺没有实体管理器绑定到此线程_Java_Mysql_Concurrency_Playframework - Fatal编程技术网

Java Play 2.3 F.承诺没有实体管理器绑定到此线程

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

我试图使用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 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返回连接,它无法
所以我们陷入了僵局。上面的场景描述了一个过于简单的场景,其中只有一个连接和一个线程,但在更现实的场景中,许多用户看到了生产死锁,其中许多线程在连接池上被阻塞,而许多连接保持线程被阻塞,等待连接池阻塞的线程产生

解决方案是使用异步连接池,不幸的是,JPA不支持异步连接池。解决方法是使用专用线程池异步获取连接,这样,当连接池耗尽时,专用线程将阻塞,但这不会影响任何事情(除了可能嵌套的获取连接的尝试),因为它仅用于从池中获取连接


因此,您有3种选择:

  • 您可以使用正确处理实体管理器关闭但仍存在上述死锁问题的

  • 使用
    JPA.withTransaction
    而不是
    JPA.withtransactionsync

  • 使用Ebean,它没有这些问题

  • 编辑:为了完整性,我将添加选项4(我的首选解决方案),即不使用ORM框架并用jOOQ替换它

    public static int getUserId()
    {
        return JPA.withTransactionAsync(.........);
    }