zoukankan      html  css  js  c++  java
  • mybatis多数据源配置

    项目目录如下:

    按照顺序配置吧

    首先是配置config

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/aaa?useUnicode=true&characterEncoding=utf-8
    jdbc.username=root
    jdbc.password=root
    
    jdbc2.driver=com.mysql.jdbc.Driver
    jdbc2.url=jdbc:mysql://localhost:3306/bbb?useUnicode=true&characterEncoding=utf-8
    jdbc2.username=root
    jdbc2.password=root
    

     其次配置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:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd 
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
            ">
        <!-- 引入配置文件 -->
        <bean id="propertyConfigurer"
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="location" value="classpath:config.properties" />
        </bean>
        <!--统一的dataSource-->
        <bean id="dynamicDataSource" class="could.com.utils.DynamicDataSource" >
            <property name="targetDataSources">
                <map key-type="java.lang.String">
                    <!--通过不同的key决定用哪个dataSource-->
                    <entry value-ref="dataSource" key="dataSource"></entry>
                    <entry value-ref="dataSource2" key="dataSource2"></entry>
                </map>
            </property>
            <!--设置默认的dataSource-->
            <property name="defaultTargetDataSource" ref="dataSource2">
            </property>
        </bean>
        
        <!-- 配置数据源1 使用的是Druid数据源 -->
        <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
            init-method="init" destroy-method="close">
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
    
            <!-- 初始化连接大小 -->
            <property name="initialSize" value="3" />
            <!-- 连接池最大使用连接数量 -->
            <property name="maxActive" value="20" />
            
            <!-- 连接池最小空闲 -->
            <property name="minIdle" value="0" />
            <!-- 获取连接最大等待时间 -->
            <property name="maxWait" value="60000" />
            <property name="poolPreparedStatements" value="true" />
            <property name="maxPoolPreparedStatementPerConnectionSize"
                value="33" />
            <!-- 用来检测有效sql -->
            <property name="validationQuery" value="${validationQuery}" />
            <property name="testOnBorrow" value="false" />
            <property name="testOnReturn" value="false" />
            <property name="testWhileIdle" value="true" />
            <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
            <property name="timeBetweenEvictionRunsMillis" value="60000" />
            <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
            <property name="minEvictableIdleTimeMillis" value="25200000" />
            <!-- 打开removeAbandoned功能 -->
            <property name="removeAbandoned" value="true" />
            <!-- 1800秒,也就是30分钟 -->
            <property name="removeAbandonedTimeout" value="1800" />
            <!-- 关闭abanded连接时输出错误日志 -->
            <property name="logAbandoned" value="true" />
            <!-- 监控数据库 -->
            <property name="filters" value="mergeStat" />
        </bean>
        
        
        <!-- 配置数据源2 使用的是Druid数据源 -->
        <bean name="dataSource2" class="com.alibaba.druid.pool.DruidDataSource"
            init-method="init" destroy-method="close">
            <property name="url" value="${jdbc2.url}" />
            <property name="username" value="${jdbc2.username}" />
            <property name="password" value="${jdbc2.password}" />
    
            <!-- 初始化连接大小 -->
            <property name="initialSize" value="3" />
            <!-- 连接池最大使用连接数量 -->
            <property name="maxActive" value="20" />
            
            <!-- 连接池最小空闲 -->
            <property name="minIdle" value="0" />
            <!-- 获取连接最大等待时间 -->
            <property name="maxWait" value="60000" />
            <property name="poolPreparedStatements" value="true" />
            <property name="maxPoolPreparedStatementPerConnectionSize"
                value="33" />
            <!-- 用来检测有效sql -->
            <property name="validationQuery" value="${validationQuery}" />
            <property name="testOnBorrow" value="false" />
            <property name="testOnReturn" value="false" />
            <property name="testWhileIdle" value="true" />
            <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
            <property name="timeBetweenEvictionRunsMillis" value="60000" />
            <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
            <property name="minEvictableIdleTimeMillis" value="25200000" />
            <!-- 打开removeAbandoned功能 -->
            <property name="removeAbandoned" value="true" />
            <!-- 1800秒,也就是30分钟 -->
            <property name="removeAbandonedTimeout" value="1800" />
            <!-- 关闭abanded连接时输出错误日志 -->
            <property name="logAbandoned" value="true" />
            <!-- 监控数据库 -->
            <property name="filters" value="mergeStat" />
        </bean>
        
        <!-- myBatis文件 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dynamicDataSource" />
            <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
            <property name="mapperLocations" value="classpath:could/com/mapping/**/*.xml" />
        </bean>
        
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="could.com.dao.**" />
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        </bean>
    
        <!-- 配置事务管理器 -->
        <bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dynamicDataSource" />
        </bean>
    
        <!-- 注解方式配置事物 -->
        <!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
    
        <!-- 拦截器方式配置事物 -->
        <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="insert*" propagation="REQUIRED" />
                <tx:method name="update*" propagation="REQUIRED" />
                <tx:method name="delete*" propagation="REQUIRED" />
    
                <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
                <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
                <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
    
            </tx:attributes>
        </tx:advice>
        <!-- Spring aop事务管理 -->
        <aop:config>
            <aop:pointcut id="transactionPointcut"
                expression="execution(* could.com.service..*Impl.*(..))" />
            <aop:advisor pointcut-ref="transactionPointcut"
                advice-ref="transactionAdvice" />
        </aop:config>
        <!--自动扫描含有@Service将其注入为bean -->
        
    </beans>
    

     这里注意配置mapping的路径和dao层路径,还有service层路径要和自己的文件路径对应

    下面是工具类里面的两个.java文件了

    CustomerContextHolder.java

    public class CustomerContextHolder {
    	public static final String DATA_SOURCE_MYSQL = "dataSource";
        public static final String DATA_SOURCE_MYSQL2 = "dataSource2";
        //用ThreadLocal来设置当前线程使用哪个dataSource
        private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
        public static void setCustomerType(String customerType) {
            contextHolder.set(customerType);
        }
        public static String getCustomerType() {
            String dataSource = contextHolder.get();
            if (StringUtils.isEmpty(dataSource)) {
                return DATA_SOURCE_MYSQL;
            }else {
                return dataSource;
            }
        }
        public static void clearCustomerType() {
            contextHolder.remove();
        }
    
    }
    

     DynamicDataSource.java

    public class DynamicDataSource extends AbstractRoutingDataSource {
        @Override
        protected Object determineCurrentLookupKey() {
            return CustomerContextHolder.getCustomerType();
        }
    }
    

     最后就是使用了,为了方便测试是否可行,可以创建两个数据库,且含有完全相同的表,数据可以不一样。这样在浏览器显示的时候就可以很清楚的知道是否可行了

    aImpl.java

    //service实现类的一个方法
    public Map<String, Object> getPage(Integer rows, Integer page) {
        //在这里切换数据源,
       CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_MYSQL);
        //调用dao层
    }
    

     当你想换另一个数据源的时候可以修改为DATA_SOURCE_MYSQL2,这个常量在CustomerContextHolder.java中

  • 相关阅读:
    初学AOP
    通过工厂方式配置bean
    Spring中Bean的生命周期方法
    Spring中配置文件中引用外部文件
    Spring中的SPEL
    Spring中的自动装配
    初学Spring
    暑假写的有关字符串处理的程序
    linux查看所有用户信息
    python 函数enumerate(x,y)的用法
  • 原文地址:https://www.cnblogs.com/linwen5723/p/6244055.html
Copyright © 2011-2022 走看看