Java Spring项目中的多数据库连接问题
我将在一个spring项目中配置两个数据库连接。以以下方式创建了两个数据源beanJava Spring项目中的多数据库连接问题,java,spring,hibernate,jpa,transactions,Java,Spring,Hibernate,Jpa,Transactions,我将在一个spring项目中配置两个数据库连接。以以下方式创建了两个数据源bean @Bean(destroyMethod = "close") public BoneCPDataSource getDataSource() { .... .... return dataSource; } @Bean(destroyMethod = "close") public B
@Bean(destroyMethod = "close")
public BoneCPDataSource getDataSource() {
....
....
return dataSource;
}
@Bean(destroyMethod = "close")
public BoneCPDataSource getDataSource2() {
....
....
return dataSource;
}
@Bean
@Primary
public JpaTransactionManager getTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
@Bean(name = "transactionManager2")
@Qualifier("transactionManager2")
public JpaTransactionManager getTransactionManager2() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory2().getObject());
return transactionManager;
}
return transactionManager;
}
这就是我创建实体管理器的方式
@Bean
@Qualifier("entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
...
em.setDataSource(getDataSource());
em.setPersistenceUnitName("entityManagerFactory");
...
return em;
}
@Bean
@Qualifier("entityManagerFactory2")
public LocalContainerEntityManagerFactoryBean entityManagerFactory2() {
...
em.setDataSource(getDataSource2());
em.setPersistenceUnitName("entityManagerFactory2");
...
return em;
}
然后,我在存储库实现类中自动连接了上述实体管理器,它可以很好地用于非事务性数据
@PersistenceContext(unitName = "entityManagerFactory2")
@Qualifier(value = "entityManagerFactory2")
private EntityManager entityManager2;
然后按照以下方式创建事务管理器
@Bean(destroyMethod = "close")
public BoneCPDataSource getDataSource() {
....
....
return dataSource;
}
@Bean(destroyMethod = "close")
public BoneCPDataSource getDataSource2() {
....
....
return dataSource;
}
@Bean
@Primary
public JpaTransactionManager getTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
@Bean(name = "transactionManager2")
@Qualifier("transactionManager2")
public JpaTransactionManager getTransactionManager2() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory2().getObject());
return transactionManager;
}
return transactionManager;
}
但问题是,我无法使用Bean transactionManager2插入或更新表,因为我不知道正确的配置方法
但可以使用GetTransactionManager插入或更新,唯一的问题是无法配置第二个连接。我犯了这个错误
Caused by: javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
当您想要使用第二个事务管理器时,需要使用以下内容对服务方法进行注释:
@Transactional("transactionManager2")
public void insertPost(Post post) { ... }
在此上下文中,您是否特别需要
@Primary
注释?在Spring应该使用getTransactionManager()返回的JpaTransactionManager
的配置中,您在哪里配置。使用@Primary
命令Spring在另一个配置的事务管理器上使用getTransactionManager()
中的JpaTransactionManager
。使用@Primary注释将该事务管理设置为默认值。这种连接很好。使用此选项,JpaTransactionManager transactionManager=new-JpaTransactionManager();transactionManager.setEntityManagerFactory(entityManagerFactory().getObject())代码>但问题是我看不到您将transactionManager2设置为任何实体ManagerFactory的事务管理器的位置,请查看我更新的相关代码部分。谢谢。知道了。它对我有用。正如我所了解的,使用@Primary注释,我们可以将该Bean设置为默认事务Bean。所以在使用事务bean时不需要指定它。只有在使用特定的事务Bean时,我们才需要它。对吗?您是指默认的事务管理器。默认名为transactionManager
,因此无需为该名指定。将@Transactional扩展到可以根据某些环境变量选择适当事务管理器的内容似乎是有意义的。不确定这是否可能。但硬编码这东西似乎很尴尬