Spring + ibatis 동적 관리 데이터 원본
23446 단어 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();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.