【发布时间】:2018-11-01 16:50:46
【问题描述】:
我有一个使用 JPA 存储库来操作 Postgres 数据库的服务 (JHipster4)。该服务正在导入 CSV 并创建大量实体。创建实体的公共方法用@Transactional注解(import org.springframework.transaction.annotation.Transactional)
独立启动应用程序(bootRun、OpenJDK 1.8、内部 tomcat 服务器)时,Import 以 700 个实体/秒的速度快速运行。导入完成后,我可以立即看到数据库中出现的数据。这让我确信事务正常工作。
一旦我将我的应用程序部署到 payara 4.1,@Transactional 注释似乎不像以前那样工作。我可以看到数据库正在逐行填充,并且速度很慢(20 个实体/秒),就像没有 @Transactional 一样。
在我的导入中,我使用 entityManager 和 createNativeQuery(..).executeUpdate(); 截断数据库表;
如果我删除@Transactional,我会得到
javax.persistence.TransactionRequiredException: Executing an update/delete
这很好。在带有 @Transactional 的 glassfish 上,我没有收到这样的错误(这也很好),但从数据库的角度来看,似乎没有事务正在运行(实体缓慢填充)。
payara 配置是完全默认的。 spring 数据库配置也最少,com.zaxxer.hikari.HikariDataSource,database-platform:io.github.jhipster.domain.util.FixedPostgreSQL82Dialect,database:POSTGRESQL。
在 beans.xml 上我设置了 bean-discovery-mode="none" 因为 CDI 给了我问题。
那么在独立上下文和应用程序容器(glassfish)中使用 Spring Boot JPA 的主要区别是什么?
为什么@Transactional 不像在独立版本上那样工作?你能解释一下发生了什么以及如何解决吗?
提前谢谢你!
【问题讨论】:
标签: java spring-boot jakarta-ee glassfish payara