基于saas系统的场景下,不同账户数据分库存储,需要根据登录的用户查询不同的库,那么就需要支持dao层的数据源动态切换(可不是静态多数据源配置哟)
参见gitee完整代码
https://gitee.com/farsunset/springboot-jpa-dds-starter
废话不多说
1 服务器启动成功后获取从数据库,或者网络文件中配置的多数据源,代码略
2 动态创建Repository
@Resource
private ObjectProvider<EntityPathResolver> resolver;
@Resource
private LocalContainerEntityManagerFactoryBean entityManagerFactoryBean;
@Resource
private ApplicationContext applicationContext;
public void initRepository(){
for(DataSource dataSource :sourceList){
/*
多个表的repository 依次创建
*/
JpaRepositoryFactoryBean bean = new JpaRepositoryFactoryBean(UserRepository.class);
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setPersistenceUnitName("{dbname}");
bean.setEntityManager(entityManagerFactoryBean.getObject().createEntityManager());
bean.setBeanClassLoader(this.getClass().getClassLoader());
bean.setEntityPathResolver(resolver);
bean.afterPropertiesSet();
/*
创建bean 放入容器
*/
UserRepository repository= (UserRepository) bean.getObject();
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)
applicationContext.getAutowireCapableBeanFactory();
beanFactory.registerSingleton("{dbname}_userRepository",repository);
}
}
3 根据用户身份路由到不同的dao对象去操作数据库
一般用户登录后数据库信息放入ThreadLocal,业务层查询数据时 通过数据库信息获取到对应的dao进行查询
UserRepository repository = applicationContext.getBean("{dbname}_UserRepository", UserRepository.class);
代码过于简化但是流程和逻辑大家能看懂就行,看不懂就多看几遍_
网友评论