Spring + ibatis 동적 관리 데이터 원본

23446 단어 spring
Spring 동적 설정 다 중 데이터 소스, 즉 대형 응용 에서 데 이 터 를 분리 하고 여러 개의 데이터 베이스 인 스 턴 스 를 사용 하여 관리 하면 시스템 의 수준 신축성 을 효과적으로 향상 시 킬 수 있 습 니 다.이러한 방안 은 흔히 볼 수 있 는 단일 데이터 인 스 턴 스 방안 과 달리 프로그램 이 실 행 될 때 그 당시 의 요청 과 시스템 상태 에 따라 데 이 터 를 어느 데이터 베이스 인 스 턴 스 에 저장 하고 어느 데이터 베이스 에서 데 이 터 를 추출 할 지 동태 적 으로 결정 해 야 한다.
Spring 은 다 중 데이터 원본 의 방식 과 구체 적 인 사용 과정 을 설정 합 니 다. Spring 은 다 중 데이터 소스 에 대해 데이터 베이스 표를 참조 로 대체적으로 두 가지 상황 으로 나 눌 수 있다. 첫째, 표 급 의 크로스 데이터베이스.즉, 서로 다른 데이터 베 이 스 는 같은 표 (표 이름과 표 구조 가 완전히 같다) 가 있다. 둘째, 비표 급 의 크로스 데이터베이스.즉, 여러 데이터 원본 에 같은 표 가 존재 하지 않 는 다 는 것 이다. Spring2. x 버 전에 서 Proxy 모드 를 사용 하 는 것 은 우리 가 프로젝트 에서 가상 데이터 원본 을 실현 하고 이 를 통 해 데이터 원본 선택 논 리 를 밀봉 하면 데이터 원본 선택 논 리 를 Client 에서 효과적으로 분리 할 수 있 습 니 다.클 라 이언 트 는 선택 에 필요 한 컨 텍스트 를 제공 합 니 다 (클 라 이언 트 가 알 고 있 기 때 문 입 니 다). 가상 DataSource 는 클 라 이언 트 가 제공 하 는 컨 텍스트 에 따라 데이터 원본 의 선택 을 실현 합 니 다. 구체 적 인 실현 은 가상 DataSource 가 AbstractRouting DataSource 를 계승 하여 determineCurrentLookupkey () 가 데이터 원본 을 패키지 하 는 선택 논 리 를 실현 하 는 것 이다. 
절 차 는 다음 과 같다.
1. 다 중 데이터 원본 동적 설정 1. 데이터 원본 의 이름 상수 클래스:
1 package com.login;

2 

3 public class DataSourceConst {

4 

5     public static final String Admin = "admin";

6     public static final String User = "user";

7 }

2. 상하 문 환경 을 얻 고 설정 하 는 클래스 를 만 들 고 상하 문 데이터 원본 의 이름 을 바 꾸 는 것 을 책임 집 니 다.
package com.login;



public class DataSourceContextHolder {



    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();//      

    

    //       

    public static void  setDataSourceType(String dataSourceType)

    {

        contextHolder.set(dataSourceType);

    }

    

    //       

    public static String getDataSourceType()

    {

        return contextHolder.get();

    }

    

    //       

    public static void clearDataSourceType()

    {

        contextHolder.remove();

    }

}

3. 동적 데이터 원본 클래스 를 만 듭 니 다. 이 클래스 는 AbstractRouting DataSource 를 계승 하고 방법 determineCurrentLookupkey 를 실현 해 야 합 니 다. 이 방법 은 Object 를 되 돌려 줍 니 다. 보통 문자열 을 되 돌려 줍 니 다.
 1 package com.login;

 2 

 3 import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

 4 

 5 public class DynamicDataSource extends AbstractRoutingDataSource {

 6 

 7     @Override

 8     protected Object determineCurrentLookupKey() {

 9         // TODO Auto-generated method stub

10         return DataSourceContextHolder.getDataSourceType();

11     }

12 

13 }

4. spring 의 프로필 을 작성 하여 여러 데이터 원본 을 설정 합 니 다.
 1 <?xml version="1.0" encoding="UTF-8"?>

 2 <beans

 3     xmlns="http://www.springframework.org/schema/beans"

 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

 6 

 7     <!-- spring            -->

 8     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

 9         <property name="location" value="classpath:jdbc.properties" />

10     </bean>

11 

12     <bean id="parentDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

13         <property name="driverClass" value="${jdbc.driver}"></property>

14         <property name="user" value="${jdbc.username}"></property>

15         <property name="password" value="${jdbc.password}"></property>

16         <property name="autoCommitOnClose" value="true"/> 

17         <property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/> 

18         <property name="initialPoolSize" value="${cpool.initialPoolSize}"/> 

19         <property name="minPoolSize" value="${cpool.minPoolSize}"/> 

20         <property name="maxPoolSize" value="${cpool.maxPoolSize}"/> 

21         <property name="maxIdleTime" value="${cpool.maxIdleTime}"/> 

22         <property name="preferredTestQuery" value="${cpool.preferredTestQuery}"/> 

23         <property name="acquireIncrement" value="${cpool.acquireIncrement}"/>

24         <property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/> 

25     </bean>

26     

27     <bean id="adminDataSource" parent="parentDataSource">

28         <property name="jdbcUrl" value="${jdbc.url}"></property>

29     </bean>

30     <bean id="userDataSource" parent="parentDataSource">

31         <property name="jdbcUrl" value="${jdbc.url1}"></property>

32     </bean>

33 

34     <bean id="dataSource" class="com.login.DynamicDataSource">

35         <property name="targetDataSources">

36             <map key-type="java.lang.String">

37                 <entry value-ref="adminDataSource" key="admin"></entry>

38                 <entry value-ref="userDataSource" key="user"></entry>

39             </map>

40         </property>

41         <property name="defaultTargetDataSource" ref="adminDataSource"></property>

42     </bean>

43     

44     <!-- Spring   iBatis SqlMap   -->

45     <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

46         <property name="configLocation" value="classpath:sqlMapConfig.xml" />

47         <property name="dataSource" ref="dataSource" />

48     </bean>

49 

50 

51 </beans>

5. dao 설정
1 <bean name="loginDao" class="com.login.LoginDao">

2         <property name="sqlMapClient" ref="sqlMapClient"></property>

3     </bean>

4     <bean name="loginService" class="com.login.LoginService">

5         <property name="loginDao" ref="loginDao"></property>

6     </bean>

6. 테스트 클래스 작성
1 BeanFactory beanFactory = (BeanFactory)(new ClassPathXmlApplicationContext("applicationContext.xml"));

2         LoginDao loginDao = (LoginDao)beanFactory.getBean("loginDao");    

3         DataSourceContextHolder.setDataSourceType(DataSourceConst.Admin);

4         

5         loginDao.getUserInfo();

6         

7         DataSourceContextHolder.setDataSourceType(DataSourceConst.User);

8         

9         loginDao.getUserInfo();

좋은 웹페이지 즐겨찾기