Spring 은 ThreadLocal 의 '자원 - 사무' 스 레 드 바 인 딩 디자인 을 바탕 으로 합 니 다.
8341 단어 threadLocal
http://blog.csdn.net/bluishglc/article/details/7784502 전재 출처 를 밝 혀 주세요!
"원본" 데이터 접근 쓰기
데이터 베이스 와 같은 사무 적 특성 을 가 진 모든 자원 시스템 을 방문 하 는 것 은 똑 같은 특징 을 가진다. 먼저 자원 에 접근 하 는 '파이프' 를 얻어 야 한다. 데이터 베이스 에 있어 서 이른바 '파이프' 는 JDBC 의 Connection 이 고 Hibernate 의 Session 이다. 그러면 '파이프' 를 통 해 일련의 읽 기와 쓰기 명령 을 내 릴 것 이다. 예 를 들 어 데이터 뱅 크 의 SQL 등 이다.마지막 으로 이 '파이프' 를 끊 고 이 자원 에 대한 연결 을 풀 것 입 니 다.Spring 에 서 는 자원 에 접근 하 는 '파이프' 로 자원 을 가리 키 기 때문에 JDBC 의 Connection 과 Hibernate 의 Session 은 모두 '자원' (Resource) 이 라 고 불 린 다.다른 한편, 자원 과 사 무 는 밀접 한 관 계 를 가진다. 업무 의 시작 과 제출 은 모두 특정한 '리 소스' 에서 진행 된다.Hibernate 의 경우 '원본' 데이터 접근 프로그램 이 다음 과 같이 쓰 입 니 다.
Session session = sessionFactory.openSession();// “ ”
Transaction tx = null;
try {
tx = session.beginTransaction(); //
....
DomainObject domainObject = session.load(...); //
....
domainObject.processSomeBusinessLogic();//
....
session.save(domainObject); //
....
myDao.save(anotherDomainObject); //
....
session.commit(); //
}
catch (RuntimeException e) {
tx.rollback();
throw e;
}
finally {
session.close(); //
}
상기 코드 의 사고방식 은 매우 솔직 하 다. 먼저 데이터베이스 '자원' 을 얻 은 다음 에 이 자원 에서 업 무 를 시작 하고 일련의 업무 계산 과 데이터 접근 이 섞 인 작업 을 거 친 후에 업 무 를 제출 하고 자원 을 방출 한다.
층 을 나 누 어 가 져 온 괴로움
많은 사람들 이 상기 코드 의 문 제 를 단번에 알 수 있 을 것 이 라 고 믿는다. 업무 논리 와 데이터 방문 이 섞 여 층 을 나 누 는 '금기' 를 범 했다.좋 은 레이 어 링 시스템 은 흔히 상기 코드 를 실현 한다. Service 를 사용 하여 업무 논 리 를 실현 하고 DAO 를 사용 하여 Service 에 데이터 접근 지원 을 제공한다.
어떤 서비스의 실현 클래스:
public class MyServiceImpl implements MyService {
public void processBusiness(){
// ?NO! API,“ "Service, !
//Session session = sessionFactory.openSession();
//session.beginTransaction();
....
DomainObject domainObject = myDao.getDomainObject(...); //
....
domainObject.processSomeBusinessLogic();//
....
myDao.save(domainObject); //
....
myDao.save(anotherDomainObject); //
....
}
....
}
어떤 DAO 의 Hibernate 구현 클래스:
public class MyDaoHibernateImpl implements MyDao {
public void save(DomainObject domainObject){
// ?NO!
// ? Service。
//Session session = sessionFactory.openSession();
//session.beginTransaction();
....
session.save(domainObject);
}
....
}
모순 의 초점
'분 층' 의 측면 에서 볼 때 상기 방안 은 '완벽' 이 라 고 할 수 있 지만 현실 적 인 기술 문 제 를 피 했다. '자원 획득' (즉, session) 과 '사무 시작' 코드 를 어떻게 배치 합 니까?코드 에 주석 이 있 는 것 처럼 어디 에 두 어도 문제 가 있 는 것 같 습 니 다. '조 화 롭 지 못 한' 모순 처럼 보 입 니 다.만약 에 이 '조 화 롭 지 못 한' 모순 을 해결 하려 면 기술적 으로 두 가지 어 려 운 문 제 를 해결 해 야 한다.
Spring 의 해결책
Spring 은 AOP 기반 성명 식 사무 정 계 를 사용 하여 첫 번 째 문 제 를 해결 하 였 으 며, ThreadLocal 기반 자원 과 사무 스 레 드 를 연결 하여 두 번 째 문 제 를 성공 적 으로 해결 하 였 습 니 다.(spring 의 구체 적 인 실현 에 대해 제 다른 글 을 참고 할 수 있 습 니 다. Spring 소스 코드 분석 (1) Spring 트 랜 잭 션 제어 Hibernate 첫 번 째 문제 와 관련 된 소스 코드 는 주로:
org. springframework. aop. framework. JdkDynamicAopProxy 와 org. springframework. transaction. interceptor. TransactionInterceptor
두 번 째 문제 와 관련 된 소스 코드 는 주로:
org. springframework. transaction. support. AbstractPlatformTransactionManager 와 org. springframework. transaction. support. TransactionSynchronizationManager)
본 고 는 Spring 이 두 번 째 문 제 를 어떻게 해결 하 는 지 에 중심 을 두 고 이 문제 에 대해 두 가지 특별한 설명 이 필요 하 다.
Hibernate 는 스스로 풍족 하 게 생활 한다.
우 리 는 에피소드 로 Hibernate 에 대해 이야기 했다.아마도 Session - Per - Transaction 에 대한 보편적 인 수 요 를 만족 시 키 기 위해 Hibernate 도 자신의 Session - Per - Transaction 모델 을 실 현 했 습 니 다. 바로 여러분 이 알 고 있 는 Session Factory. getCurrentSession () 입 니 다. 이 방법 은 현재 스 레 드 에 연 결 된 session 인 스 턴 스 를 되 돌려 줍 니 다. 현재 스 레 드 에 session 인 스 턴 스 가 없 으 면 ThreadLocal 형식 으로 현재 스 레 드 에 연 결 된 새로운 인 스 턴 스 를 만 듭 니 다.이 동시에 이 방법 으로 생 성 된 session 은 사실 session 대리 입 니 다. 이 대 리 는 내부 의 실제 session 에 다음 과 같은 동작 을 추가 합 니 다.
바로 이 두 가지 가 세 션 과 트 랜 잭 션 이 일치 하 는 생명 주 기 를 유지 하도록 확보 한 것 이다.
모든 것 이 이렇게 진행 되 었 다.
상기 장면 과 Spring 의 해결 방안 을 결합 하여 Spring 성명 성 사 무 를 사용 하여 좋 은 분 층 절 차 를 실현 했다. 그의 자원 과 사 무 는 Spring 의 통제 하에 이렇게 일 했다.
작은 총화
Spring 소스 코드 분석 (1) Spring 트 랜 잭 션 제어 Hibernate
데이터베이스 라 이브 러 리 분 표 (sharding) 시리즈 (3) 사용 프레임 워 크 또는 자체 개발 및 sharding 실현 차원 에 대한 고려
데이터베이스 라 이브 러 리 시트 (sharding) 시리즈 (2) 전역 메 인 키 생 성 정책
데이터베이스 라 이브 러 리 시트 (sharding) 시리즈 (1) 분할 실시 전략 및 예시
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 동적 에이전트 사용 - ThreadLocal 트 랜 잭 션 관리동적 에이전트: JDK 동적 에이 전 트 는 인 터 페 이 스 를 실현 한 클래스 만 에이전트 에 들 어 갈 수 있 습 니 다. JDK 동적 에이 전 트 를 사용 하려 면 InvocationHandler 인 터 페 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.