11. sharding - jdbc 통합 - ssm 기반

아비 자바, 전재 원본 출처 를 밝 혀 주세요. 감사합니다!
이 글 은 ssm (spring, springmvc, my batis) 구조의 프로그램 에 sharding - jdbc (버 전 1.5.4.1) 를 통합 하여 라 이브 러 리 를 나 누 는 방법 을 설명 한다.라 이브 러 리 분할 표 행 위 를 다음 과 같이 가정 합 니 다.
  • authuser 표 는 4 개의 라 이브 러 리 (user 0 ~ user 3) 로 나 뉜 다.
  • 기타 시 계 는 라 이브 러 리 분 표를 하지 않 고 default 에 보관 합 니 다.db 라 이브 러 리 중;

  • 1. POM 설정
    spring 프로필 의 경우 다음 POM 설정 을 추가 합 니 다.
    
        com.dangdang
        sharding-jdbc-core
        1.5.4.1
    
    
    
        com.dangdang
        sharding-jdbc-config-spring
        1.5.4.1
    
    

    이번 통합 sharding - jdbc 는 1.5.4.1 버 전 을 예 로 들 면 2. x 버 전의 sharding - jdbc 라면 좌표 com.dangdangio.shardingjdbc 로 수정 해 야 한다.또한, Yml 설정 이 라면 좌표 sharding-jdbc-config-springsharding-jdbc-config-yaml 로 수정 해 야 합 니 다.
    2. 데이터 원본 설정
    spring - datasource. xml 필요 한 모든 데이터 원본 을 다음 과 같이 설정 합 니 다 -- authuser 라 이브 러 리 시트 후 필요 한 4 개의 라 이브 러 리 user0~user_3, 그리고 라 이브 러 리 구분 표 가 없 는 기본 라 이브 러 리 defaultdb:
    
    
    
        
        
            
            
            
            
        
    
        
        
            
            
            
            
        
    
        
        
            
            
            
            
        
    
        
        
            
            
            
            
        
    
        
        
            
            
            
            
        
    
    

    properties 프로필 내용 은 다음 과 같 습 니 다.
    sj_user_0.driver=com.mysql.jdbc.Driver
    sj_user_0.url=jdbc:mysql://localhost:3306/user_0
    sj_user_0.username=root
    sj_user_0.password=RootAfei_1
    
    sj_user_1.driver=com.mysql.jdbc.Driver
    sj_user_1.url=jdbc:mysql://localhost:3306/user_1
    sj_user_1.username=root
    sj_user_1.password=RootAfei_1
    
    sj_user_2.driver=com.mysql.jdbc.Driver
    sj_user_2.url=jdbc:mysql://localhost:3306/user_2
    sj_user_2.username=root
    sj_user_2.password=RootAfei_1
    
    sj_user_3.driver=com.mysql.jdbc.Driver
    sj_user_3.url=jdbc:mysql://localhost:3306/user_3
    sj_user_3.username=root
    sj_user_3.password=RootAfei_1
    
    sj_default.driver=com.mysql.jdbc.Driver
    sj_default.url=jdbc:mysql://localhost:3306/default_db
    sj_default.username=root
    sj_default.password=RootAfei_1
    
    

    3. sharding 데이터 원본 통합
    spring - sharding. xml 설정 은 다음 과 같 습 니 다.
    
    
    
        
        
        
    
        
        
            
            
                
                    
                    
                
                
                
            
            
                true
                2
            
        
    
        
        
            
            
            
        
    
        
            
            
        
    
    
    

    설명: spring - sharding. xml 설정 의 라 이브 러 리 분류 규칙: authuser 표 에서 id 로 sjds_${0. 3} 의 네 개의 라 이브 러 리 에서 표 이름 은 변 하지 않 습 니 다.기타 표 는 id 에서 sjds_default 라 이브 러 리 에 서 는 라 이브 러 리 도 표 도 구분 하지 않 습 니 다.sharding - jdbc 를 통합 하 는 핵심 은 SqlSession Factory Bean 이 필요 로 하 는 dataSource 속성 을 shardingDataSource 으로 수정 하여 데이터 원본 을 sharding - jdbc 에 맡 기 는 것 입 니 다.
    라 이브 러 리 논리 AuthUserDatabaseShardingAlgorithm 의 코드 는 매우 간단 하 다. 소스 코드 는 다음 과 같다.
    /**
     * @author wangzhenfei9
     * @version 1.0.0
     * @since 2018 02 08 
     */
    public class AuthUserDatabaseShardingAlgorithm implements SingleKeyDatabaseShardingAlgorithm {
    
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        private static final int SHARDING_NUMBER = 4;
    
        @Override
        public String doEqualSharding(final Collection availableTargetNames, final ShardingValue shardingValue) {
            for (String each : availableTargetNames) {
                if (each.endsWith(shardingValue.getValue() % SHARDING_NUMBER + "")) {
                    logger.debug("the target database name: {}", each);
                    return each;
                }
            }
            throw new UnsupportedOperationException();
        }
    
        @Override
        public Collection doInSharding(final Collection availableTargetNames, final ShardingValue shardingValue) {
            Collection result = new LinkedHashSet<>(availableTargetNames.size());
            Collection values = shardingValue.getValues();
            for (Long value : values) {
                for (String each : availableTargetNames) {
                    if (each.endsWith(value % SHARDING_NUMBER + "")) {
                        result.add(each);
                    }
                }
            }
            return result;
        }
    
        @Override
        public Collection doBetweenSharding(final Collection availableTargetNames, final ShardingValue shardingValue) {
            Collection result = new LinkedHashSet<>(availableTargetNames.size());
            Range range = shardingValue.getValueRange();
            for (Long value = range.lowerEndpoint(); value <= range.upperEndpoint(); value++) {
                for (String each : availableTargetNames) {
                    if (each.endsWith(value % SHARDING_NUMBER + "")) {
                        result.add(each);
                    }
                }
            }
            return result;
        }
    }
    

    이 코드 는 sharding - jdbc 소스 코드 DatabaseShardingAlgorithm.java 인터페이스의 실현 을 참고 하면 됩 니 다. 예 를 들 어 ModuloDatabaseShardingAlgorithm.java;
    4. 주의사항
    sharding - jdbc 라 이브 러 리 구분 표 규칙 inline - expression 문 제 를 식별 할 수 없습니다. 예 를 들 어
  • 근본 적 인 원인: 근본 적 인 원인 은 spring 이 ${} 자리 차지 문자 로 생각 하기 때 문 입 니 다. ${0..3} 이 표현 식 은 properties 파일 에서 key 0..3 의 속성 을 찾 으 려 고 시도 합 니 다.그러나 여 기 는 sharding - jdbc 라 이브 러 리 분 표 규칙 의 inline 표현 식 입 니 다. spring 은 이러한 행 위 를 무시 해 야 합 니 다.그렇지 않 으 면 이상 을 던 집 니 다: java. lang. IllegalArgument 예외: Could not resolve place holder '0. 3' in value "sj ds ${0. 3}. auth user"
  • 해결 방법: 설정: 또는:
  • 5. 메 인 테스트
    Main. java 는 라 이브 러 리 테이블 의 OK 여 부 를 테스트 하 는 데 사 용 됩 니 다. 원본 코드 는 다음 과 같 습 니 다.
    /**
     * @author wangzhenfei9
     * @version 1.0.0
     * @since 2018 02 08 
     */
    public class Main {
    
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext(
                    "/META-INF/spring/spring-*.xml");
    
            // auth_user     ,
            AuthUserMapper authUserMapper = context.getBean(AuthUserMapper.class);
            AuthUser authUser = authUserMapper.selectByPrimaryKey(7L);
            System.out.println("-----> The auth user: "+JSON.toJSONString(authUser));
    
            // user_permission      
            UserPermissionMapper userPermissionMapper = context.getBean(UserPermissionMapper.class);
            UserPermission userPermission = userPermissionMapper.selectPermissionByUsername("wangzhenfei", "FINANCE_WALLET");
            System.out.println("-----< The user permission: "+JSON.toJSONString(userPermission));
        }
    
    }
    

    AuthUserMapper. selectByPrimary Key () 와 UserPermission Mapper. selectPermission ByUsername () 의 코드 는 라 이브 러 리 가 없 는 코드 와 완전히 같 습 니 다.
    6. 남 겨 진 문제
    Main 방법 테스트 나 서 비 스 를 시작 한 후의 호출 테스트 는 문제 가 없 지만 Junit 테스트 사례 를 통 해 방문 하면 이상 이 발생 하여 해결 해 야 할 남 겨 진 문제 입 니 다.
    org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 6: sj_ds_0,sj_ds_1,sj_ds_2,sj_ds_3,sj_ds_default,shardingDataSource
    

    좋은 웹페이지 즐겨찾기