基于 SSM项目多数据源配置实现(eg_ oracle+sqlServer)

项目初期数据库用的是oracle数据库,后期因为一个需求需要跟另外一个平台交互,用的是SqlServer数据库,需要在向Oracle中插入数据的同时向SqlServer数据库中也插入一些数据,所以需要此项目再加入跟SqlServer交互的配置——

 

   下面是重点配置文件:——

             1. config.properties  (有的喜欢叫db.properties)

jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@47.108.209.57:1521:orcl
jdbc.username=sco
jdbc.password=oracleAdm
initialSize=0
maxActive=20
maxIdle=20
minIdle=1
maxWait=60000
sqlserver.jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
sqlserver.jdbc.url=jdbc:sqlserver://49.109.209.59:1433;DatabaseName=BK_ZLBGtt
sqlserver.jdbc.username=saa
sqlserver.jdbc.password=!@#admin@cecn1

2.mybatis-config.xml

   

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
		  <!-- mybatis控制台LOG输出 -->
        <setting name="logImpl" value="LOG4J2" />
        
    </settings>
   
    <!-- 
                 为mapper文件中的参数类型,
                 返回值类型定义别名
                 假如是采用package元素定义,
                 那默认类型的别名为类名并且
                 第一个单词的首字母小写.
     -->
    <typeAliases>
     <!--  <package name="cn.youcheng.system.entity"/>
      <package name="cn.youcheng.chat.entity"/>
      <package name="cn.youcheng.group.entity"/> -->
      <package name="cn.beikong.risk.entity"/>
      <package name="cn.beikong.quality.entity"/>
      <package name="cn.beikong.table.entity"/>
    </typeAliases>

    <plugins>
    <plugin interceptor="com.github.pagehelper.PageHelper">
        <property name="dialect" value="oracle"/>
        <property name="offsetAsPageNum" value="false"/>
        <property name="rowBoundsWithCount" value="false"/>
        <property name="pageSizeZero" value="true"/>
        <property name="reasonable" value="false"/>
        <property name="supportMethodsArguments" value="false"/>
        <property name="returnPageInfo" value="none"/>
    </plugin>
    </plugins>
</configuration>

3. spring-mvc.xml

   

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:task="http://www.springframework.org/schema/task"
   xsi:schemaLocation="
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task-3.2.xsd
       http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
       http://www.springframework.org/schema/mvc   
       http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd   
       http://www.springframework.org/schema/tx   
       http://www.springframework.org/schema/tx/spring-tx-4.3.xsd   
       http://www.springframework.org/schema/context  
       http://www.springframework.org/schema/context/spring-context-4.3.xsd
       http://www.springframework.org/schema/task
 	   http://www.springframework.org/schema/task/spring-task-3.0.xsd"> 

    <!-- spring 包的扫描
     1)dao
     2)service (@Service)
     3)controller(@Controller)
     4).....
     -->
    <context:component-scan base-package="cn.beikong" />
    <!-- spring mvc 注解及类型转换 -->
    <mvc:annotation-driven conversion-service="conversionService" />
    <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    </bean>
    <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件 中也不必引入上传组件包 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8" />
        <!-- 文件大小最大值 -->
        <property name="maxUploadSize" value="10485760000" />
        <!-- 内存中的最大值 -->
        <property name="maxInMemorySize" value="40960" />
    </bean>
    <!-- 注解返回JSON时配置 -->
	<bean id="mappingJackson2HttpMessageConverter"
		class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>application/json; charset=utf-8</value>
			</list>
		</property>
	</bean>
    
    <!-- 计时器配置 -->
     <!--启用注解驱动的定时任务  -->
     <task:annotation-driven/>
     <task:scheduler id="myScheduler" pool-size="5"/>
     
     <!-- 事物管理相关 -->
     <!-- transaction support-->
		<!-- PlatformTransactionMnager -->
		<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		    <property name="dataSource" ref="dataSource" />
		</bean>
		<!-- enable transaction annotation support -->
		<tx:annotation-driven transaction-manager="txManager" />
