여기서 단순히 달 서브 테이블을 수행하는 효과는 다음과 같이 도시된다 :
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 ( "성공을 추가" ); 반환 결과를 ;}