如何在Play Framework 2.2的单独线程中使用相同的数据库事务

spi*_*ce7 5 hibernate playframework slick playframework-2.2

从play的文档:

由于Play 2.0的工作方式,动作代码必须尽可能快(即非阻塞).那么如果我们还不能生成它,我们应该返回什么呢?回应是对结果的承诺!

所以我不应该直接在动作内部进行数据库调用.当我查看Plays JPA文档时,这让我感到困惑:

每个JPA调用都必须在事务中完成,因此,要为特定操作启用JPA,请使用@ play.db.jpa.Transactional对其进行注释.这将使用JPA Action组成您的操作方法,该操作为您管理事务

这让我有点困惑.如果我遵循文档,我不应该使用数据库调用阻止操作线程.但是,如果操作是创建和管理数据库事务的,那么我是不是通过将工作发送给actor或者以某种方式将工作卸载到另一个线程来丢失该事务?我的意思是,我是scala和play的新手,但我只是看不到事务如何跟随单独的线程.有没有人有解释,或者我应该这样做的方式?我很困惑.

joh*_*ren 2

您缺少一块拼图,请阅读此处的“高度同步”: http: //www.playframework.com/documentation/2.2.x/ThreadPools

所以,是的,您会希望它是非阻塞的,但如果由于 JPA/JDBC 等原因而无法做到这一点,那么您可以像使用常规 Java Web 容器一样配置播放 - 一个具有大量线程的线程池。它不会给你游戏所能提供的一切,但对你来说可能已经足够了。

您还可以创建一个特定的线程池/执行上下文,并仅在其上运行 JPA/JDBC 内容,并使服务器的其余部分保持非阻塞。