</beans>

   4.spring-mybatis.xml

  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--配置整合mybatis过程 1.配置数据库相关参数-->
    <context:property-placeholder location="classpath:config.properties"/>

    <!--2.数据库连接池ORACLE-->
    <bean id="dataSourceOracle" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--配置连接池属性-->
        <property name="driverClass" value="${jdbc.driver}" />
        <!-- 基本属性 url、user、password -->
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!--c3p0私有属性-->
        <property name="maxPoolSize" value="30"/>
        <property name="minPoolSize" value="10"/>
        <!--关闭连接后不自动commit-->
        <property name="autoCommitOnClose" value="false"/>
        <!--获取连接超时时间-->
        <property name="checkoutTimeout" value="1000"/>
        <!--当获取连接失败重试次数-->
        <property name="acquireRetryAttempts" value="2"/>
    </bean>
    <!--数据库连接池SQLSERVER-->
    <bean name="dataSourceSql" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
        <property name="driverClass" value="${sqlserver.jdbc.driver}" />
        <property name="jdbcUrl" value="${sqlserver.jdbc.url}" />
        <property name="user" value="${sqlserver.jdbc.username}" />
        <property name="password" value="${sqlserver.jdbc.password}" />
        <property name="maxPoolSize" value="30"/>
        <property name="minPoolSize" value="10"/>
        <!--关闭连接后不自动commit-->
        <property name="autoCommitOnClose" value="false"/>
        <!--获取连接超时时间-->
        <property name="checkoutTimeout" value="1000"/>
        <!--当获取连接失败重试次数-->
        <property name="acquireRetryAttempts" value="2"/>
    </bean>

    <!--动态数据源的配置-->
    <bean id="dataSource" class="cn.beikong.data.DynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="dataSourceOracle" value-ref="dataSourceOracle"/>
                <entry key="dataSourceSql" value-ref="dataSourceSql"/>
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="dataSourceOracle"/>
    </bean>

    <!--约定大于配置-->
    <!--3.配置SqlSessionFactory对象-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--往下才是mybatis和spring真正整合的配置-->
        <!--注入数据库连接池-->
        <property name="dataSource" ref="dataSource"/>

        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="typeAliasesPackage" value="com.bird.business.domain"/>
        <property name="mapperLocations" >
			<list>
			 <value>classpath:cn/beikong/*/dao/*.xml</value>
			</list>
		</property>
    </bean>
    <!--4:配置扫描Dao接口包,动态实现DAO接口,注入到spring容器-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--注入SqlSessionFactory-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 给出需要扫描的Dao接口-->
        <property name="basePackage"
		          value="cn.beikong.**.dao "/>
    </bean>

</beans>

  5.web.xml

   

<!-- <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
   -->
   <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">
  <display-name>beiKongPort</display-name>
   <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
  <!-- 解决post请求中文乱码 -->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

   5.DataSourceContextHolder (自定义类)

  

package cn.beikong.data;

public class  DataSourceContextHolder {

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

    public static void setDbType(String dbType) {
        contextHolder.set(dbType);
        System.out.println(contextHolder);
    }

    public static String getDbType() {
        return ((String) contextHolder.get());
    }

    public static void clearDbType() {
        contextHolder.remove();
    }

}

  6.DynamicDataSource

   

package cn.beikong.data;

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

public class DynamicDataSource  extends AbstractRoutingDataSource {


    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDbType();
    }
}

  7.测试——

      

public class SqlserverTest {
	private SqlserverTestPerDao sqlserverTestPerDao;
	private TableMenuDao tableMenuDao;
	public void init() {
		@SuppressWarnings("resource")
		ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mybatis.xml");
		System.out.println("ac==========="+ac);
		sqlserverTestPerDao=ac.getBean("sqlserverTestPerDao",SqlserverTestPerDao.class);
		tableMenuDao=ac.getBean("tableMenuDao",TableMenuDao.class);
	}
	@Test
	public void test(){
		init();
		DataSourceContextHolder.setDbType("dataSourceSql"); 
//		List<TestPerEntity> testPer=sqlserverTestPerDao.getPerson();
//		System.out.println(testPer);
		
		System.out.println(tableMenuDao.getList());
		
	}

 重点是在使用SqlServer之前加上  ————       DataSourceContextHolder.setDbType("dataSourceSql"); 

 

 

          因为我这里用orale的时候多,所以oracle的数据源被设置为默认的了,在使用SqlServer之前加上这句就可以了;

 

     当然,这个写起来麻烦的话,可以自定义注解的方式来用注解替换;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值