springboot多数据源@DS注解不生效

application.yml配置文件

spring:
  #配置数据源
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:postgresql://192.168.10.68:5432/gd_y_plus
          username: gd_y_plus
          password: gd_y_plus
          driver-class-name: org.postgresql.Driver
        wiki:
          url: jdbc:postgresql://192.168.10.68:5432/wikijs_db
          username: wikijs
          password: wikijs
          driver-class-name: org.postgresql.Driver

失败场景

@Override
    public void addUserAndRole(SysUser sysUser, List<SysUserRole> sysUserRoleList,Boolean addUsers) {
        //新增或更新
        this.saveOrUpdate(sysUser);    //将用户信息新增到gd_y_plus数据库
        // 2022-09-26 新增用户到 wikijs
        if (addUsers){
           usersService.saveUsers(sysUser);

        }

        //保存用户角色之前,先删除之前的历史数据
        sysUserRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
                .eq(SysUserRole::getUserId, sysUser.getId()));
        sysUserRoleList.forEach(e -> sysUserRoleMapper.insert(e));
    }

失败原因

@DS 注解受事务的影响 上述代码中我们gd_y_plus数据库的数据中操作wikijs数据库 这是不行的,解决方式就是在 操作wikijs相应方法中新开一个事务

解决方式

  @DS("wiki") //切换数据源
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) //开启一个新事务
    @Override
    public void saveUsers(SysUser sysUser) {

        Users users = new Users();
        int userId = mapper.getUserId();
        users.setId(userId);
        users.setEmail(sysUser.getUsername());
        users.setPassword(sysUser.getPassword());
        users.setName(sysUser.getFullName());
        users.setActive(true);
        users.setVerified(true);
        users.setCreatedAt(LocalDateTime.now().toString());
        users.setUpdatedAt(LocalDateTime.now().toString());
        mapper.insert(users);

        UserGroups userGroups = new UserGroups();
        userGroups.setUserId(userId);
        userGroups.setGroupId(1);
        userGroupsService.save(userGroups);
    }


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