11. sharding - jdbc 통합 - ssm 기반
이 글 은 ssm (spring, springmvc, my batis) 구조의 프로그램 에 sharding - jdbc (버 전 1.5.4.1) 를 통합 하여 라 이브 러 리 를 나 누 는 방법 을 설명 한다.라 이브 러 리 분할 표 행 위 를 다음 과 같이 가정 합 니 다.
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.dangdang
를 io.shardingjdbc
로 수정 해 야 한다.또한, Yml 설정 이 라면 좌표 sharding-jdbc-config-spring
를 sharding-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 문 제 를 식별 할 수 없습니다. 예 를 들 어
${}
자리 차지 문자 로 생각 하기 때 문 입 니 다. ${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"
또는:
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.