我是一名有用的助手,可以为您翻译文本。
问题是,我的数据源没有切换。第二个请求使用相同的源。我想我在这里做错了什么。
正确的方法是如何在单个事务中切换数据源?
编辑(07-06-2016) 由于我注意到为单个事务切换数据源不起作用,所以我会添加后续内容。
是否可能在单个用户请求的两个事务之间切换数据源?如果可以,正确的方法是什么?
长版本 在继续之前,我想提到我的多租户实现是基于此博客上提供的教程。
现在,我的目标是在动态选择的数据源(由自定义标识符选择)无法找到结果时将默认数据源用作回退。所有这些都需要在单个用户请求中完成。解决方案使用单个或多个事务注释方法都没有区别。
但是这并没有什么区别,第一个数据源仍然被用于第二个方法调用(应该使用默认事务管理器)。
我希望有人可以帮助我找到解决方案。
提前致谢。
我已经苦苦挣扎了几天,试图让它工作,但似乎找不到解决方案。这就是为什么我想在这里问一下。
简短版本
我有一个使用Spring boot、Spring Data JPA和Hibernate的多租户实现,这个实现非常好用。但现在我想实现一个功能,在单个事务中切换数据库(数据源)。例如,我在我的服务类中使用类似的代码
@Autowired
private CustomRepository customRepository;
@Autorwired
private CustomTenantIdentifierResolver customResolver;
@Transactional
public Custom getCustom(String name) {
// Set the datasource to "one";
this.customResolver.setIdentifier("one");
Custom result = this.customRepository.findOneByName(name);
//If the result is null, switch datasource to default and try again
this.customResolver.setIdentifier("default");
result = this.customRepository.findOneByName(name);
return result;
}
问题是,我的数据源没有切换。第二个请求使用相同的源。我想我在这里做错了什么。
正确的方法是如何在单个事务中切换数据源?
编辑(07-06-2016) 由于我注意到为单个事务切换数据源不起作用,所以我会添加后续内容。
是否可能在单个用户请求的两个事务之间切换数据源?如果可以,正确的方法是什么?
长版本 在继续之前,我想提到我的多租户实现是基于此博客上提供的教程。
现在,我的目标是在动态选择的数据源(由自定义标识符选择)无法找到结果时将默认数据源用作回退。所有这些都需要在单个用户请求中完成。解决方案使用单个或多个事务注释方法都没有区别。
到目前为止,我尝试了几件事情,其中之一已经描述过了,另一个包括使用多个事务管理器。该实现使用一个配置文件创建两个事务管理器bean,每个bean使用不同的数据源。
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Autowired
private EntityManagerFactory entityManagerFactory;
@Autowired
private DataSourceProvider dataSourceProvider;
@Bean(name = "defaultTransactionManager")
public PlatformTransactionManager defaultTransactionManager() {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
jpaTransactionManager.setDataSource(dataSourceProvider.getDefaultDataSource());
jpaTransactionManager.afterPropertiesSet();
return jpaTransactionManager;
}
@Bean(name = "dynamicTransactionManager")
public PlatformTransactionManager dynamicTransactionManager() {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
jpaTransactionManager.afterPropertiesSet();
return jpaTransactionManager;
}
}
接下来,我将服务方法分成了两个独立的方法,并添加了@Transactional
注释,包括正确的bean名称。
@Transactional("dynamicTransactionManager")
public Custom getDynamicCustom(String name) {
...stuff...
}
@Transactional("defaultTransactionManager")
public Custom getDefaultCustom(String name) {
...stuff...
}
但是这并没有什么区别,第一个数据源仍然被用于第二个方法调用(应该使用默认事务管理器)。
我希望有人可以帮助我找到解决方案。
提前致谢。