springboot jpa 动态数据源的实现

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。