springboot jpa 动态数据源的实现

2019-06-11  本文已影响0人  远方夕阳

基于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);

代码过于简化但是流程和逻辑大家能看懂就行,看不懂就多看几遍_

上一篇下一篇

猜你喜欢

热点阅读