사용자 도구

사이트 도구


java:jdbc:replication

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

다음 판
이전 판
java:jdbc:replication [2014/12/25 21:54]
kwon37xi 만듦
java:jdbc:replication [2023/02/16 13:51] (현재)
kwon37xi [Java JDBC Replication Connection Pool (DataSource)]
줄 1: 줄 1:
-====== Java JDBC Replication Connection Pool(DataSource) ======+====== Java JDBC Replication Connection Pool (DataSource) ======
 Master/Slave (Write/Read) replication connection pool 구현 방법. Master/Slave (Write/Read) replication connection pool 구현 방법.
  
-===== Springframework =====+  * [[https://github.com/kwon37xi/replication-datasource|replication-datasource]] 프로젝트 참조. 
 +  * [[java:jdbc:shardingsphere|Apache Sharding Sphere]] 
 + 
 +===== Springframework Transaction 사용시 =====
 Spring 프레임워크를 사용할 경우에는 [[http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.html|AbstractRoutingDataSource]]와 [[http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/LazyConnectionDataSourceProxy.html|LazyConnectionDataSourceProxy]]를 조합하면 ''@Transactional(readOnly=true|false)''로 Master/Slave 커넥션을 선언적으로 조정 가능하다. Spring 프레임워크를 사용할 경우에는 [[http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.html|AbstractRoutingDataSource]]와 [[http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/LazyConnectionDataSourceProxy.html|LazyConnectionDataSourceProxy]]를 조합하면 ''@Transactional(readOnly=true|false)''로 Master/Slave 커넥션을 선언적으로 조정 가능하다.
 +
 +이 방식은 Spring Framework의 Transaction과 함께 사용할 때만 작동한다.
 +
 +최종적으로 ''LazyConnectionDataSourceProxy''로 감싸야 하는 이유는 Spring이 Transaction을 시작할 때 트랜잭션 정보를 [[http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html|TransactionSynchronizationManager]]와 동기화 하기 전에 먼저 데이터소스에서 커넥션을 맺어버리기 때문이다.
 +''LazyConnectionDataSourceProxy''를 사용하면 동기화를 마친 뒤에 커넥션을 맺도록 실제 커넥션 맺는 시점을 늦출 수 있다.
  
 <code java> <code java>
줄 15: 줄 23:
 } }
  
 +// 실제로 Master DB에 접속하는 커넥션 풀
 DataSource masterDataSource = ...; DataSource masterDataSource = ...;
 +
 +// 실제로 Slave DB에 접속하는 커넥션 풀
 DataSource slaveDataSource = ...; DataSource slaveDataSource = ...;
  
 // @Bean으로 생성 // @Bean으로 생성
- 
 ReplicationRoutingDataSource rrds = new ReplicationRoutingDataSource(); ReplicationRoutingDataSource rrds = new ReplicationRoutingDataSource();
  
-Map<Object, Object> targetDataSources = new HashMap<>();+Map<Object, Object> targetDataSources = new HashMap<Object,Object>();
 targetDataSources.put("master", masterDataSource); targetDataSources.put("master", masterDataSource);
 targetDataSources.put("slave", slaveDataSource); targetDataSources.put("slave", slaveDataSource);
줄 28: 줄 38:
 rrds.setDefaultTargetDataSource(masterDataSource); rrds.setDefaultTargetDataSource(masterDataSource);
  
-// 최종 사용은 LazyConnectionDataSourceProxy 로 야한다.+// 최종적으로 Spring이 사용할 DataSource는 LazyConnectionDataSourceProxy 로 감싸야한다.
 DataSource dataSource = new LazyConnectionDataSourceProxy(rrds); DataSource dataSource = new LazyConnectionDataSourceProxy(rrds);
 </code> </code>
java/jdbc/replication.1419512055.txt.gz · 마지막으로 수정됨: 2014/12/25 21:54 저자 kwon37xi