freyja v2 버 전 발표
6565 단어 판본
freyja 는 orm, sharding, cache 에 다시 중심 을 둔다.
1. 더 완벽 한 orm
2. 응용 층 차단 의 바 텀 sharding
3. 응용 층 의 cache
그럼 바로 코드 를 넣 겠 습 니 다.
오픈 소스 경험 이 없어 서 프 리 지 아의 사상 과 코드 를 직접 소개 했다.
1. cache 부분 은 spring aop cache 로 직접 바 뀌 었 습 니 다.
spring cache 확장
주석 몇 개 추가:
CacheDelete, CacheListReplace 등등...
현재 두 가지 문제 가 존재 합 니 다. 1. 스 레 드 가 안전 한 것 이 아 닙 니 다.2. 어떻게 하면 spring 의 cache 주해 처럼 스 캔 될 수 있 는 지 모 르 겠 습 니 다. http://www.iteye.com/problems/83419
또한, cache 는 free yja v2 와 아무런 관계 가 없다.
cache 의 소 개 는 약간 적 고 캐 시 는 상부 에 가 까 울 수록 효율 이 높다.그래서 기본적으로 freyja v1 의 캐 시 에 대한 이 해 를 포기 하고 상위 캐 시 로 바 꾸 었 습 니 다.
주 해 를 통 해 캐 시 관 계 를 유지 합 니 다.위의 spring cache 확장 은 실제로 전에 쓴 것 으로 현 재 는 이 를 크게 바 꾸 었 다.짝 퉁, spring 자체 cache 를 확장 하여 spel 표현 식 을 사용 합 니 다. CacheSave 라 는 주 해 는 약간 다 릅 니 다. key 는 반환 값 을 가 져 왔 습 니 다. 나중에 소 개 를 추가 할 것 입 니 다.
2、orm
orm 부분 은 자신의 annotation: @ Id, @ Column, @ Table, @ Transient 를 사용 하여 실체 와 표 의 관 계 를 표시 합 니 다.
orm 은 순수 jdbc 보다 지출 이 한 층 의 sql 분석 에 있 습 니 다. sql 분석 은 온도 가 적은 alibaba. druid 의 sql parser 부분 에 맡 겼 습 니 다.
(온 소 는 누구 입 니까?:http://code.alibabatech.com/wiki/dashboard.action)
해석 의 효율 이 매우 높 고 구체 적 으로 얼마나 높 은 지 나 는 구체 적 으로 테스트 한 적 이 없다.비용 이 아무리 많이 들 어도 프로젝트 에 있어 서 무시 할 수 있 는 비용 이 라 고 생각 합 니 다. 프로젝트 의 sql 은 모두 sql 을 미리 컴 파일 하기 때문에 이 층 이 캐 시 되 었 기 때문에 비용 은 무시 할 수 있 습 니 다.
orm 의 문법 은 이전 판 과 기본적으로 일치 합 니 다.
3、sharding
Freyja 2 버 전의 라 이브 러 리 시트 처리 방식
sharding 부분 과 orm 은 기본적으로 아무런 관계 가 없 으 며, 이 부분 은 순수 sql 에 만 처 리 됩 니 다.저 는 freyja 의 sharding 방식 이 완벽 해 지 는 것 같 아 요.
freyja v2 의 sharding 은 @ SubColumn 에서 라 이브 러 리, 테이블 방식 을 결정 합 니 다. @SubColumn 은 이 필드 를 기준 으로 기록 을 구분 합 니 다.
public DbResult getShardingTableName(Object value) {
String tableName = getTableName();
int hashCode = value.hashCode();
if (hashCode < 0) {
hashCode = -hashCode;
}
int dbNo = hashCode % ShardingUtil.engine.getDbNum();
int tableNo = hashCode % ShardingUtil.engine.getTableNum();
tableName = tableName + "_" + tableNo;
return new DbResult(tableName, tableNo, dbNo);
}
public DbResult getShardingTableNameById(Object idValue) {
String tableName = getTableName();
if (idValue == null || !isSubTable()) {
return new DbResult(tableName, -1, -1);
} else {
int n = (Integer) idValue / ShardingUtil.engine.getIdSubNum();
int dbNo = n / ShardingUtil.engine.getTableNum();
int tableNo = n % ShardingUtil.engine.getTableNum();
tableName = tableName + "_" + tableNo;
return new DbResult(tableName, tableNo, dbNo);
}
}
spring jdbc 의 AbstractRouting DataSource 와 결합 하여 다 중 데이터 소스 작업 환경 에 도달 합 니 다.
구체 적 으로 tuser 표 는 라 이브 러 리, 표 분할 작업 을 합 니 다.
1、
<property name="jdbcTemplate" ref="jdbcTemplate" />
<property name="packagesToScan" value="com.x.data.bean" />
<property name="freyjaProperties">
<value>
show_sql=true
db_num=2
table_num=2
id_sub_num=1000000
</value>
</property>
</bean>
db 설정num、table_num、id_sub_num
id_sub_num 은 매 표 용량 이 며, 별도로 표를 만 들 때 대응 하 는 자동 성장 시작 값 을 수정 해 야 합 니 다.
<bean id="baseDataSource" parent="parentDataSource">
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.user}" />
<property name="password" value="${mysql.password}" />
</bean>
<bean id="dataSource" class="com.guyu.core.spring.datasource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.Integer">
<entry key="0" value-ref="pu_game_0" />
<entry key="1" value-ref="pu_game_1" />
</map>
</property>
<property name="defaultTargetDataSource" ref="baseDataSource" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
2. User 실체 에 @ Table (name = "t user", isSubTable = true) 을 추가 해 야 합 니 다.
이 시 계 를 표시 하려 면 절 분 이 필요 하 다.
3、 @Column(name = "open_id")
@SubColumn(isSubColumn = true)
private String openId;
그 중 하 나 를 선택 하여 SubColumn 으로 표시 해 야 합 니 다.
sharding 은 순수 jdbc 를 대상 으로 합 니 다. 관심 있 는 것 은 druid 의 sql parser (ps: 자료 가 적 습 니 다) 를 연구 할 수 있 습 니 다.
기타 보충:
1. 왜 free yja 1 과 2 는 모두 spring jdbc 를 사용 합 니까?
특별한 이유 없 이 히 베 네 이 트 를 사용 해 왔 지만 먼저 접촉 한 spring jdbc 는 괜 찮 으 면 사용 했다.또한 spring jdbc 자체 가 orm 에 가 까 워 개조 했다.
2、druid
freyja v1 을 할 때 실제로 druid 의 sql parser 기능 을 알 고 있 었 지만 외국인 jsqlparser 가 일찍 나 와 서 쓰 는 사람 이 많 으 면 좋 을 것 같 아서 jsqlparser 를 사용 했다.
나중에 v2 를 하면 서 sharding 기능 을 발전 시 켰 을 때 온 소 에 게 연락 을 했 는데 그 는 나 에 게 sql parser 를 보 여 주 었 다.결 과 는 정말 대단 하 다.sql parser 는 무엇 을 원 하 는 지, 예 를 들 어 orm 부분 sql parser 는 직접 지원 하고 매우 편리 합 니 다.문제 가 좀 있 었 지만 온 소 에 게 피드백 을 주 고 는 금방 해 결 됐 습 니 다.sharding 기능 도 교류 과정 에서 생 긴 것 이다.
첨부 파일 의 압축 패키지 의 druid0.2.11111. jar 는 sharding 지원 을 포함 하 는 버 전 입 니 다.druid 의 최신 버 전이 이 부분 을 포함 하고 있 는 지 모 르 겠 습 니 다.
대량의 테스트 테스트 테스트 와 테스트 가 필요 합 니 다. 현재 free yja v2 는 프로젝트 에 사용 되 고 있 으 며 복구 와 추가 가 필요 한 기능 은 실제 응용 에 따라 달라 집 니 다.
cache, orm, sharding 부분의 실현 방향 에 대해 토론 하 시기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[nginx] 어떤 모듈 이 설치 되 어 있 는 지 확인 합 니 다.설치 할 때 어떤 모듈 이 설치 되 어 있 는 지 잊 어 버 리 면 설 치 된 모듈 을 확인 해 야 합 니 다. 어떤 모듈 이 설치 되 어 있 는 지 확인 합 니 다. 포맷 된 명령 이 있 습 니 다. 소문 자 v ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.