MySQL Master/Slave 환경구축 (JPA편)

1.EntityManager를 Master와 Slave로 나누어 사용하기 개인적으로 추천하는 방법이다. 우선 Data Source 는 아래와 같이 Master 와 Slave 를 설정한다. [crayon] masterDatasource true jdbc:mysql://localhost:3306/test1107 com.mysql.jdbc.Driver user password slaveDatasource true jdbc:mysql:loadbalance://localhost:3307,localhost:3308/test1107 com.mysql.jdbc.Driver user password [/crayon] 그 다음은 JPA를 이용하기 위한 persistence.xml 설정이다. [crayon] org.hibernate.ejb.HibernatePersistence java:/masterDatasource org.hibernate.ejb.HibernatePersistence java:/slaveDatasource [/crayon] 마지막으로 EntityManager 의 설정은 Seam의 경우, components.xml 을 이용한다. [crayon] [/crayon] 설정은 여기까지이다. Seam에서 사용할때는 아래와 같이 인젝션하여 EntityManager를 나누어서 사용하면 된다. [crayon] @In(“entityManagerMaster”) private EntityManager emMaster; @In(“entityManagerSlave”) private EntityManager emSlave; [/crayon] 당연한 이야기이지만 emMaster는 insert/update/delete 에 사용하고 select는 emSlave를 이용한다.

2.EntityManager를 1개만 이용하기

이 부분은 생략하기로 한다. 왜냐하면 JPA에서는 Connection 을 가져오기가 너무나 번거롭기 때문이다. [crayon] org.hibernate.Session session = (org.hibernate.Session) em.getDelegate(); SessionFactoryImplementor sfi = (SessionFactoryImplementor) session.getSessionFactory(); ConnectionProvider cp = sfi.getConnectionProvider(); Connection conn = cp.getConnection(); [/crayon] 문제는 이렇게 Connection 을 가져와서 setReadOnly(true); 를 설정했다 하더라도, JTA(Java Transaction API)가 아래와 같은 에러를 발생시킨다.
14:58:47,917 WARN [JDBCExceptionReporter] SQL Error: 0, SQLState: null 14:58:47,917 ERROR [JDBCExceptionReporter] You cannot set read only during a managed transaction!
결국은 이 문제를 해결하기 위해 어플리케이션 전체의 트랜잭션 관리 방법을 변경해야 하는데, 굳이 첫번째의 간편한 방법이 있기 때문에 이 방법을 사용할 일은 없을것이다. 아마, Hibernate나 JPA를 이용하지 않고 전통적인 JDBC 를 이용하는 경우에는 어쩌면 이 방법이 어울릴지 모르겠다. session 에서 doWork 메소드에 Work 를 설정하면 Connection 을 가지고 커스터마이즈할 수 있는듯하다. [crayon] org.hibernate.Session session = (org.hibernate.Session)em.getDelegate(); session.doWork(new Work() { public void execute(Connection conn) throws SQLException { // org.jboss.resource.adapter.jdbc.jdk5.WrappedConnectionJDK5 conn.setReadOnly(true); } }); [/crayon] 하지만, 위와 같이 하여도 역시 똑같은 에러가 발생하는걸로 미루어, JTA의 트랜잭션 관리 방법을 변경하지 않으면 역시 안될것같다. 참고사이트 http://www.dragishak.com/?p=307 https://community.jboss.org/thread/153626 ]]>

Related Posts

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다