Spring 项目中的多个数据库连接问题
Multiple database connection issue in Spring project
我打算在一个 spring 项目中配置两个数据库连接。按照以下方式创建了两个数据源 bean。
@Bean(destroyMethod = "close")
public BoneCPDataSource getDataSource() {
....
....
return dataSource;
}
@Bean(destroyMethod = "close")
public BoneCPDataSource getDataSource2() {
....
....
return dataSource;
}
这就是我创建实体管理器的方式。
@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
@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 插入或更新表,因为我不知道配置它的正确方法。
但是可以使用 getTransactionManger 插入或更新,唯一的问题是无法配置第二个连接。收到此错误。
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) { ... }
我打算在一个 spring 项目中配置两个数据库连接。按照以下方式创建了两个数据源 bean。
@Bean(destroyMethod = "close")
public BoneCPDataSource getDataSource() {
....
....
return dataSource;
}
@Bean(destroyMethod = "close")
public BoneCPDataSource getDataSource2() {
....
....
return dataSource;
}
这就是我创建实体管理器的方式。
@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
@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 插入或更新表,因为我不知道配置它的正确方法。
但是可以使用 getTransactionManger 插入或更新,唯一的问题是无法配置第二个连接。收到此错误。
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) { ... }