playframework - 在 Play 中放置@Transactional 注释的位置

标签 playframework playframework-2.0

我正在尝试将我的 Play 应用程序与数据库连接,我遵循 Controller ->服务->DAO 层样式。

@Transactional 注解应该放在哪里。在 Controller 操作方法中,或者我可以将它放在服务层类级别/方法级别中。

我尝试将 @Transactional 注释保留在服务层类的方法之一中,但它引发了运行时错误。

[RuntimeException: No EntityManager found in the context. Try to annotate your action method with @play.db.jpa.Transactional]

那么,我们是否必须仅在 Controller 操作之上使用@Transactional?我正在使用 play 2.4.2 版本。如果是,为什么?当我在服务层调用我的 DAO 时,我猜实际的数据库操作将在服务层开始,而不是在 Controller 中。在 Controller 中,我只是调用服务层。

最佳答案

我建议不要使用 @Transactional,因为它将整个操作包装在 JPA 事务中。在靠近数据库调用的地方开始事务会更有效率。

我更喜欢在服务级别开始交易。另外需要注意的是,db 调用是一个阻塞过程,因此它必须在默认操作上下文之外执行。

看看简单的 DAO+服务示例 https://gist.github.com/dzagorovsky/b8064c97ba647ed453ab

另请阅读此处的线程池 https://www.playframework.com/documentation/2.4.x/ThreadPools#Using-other-thread-pools

此处描述的阻塞代码(数据库调用)处理:https://www.playframework.com/documentation/2.3.x/JavaAsync

关于playframework - 在 Play 中放置@Transactional 注释的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443032/

相关文章:

playframework - 什么是 Play 框架 Web 服务器

gradle 2.6 Play 插件 : How to add play local dependency

lambda - 使用CompletionStage返回结果

playframework-2.0 - Play框架模板编译错误

java - 如何在 Play Framework 2.0 中创建自定义 validator ?

java - 从 java 运行 bash 文件

scala - 从 Controller 中重构业务逻辑的好习惯方法

performance - sbt 高 CPU 使用率与 ~run

playframework-2.0 - 在Scala模板中打印HTML

java - 玩!框架表单绑定(bind)错误