springboot 통합 샤딩은-JDBC 개월 MySQL의 테이블로 포인트를 달성

여기서 단순히 달 서브 테이블을 수행하는 효과는 다음과 같이 도시된다 :

1 추가 종속성

      <의존성> 
            <의 groupId> io.shardingsphere </의 groupId> 
            <artifactId를> 샤딩-JDBC 스프링 부팅 스타트 </ artifactId를> 
            <version>은 3.0.0.M2 </ 버전> 
         </ 의존성> 
        <의존성> 
            <의 groupId > io.shardingsphere </의 groupId> 
            <artifactId를> 샤딩-JDBC 스프링 네임 스페이스 </ artifactId를> 
            <version>은 3.0.0.M2 </ 버전> 
        </ 의존성>

2. 구성 속성 파일

sharding.jdbc.driver = com.mysql.jdbc.Driver 
sharding.jdbc.url = JDBC한다 : mysql : // IP : 3306 / gw_dashboard useUnicode = TRUE & A; characterEncoding = utf8mb4 
sharding.jdbc.username = 사용자 
sharding.jdbc.password = 비밀번호

3 (MyBatis로 - 구성의 향상에 기초하여) 구성 샤딩-config.xml 파일

    <빈 ID = "shardingDataSource" 클래스 = "com.alibaba.druid.pool.DruidDataSource" 
        초기화 -method = "초기화"를 = "닫기"-방법 파괴> 
        <속성 이름 = "driverClassName"값 = "$를 {sharding.jdbc } .driver "/> 
        <속성 이름 ="URL "값 ="$ {sharding.jdbc.url} "/> 
        <속성 이름 ="사용자 이름 "값 ="$ {sharding.jdbc.username} "/> 
        <속성 = 이름 "암호"값 = "$ {sharding.jdbc.password}"/> <! - 구성 제한 시간을 대기 연결을 획득 -> 
        <속성 이름 = "maxWait"값 = "6000"/>    <! - -> - 간격 그러한 검출 주파수 유휴 연결 밀리 닫아야 검출
        <속성 명 = "timeBetweenEvictionRunsMillis"값 = "60000"/> <! - 최소 연결 시간 생존 풀 밀리 배치 ->
       

     
    
       
        <속성 명 = "minEvictableIdleTimeMillis"값 = "300000"/> 
    
        <속성 명 = "validationQuery"값 = "SELECT 'X'"/> 
        <속성 명 = "testWhileIdle"값 = "참"/> 
        <속성 명 = " testOnBorrow "값 ="거짓 "/> 
        <속성 이름 ="testOnReturn "값 ="거짓 "/>    <! -打开PSCache,并且指定每个连接上PSCache的大小-> 
        <속성 이름 ="poolPreparedStatements "값 = "거짓"/> 
        <속성 이름 = "maxPoolPreparedStatementPerConnectionSize"  = "20"/>
         <! -配置监控统计拦截的필터 ->
        <속성 이름 = "필터"값 = "STAT"/> 
    </ 빈>  <! - 구성 하위 테이블 기반 알고리즘,이 클래스에 대해서는 후술한다 -> 
    <콩 ID = "shardingAlgorithm"

     
  클래스 = "com.example.shardingsphere.util.ShardingAlgorithm"/> <-根据"ID"字段来分表t_sentinel_metric是要主表名称->! <샤딩 : 표준 전략 ID = "tableShardingStrategy" 샤딩 칼 럼 = "ID"정확한 알고리즘-REF = "shardingAlgorithm"/> <샤딩 : 데이터 소스 ID = "shardingDS"> <샤딩 : 샤딩 룰 데이터 소스 이름 = "shardingDataSource"> <샤딩 : 테이블 규칙> <샤딩 : 테이블 규칙 로직 테이블 = " t_sentinel_metric " 테이블 -strategy-REF = "tableShardingStrategy"/> </ 샤딩 :테이블 규칙> </ 샤딩 : 샤딩 규칙> </ 샤딩 : 데이터 소스> <콩 ID = "SqlSessionFactory는"클래스 = "org.mybatis.spring.SqlSessionFactoryBean"> <속성 명 = 데이터 소스 ""REF = "shardingDS"/> <속성 명 = "mapperLocations" = "클래스 경로 * 매퍼 / ** / * Mapper.xml"/ > <속성 명 = "typeAliasesPackage"값 = "com.example.shardingsphere.dao.model"/> </ 빈> <빈 클래스 = "org.mybatis.spring.mapper.MapperScannerConfigurer"> <속성 명 = "basePackage" 값 = "com.example.shardingsphere.dao.mapper"/> 클래스 <속성 명 = "sqlSessionFactoryBeanName "값 ="SqlSessionFactory는 "/> <! - <속성 이름 = "annotationClass"값 = "com.gmall88.server.mybatis.MyBatisRepository"/> -> </ 콩> <콩 ID = "SQLSESSION" = "org.mybatis.spring.SqlSessionTemplate" 범위 = "프로토 타입"> <생성자 인수 인덱스 = "0"REF = "SqlSessionFactory는"/> </ 콩> <콩 ID = "JdbcTemplate을" 클래스 = "org.springframework.jdbc.core.JdbcTemplate"> <속성 이름 = 데이터 소스 ""REF = "shardingDS"> </ 속성> </ 콩>

(4) 서브 테이블 기반 알고리즘 ShardingAlgorithm

