美文网首页
springboot jpa 动态数据源的实现

springboot jpa 动态数据源的实现

作者: 远方夕阳 | 来源:发表于2019-06-11 17:35 被阅读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);
    

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

    相关文章

      网友评论

          本文标题:springboot jpa 动态数据源的实现

          本文链接:https://www.haomeiwen.com/subject/bgxcfctx.html