`

Java之——SpringMVC+MyBitis+多数据源切换

 
阅读更多
spring mvc+mybatis+多数据源切换 选取Oracle切换到另一个Oracle数据源。oracle其中一个为默认数据源,在测试的action中,进行Oracle和另一个Oracle的动态切换。

web.xml配置
<context-param>  
    <param-name>webAppRootKey</param-name>  
    <param-value>trac</param-value>  
</context-param>  
  
<!-- Spring的log4j监听器 -->  
<listener>  
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
</listener>  
  
<!-- 字符集 过滤器 -->  
<filter>  
    <filter-name>CharacterEncodingFilter</filter-name>  
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>utf8</param-value>  
    </init-param>  
    <init-param>  
        <param-name>forceEncoding</param-name>  
        <param-value>true</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>CharacterEncodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  
  
<!-- Spring view分发器 -->  
<servlet>  
    <servlet-name>dispatcher</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <init-param>
      <description>spring mvc 配置文件</description>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springMvc-servlet.xml</param-value>
    </init-param> 
    <load-on-startup>1</load-on-startup>  
</servlet>  
<servlet-mapping>  
    <servlet-name>dispatcher</servlet-name>  
    <url-pattern>*.action</url-pattern>  
</servlet-mapping>  
  
<listener>  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
</listener>  


springMvc-servlet.xml配置
<mvc:annotation-driven />  
<context:component-scan base-package="com.trac" />  
  
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />  
  
<!-- freemarker config -->  
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
    <property name="templateLoaderPath" value="/WEB-INF/freemarker/" />  
    <property name="freemarkerVariables">  
        <map>  
            <entry key="xml_escape" value-ref="fmXmlEscape" />  
        </map>  
    </property>  
    <property name="freemarkerSettings">  
        <props>  
            <prop key="defaultEncoding">UTF-8</prop>  
        </props>  
    </property>  
</bean>  
  
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />  
  
<!-- View resolvers can also be configured with ResourceBundles or XML files.   
    If you need different view resolving based on Locale, you have to use the   
    resource bundle resolver. -->  
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  
    <property name="exposeRequestAttributes" value="true" />  
    <property name="exposeSessionAttributes" value="true" />  
    <property name="exposeSpringMacroHelpers" value="true" />  
    <property name="contentType" value="text/html;charset=UTF-8" />  
    <property name="cache" value="true" />  
    <property name="prefix" value="" />  
    <property name="suffix" value=".jsp" />  
</bean> 


applicationContext.xml
<!-- 读取配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
       <list>  
          <value>classpath:jdbc.properties</value>
          <value>classpath:application.properties</value>
        </list>
    </property>
</bean>
<bean id="parentDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
</bean>  
  
<bean id="oracleDataSource1" parent="parentDataSource">  
    <property name="driverClassName" value="${jdbc1.driver}"></property>  
    <property name="url" value="${jdbc1.url}"></property>  
    <property name="username" value="${jdbc1.username}"></property>  
    <property name="password" value="${jdbc1.password}"></property>  
</bean> 
  
<bean id="oracleDataSource2" parent="parentDataSource">  
    <property name="driverClassName" value="${jdbc2.driver}"></property>  
    <property name="url" value="${jdbc2.url}"></property>  
    <property name="username" value="${jdbc2.username}"></property>  
    <property name="password" value="${jdbc2.password}"></property>  
</bean>  
  
<bean id="dataSource" class="com.trac.dao.datasource.DataSources">  
    <property name="targetDataSources">  
        <map key-type="java.lang.String">  
            <entry value-ref="oracleDataSource1" key="ORACLE1"></entry>  
            <entry value-ref="oracleDataSource2" key="ORACLE2"></entry>  
        </map>  
    </property>  
    <property name="defaultTargetDataSource" ref="oracleDataSource1"></property>  
</bean>  
  
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
    <property name="dataSource" ref="dataSource" />  
</bean>  
  
<!-- 创建SqlSessionFactory,同时指定数据源和mapper -->  
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
    <property name="dataSource" ref="dataSource" />  
    <property name="mapperLocations" value="classpath*:com/trac/ibatis/dbcp/*.xml" />  
</bean>  
  
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
    <constructor-arg index="0" ref="sqlSessionFactory" />  
</bean>  
  
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
    <property name="basePackage" value="com.trac.dao" />  
</bean>  


配置 parentDataSource 的父bean.再配置多个数据源继承这个父bean,对driverClass,url,username,password,等数据源连接参数进行各自的重写。例如 oracleDataSource1,在 DataSources bean中注入所有要切换的数据源,并且设置默认的数据源。

DataSourceInstances.java
/** 
 * 定义数据源的标识, 和applicationContext.xml中 DataSources 的 targetDataSources 的key对应 
 */  
public class DataSourceInstances{  
    public static final String ORACLE1="ORACLE1";  
    public static final String ORACLE2="ORACLE2";  
} 


DataSourceSwitch.java
public class DataSourceSwitch{  
    private static final ThreadLocal contextHolder=new ThreadLocal();  
      
    /**
	 * @Description: 设置数据源类型
	 * @param dataSourceType  数据库类型
	 * @return void
	 * @throws
	 */
    public static void setDataSourceType(String dataSourceType){  
        contextHolder.set(dataSourceType);  
    }  
    
   /** 
     * @Description: 获取数据源类型 
     * @param  
     * @return String 
     * @throws 
     */ 
    public static String getDataSourceType(){  
        return (String) contextHolder.get();  
    }  
      
   /** 
     * @Description: 清除数据源类型 
     * @param  
     * @return void 
     * @throws 
     */ 
    public static void clearDataSourceType(){  
        contextHolder.remove();  
    }  
}


DataSources.java
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;  
/** 
 *配置于applicationContext 中,线程局部变量ThreadLocal contextHolder 保存当前需要的数据源类型,当 DataSourceSwitch. setDataSourceType(DataSourceInstances.XXX) 保存当前需要的数据源类型的时候,DataSources 会从当前线程中查找线程变量的数据源类型,从而决定使用何种数据源 
 */  
public class DataSources extends AbstractRoutingDataSource{  
    @Override  
    protected Object determineCurrentLookupKey() {  
        return DataSourceSwitch.getDataSourceType();  
    }  
} 


本文转载自:http://blog.csdn.net/l1028386804/article/details/48163279
http://blog.csdn.net/gaofuqi/article/details/46417281
感谢这两位大神的文章帮我了很大的忙,希望可以帮到各位
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics