문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 마지막 판 양쪽 다음 판 | ||
springframework:abstractroutingdatasource [2012/07/13 14:30] kwon37xi |
springframework:abstractroutingdatasource [2015/11/03 14:03] kwon37xi [Shard DataSource 구분자] |
||
---|---|---|---|
줄 8: | 줄 8: | ||
* [[http:// | * [[http:// | ||
- | ===== 주의할 점 ===== | + | ===== Shard DataSource 구분자 |
- | * AbstractRoutingDataSource를 사용할 경우 Transaction | + | * Shard DataSource 구분자를 Enum으로 만들자. |
- | * 따라서 **꼭 트랜잭션을 걸어주고, | + | * 개발을 하다보면 Shard 전체를 하나씩 돌면서 뭔가 |
+ | * 데이터 소스 구분자는 [[https:// | ||
+ | // ThreadLocal로 데이터 소스 구분자 보관 예제 | ||
+ | // 다른 예제들에서는 static 메소드로 구현했지만 그 경우 | ||
+ | // Bean 으로 생성할 수 있도록 | ||
+ | public class CustomerContextHolder { | ||
+ | | ||
+ | new ThreadLocal< | ||
+ | |||
+ | | ||
+ | Assert.notNull(customerType, | ||
+ | contextHolder.set(customerType); | ||
+ | } | ||
+ | |||
+ | | ||
+ | return (CustomerType) contextHolder.get(); | ||
+ | } | ||
+ | |||
+ | // 쓰레드가 종료될 때(특히 웹 애플리케이션의 경우 쓰레드 pool로 공유되기 때문에) 기존 데이터 clear가 필요하다. | ||
+ | | ||
+ | contextHolder.remove(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | * 웹 애플리케이션의 경우 Thread Pool로 쓰레드가 공유되기 때문에, Request 종료 시점에 해당 쓰레드의 컨텍스트를 clear 해주는 filter나 interceptor를 두는 것이 좋다. | ||
+ | |||
+ | ===== 트랜잭션 관련 주의할 점 ===== | ||
+ | * AbstractRoutingDataSource를 사용할 경우 Transaction 과 DataSource의 타입 지정 타이밍 처리에 주의해야 한다. | ||
+ | * Transaction이 시작되기 전에(보통은 '' | ||
+ | * DB가 변경되는 매 요청마다 트랜잭션을 안 걸어주면 한번 요청에 여러 DB접속이 필요할 경우 최초의 connection을 재사용하기 때문에 여러 DB 접속이 안된다. | ||
+ | * 따라서 **꼭 트랜잭션을 걸어주고, | ||
+ | * 트랜잭션 내부에서 다른 트랜잭션 호출시 커넥션 변경을 유발하라면 Propagation 규칙을 잘 적용해야 한다. | ||
+ | * '' |