SpringBoot, ручное управление двумя источниками данных, транзакция не удалась - PullRequest
0 голосов
/ 12 марта 2020

Я использую SpringBoot 2.1.8.RELEASE, у меня есть два источника данных, я вручную контролирую транзакции. транзакция (помеченная "@Primary") работает. Но транзакция, помеченная другим источником данных, не работает должным образом. Есть ли у вас какие-либо предложения?

Конфигурация Maven указана ниже

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

other omit...

Один источник данных настроен следующим образом:

@Configuration
@MapperScan(basePackages = {"com.XXX.XXXX.mapper","com.XXX.XXX.common.mapper"},sqlSessionFactoryRef = "masterSqlSessionFactory")
public class ProductDataSourceConfig {
    static final String MAPPER_LOCATION = "classpath:mybatis/MYSQL/*.xml";


    @Bean(name = "masterDataSource")
    @ConfigurationProperties("spring.datasource.product")
    public DataSource masterDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "masterTransactionManager")
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionFactory")

    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(ProductDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

Другой источник данных настроен следующим образом:

@Configuration
@MapperScan(basePackages = "com.XXX.XXX.mapperTest",sqlSessionFactoryRef = "secondSqlSessionFactory")
public class TestDataSourceConfig {
    static final String MAPPER_LOCATION = "classpath:mybatis/TESTMYSQL/*.xml";

    @Primary
    @Bean(name = "secondDataSource")
    @ConfigurationProperties("spring.datasource.test")
    public DataSource clusterDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "secondTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(clusterDataSource());
    }

    @Primary
    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondDataSource") DataSource clusterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(clusterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(TestDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

Когда настроено следующим образом, отправьте как ожидалось (в дБ «@Primary», запись вставлена).

@Autowired
DataSourceTransactionManager dataSourceTransactionManager;

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setTimeout(500);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(def);

insertTmemberEnterRecord(bean);

dataSourceTransactionManager.commit(transactionStatus);

Но при следующей конфигурации, отправка не работает (нет данных) вставлено в таблицу), также нет сообщения об ошибке.

@Qualifier("masterTransactionManager")
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setTimeout(500);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(def);

insertTmemberEnterRecord(bean);

dataSourceTransactionManager.commit(transactionStatus);

Любые предложения приветствуются.

1 Ответ

0 голосов
/ 13 марта 2020

Я решил проблему. Причина в том, что также должен использоваться соответствующий файл сопоставления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...