Spring - 2 个应用程序可以同时使用相同的@Transactional 服务吗?
Spring - Can 2 applications use the same @Transactional service at once?
我正在处理 2 个 Spring 项目,一个网络应用程序和一个独立的后端服务。两者都使用 Hibernate 和相同的底层数据库。由于这两个项目都使用它们自己的大部分服务和存储库副本 classes,我有很多重复代码,这对我自己管理总共超过 47,000 行代码来说是一场噩梦。因此,我决定创建第三个项目,我基本上将其用作 class 库。它存储实体 classes、服务 classes 和存储库 classes,并将其作为 Maven 依赖项添加到每个项目。在我进行此重大更改之前,一切都完美无缺。
网络应用运行良好,但服务根本无法启动。这是堆栈跟踪:
Exception in thread "Test Legacy Orders Server Init Thread" Exception in thread "Test Legacy Formulary Server Init Thread" org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.IllegalStateException: EntityManagerFactory is closed
at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:564)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:378)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:474)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:289)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy79.logInfo(Unknown Source)
at com.mdenis.mdhis_service.connectivity.HL7TestServer.start(HL7TestServer.java:69)
at com.mdenis.mdhis_service.core.MDHIS_Service.run(MDHIS_Service.java:311)
Caused by: java.lang.IllegalStateException: EntityManagerFactory is closed
at org.hibernate.internal.SessionFactoryImpl.validateNotClosed(SessionFactoryImpl.java:498)
at org.hibernate.internal.SessionFactoryImpl.getCache(SessionFactoryImpl.java:769)
at org.hibernate.internal.AbstractSharedSessionContract.<init>(AbstractSharedSessionContract.java:142)
at org.hibernate.internal.AbstractSessionImpl.<init>(AbstractSessionImpl.java:29)
at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:252)
at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1229)
at org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:449)
at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:456)
... 9 more
我在 HibernateUtil class 中唯一改变的是这一行:
sessionFactory.setPackagesToScan(new String[] {"com.mdenis.mdhis_common.entity"});
这是包含共享 jar 文件中的实体的新包。我知道事实上 Hibernate 正在使用新设置正确初始化,因为有事务从这个服务成功地通过数据库。我注意到的一件事是主线程似乎没问题。此应用程序是大量多线程的,只有子线程似乎会遇到此问题。
在我进行大规模重构之前,每个项目都有自己的本地@Transactional 服务class 可以使用,并且一切都运行良好。我在做什么是不允许的吗?有没有办法让 2 个项目使用相同的@Transactional 服务?
谢谢!
哇,想通了。实体管理器已关闭,主线程因缺少 bean 而出错。我解决了这个问题,一切正常,今天的编码足够了!
我正在处理 2 个 Spring 项目,一个网络应用程序和一个独立的后端服务。两者都使用 Hibernate 和相同的底层数据库。由于这两个项目都使用它们自己的大部分服务和存储库副本 classes,我有很多重复代码,这对我自己管理总共超过 47,000 行代码来说是一场噩梦。因此,我决定创建第三个项目,我基本上将其用作 class 库。它存储实体 classes、服务 classes 和存储库 classes,并将其作为 Maven 依赖项添加到每个项目。在我进行此重大更改之前,一切都完美无缺。
网络应用运行良好,但服务根本无法启动。这是堆栈跟踪:
Exception in thread "Test Legacy Orders Server Init Thread" Exception in thread "Test Legacy Formulary Server Init Thread" org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.IllegalStateException: EntityManagerFactory is closed
at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:564)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:378)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:474)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:289)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy79.logInfo(Unknown Source)
at com.mdenis.mdhis_service.connectivity.HL7TestServer.start(HL7TestServer.java:69)
at com.mdenis.mdhis_service.core.MDHIS_Service.run(MDHIS_Service.java:311)
Caused by: java.lang.IllegalStateException: EntityManagerFactory is closed
at org.hibernate.internal.SessionFactoryImpl.validateNotClosed(SessionFactoryImpl.java:498)
at org.hibernate.internal.SessionFactoryImpl.getCache(SessionFactoryImpl.java:769)
at org.hibernate.internal.AbstractSharedSessionContract.<init>(AbstractSharedSessionContract.java:142)
at org.hibernate.internal.AbstractSessionImpl.<init>(AbstractSessionImpl.java:29)
at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:252)
at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1229)
at org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:449)
at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:456)
... 9 more
我在 HibernateUtil class 中唯一改变的是这一行:
sessionFactory.setPackagesToScan(new String[] {"com.mdenis.mdhis_common.entity"});
这是包含共享 jar 文件中的实体的新包。我知道事实上 Hibernate 正在使用新设置正确初始化,因为有事务从这个服务成功地通过数据库。我注意到的一件事是主线程似乎没问题。此应用程序是大量多线程的,只有子线程似乎会遇到此问题。
在我进行大规模重构之前,每个项目都有自己的本地@Transactional 服务class 可以使用,并且一切都运行良好。我在做什么是不允许的吗?有没有办法让 2 个项目使用相同的@Transactional 服务?
谢谢!
哇,想通了。实体管理器已关闭,主线程因缺少 bean 而出错。我解决了这个问题,一切正常,今天的编码足够了!