JBoss 5 MySQL Replication 접속
만일 MySQL 이 Replication 되어 있다고 한다면 Master 는 read/write 를 Slave 는 read Only 만 하도록 접속을 하고 싶을 것이다. MySQL Connector/J 의 최신버전은 이러한 접속을 지원 한다.
다음은 MySQL Replication 접속을 위한 mysql-ds.xml 예제다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?xml version="1.0" encoding="UTF-8"?> <!-- $Id: mysql-ds.xml 41017 2006-02-07 14:26:14Z acoliver $ --> <!-- Datasource config for MySQL using 3.0.9 available from: http://www.mysql.com/downloads/api-jdbc-stable.html --> <datasources> <!-- mysql DS --> <local-tx-datasource> <jndi-name>MySQLDS</jndi-name> <connection-url>jdbc:mysql:replication://address=(protocol=tcp)(host=192.168.96.31)(port=3306)(type=master),address=(protocol=tcp)(host=192.168.96.30)(port=3306)(type=slave)/spring?useUnicode=true&characterEncoding=UTF-8&autoReconnect=false&useSSL=false&failOverReadOnly=true&loadBalanceStrategy=random&readFormMasterNoSlaves=true</connection-url> <driver-class>com.mysql.jdbc.ReplicationDriver</driver-class> <user-name>spring</user-name> <password>12345</password> <min-pool-size>5</min-pool-size> <max-pool-size>50</max-pool-size> <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> <!-- should only be used on drivers after 3.22.1 with "ping" support --> <!-- <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name> --> <!-- sql to call when connection is created <new-connection-sql>some arbitrary sql</new-connection-sql> --> <!-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql> --> <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) --> <metadata> <type-mapping>mySQL</type-mapping> </metadata> </local-tx-datasource> </datasources> |
‘connection-url’, ‘driver-class’ 을 유심히 봐야 한다.
mysql-ds 에서의 설정은 MySQL 의 접속을 이중으로 하도록만하고 실제 쿼리를 분기하기 위해서는 DAO 에서 @Transactional(readOnly=true) 를 주어야 한다. 이 어노테이션은 읽기만을 하다는 것을 알려주고 이는 MySQL Slave 에 접속하게 된다.
각 메소드마다 어노테이션을 주기 싫다면 AOP 를 이용하는 방법도 있다.
1 2 3 4 5 6 7 8 9 10 11 12 |
<!-- required to connect Slave Server only for get* method on MySQL Replication --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> <tx:method name="get*" read-only="true"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut expression="execution (* com.sbhyun.service.*.*(..))" id="services"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="services"/> </aop:config> |
service 클래스에 get* 메소드들에는 자동으로 read-only=true 가 설정된다. 이렇게 되면 쿼리를 보낼때마다 Slave 서버에 보내게 되어 쿼리연산이 분산된다.