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) { ... }