공공  클래스 ShardingAlgorithm 구현 PreciseShardingAlgorithm <문자열> { 

    / **  
     * = 작업에 SQL, 테이블 매핑 
   * 이름 테이블이 전달 된 날짜에 따라 이름
* / @Override 공공 문자열 doSharding (컬렉션 <문자열> 테이블 이름, PreciseShardingValue <문자열> shardingValue ) { 문자열 TABLENAME = shardingValue.getLogicTableName (); 문자열 키 = shardingValue.getValue () 문자열 (0 ,. 6 ) 복귀 tableName.concat ( "_" ) .concat (키); } }

5, 하위 테이블을 만들 타이머를 할 테이블을 만들 시간 초과

  @Autowired
     개인 의 JdbcTemplate JdbcTemplate을;
    개인  정적 에는 DateFormat millisdf는 = 새로운 SimpleDateFormat의 ( "yyyyMMddHHmmssSS을" ); 

    공용  정적 스트링 getLogID는 () {
         반환 getmillisTime을 () + (( INT ) (인 Math.random () * 1000) + 1,000 ); 
    } 

    공공  정적 문자열 getmillisTime () { 
        달력 C = Calendar.getInstance (); 
        c.setTime ( 새로운 날짜 ()); 
        c.add (Calendar.MONTH, +1 ); 
        날짜는 m = c.getTime을 ();
        반환 millisdf.format (m)를; 
    } 

    @RequestMapping (값 = "/ createSentinelTable는" ) 
    @ResponseBody 
    공개 개체는 createSentinelTable (HttpServletResponse를 대응) 발생 예외 { 
        ReturnResult 결과 = )를 ReturnResult (; 
        CONN 연결 = 널 (null) ; 
        ResultSet의 RS = ;
        시도 { 

            문자열 TABLENAME을 = "t_sentinel_metric" ; 
            문자열 YM = getLogID () 부분 문자열 (0, 6. ); 
            문자열 테이블= tableName.concat ( "_" ) .concat (YM); 
            CONN = jdbcTemplate.getDataSource ()의 getConnection을 ().; 
            RS = conn.getMetaData ()의 getTables. (  ,  , 테이블 );
            경우 (rs.next ()) { 
                logger.info ( "테이블이 존재합니다!" ); 
            } 다른 { 
                문자열 c_sql는 = + 테이블 + "표 만들기" "(아이디 VARCHAR (100) NOT NULL을 날짜 DEFAULT NULL의 gmt_create," 
                        + ", 날짜 DEFAULT NULL의 응용 프로그램 VARCHAR (100) DEFAULT NULL의 날짜 DEFAULT NULL의 _timestamp을 gmt_modified"
                        + "자원 VARCHAR는 (500) 초기 NULL은 BIGINT (11) DEFAULT '0'pass_qps BIGINT (11) DEFAULT '0'success_qps" 
                        "+"block_qps BIGINT (11) DEFAULT '0'exception_qps의 INT (11) 디폴트 0 'RT 이중 DEFAULT의 NULL, _count INT (11) DEFAULT "0", " 
                        +"resource_code의 INT (11) 초기 NULL, PRIMARY KEY (`id`) KEY`INDEX_TIMESTAMP` (`_timestamp`), " 
                        +" KEY`INDEX_TSP_RESOURCE` (`_timestamp`,`resource`)) " ; 
                jdbcTemplate.execute (c_sql); 
                logger.info ( "테이블 성공을 만들!" ); 
            } 
            결과. setCode (ReturnCodeType.SUCCESS); 
        } 캐치 (예외 E) { 
            logger.error (e.getMessage (), E); 
            result.setCode (ReturnCodeType. 
        } 마지막으로 {
             경우 (RS! = null이 ) { 
                rs.close (); 
            } 
            경우 (CONN =! ) { 
                conn.close (); 
            } 
        } 
        리턴 결과; 
    }

그림과 같이 테이블 구조를 생성 :

 

6 서브 라이브러리 서브 테이블의 실제 상황에 따라 (반드시 기본 키)에 따른 포인트를 결정하는 필드에 레코드 삽입, I 사용 기본 키,

성장에서 데이터베이스의 동일한 기본 키를 사용할 수 없습니다, 이전과 기본 키 중복이있을 것

개인  정적 에는 DateFormat millisdf는 = 새로운 SimpleDateFormat의 ( "yyyyMMddHHmmssSS을" );
    공용  정적 스트링 getLogID는 () {
     반환 getmillisTime을 ()
         + (( INT ) (인 Math.random () * 1000) +1000 ); 
    } 
    공공  정적 문자열 getmillisTime () {
         반환 millisdf.format ( 새로운 날짜 ()); 
    }
공개 returnResult addSentinelMetric () { 
        returnResult 결과 = 새로운 새 returnResult (); 
        SentinelMetric SM 새로운 새 = SentinelMetric을 (); 
        sm.setId ( getLogID ()), 할당 테이블을 결정하는 점 // 할당 구성 ID,     
        sm.setResource를 ( "데모 " )  sm.setApp ("데모 " )  sm.setPassQps (1L ) sm.setBlockQps (1L ) sm.setSuccessQps (1L ) sm.setExceptionQps (1. ) sm.setRt (1D) sm.setCount (1 ) sm.setTimestamp는 (새로운 새로운 날짜 ()); sm.setGmtModified는 (새로운 새로운 날짜 ()); smMapper.insertSelective (SM) result.setCode (ReturnCodeType.SUCCESS) .setMessage ( "성공을 추가" ); 반환 결과를 ;}
 

 

추천

출처www.cnblogs.com/ouyanxia/p/11918627.html