• 简单纪要:mybatis spring 多数据源切换及整合


    一 在spring-config-dao中填写多个数据源信息

    <?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:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xsi:schemaLocation="  
             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
             http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd  
             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
        default-lazy-init="false">
        <!-- 数据源1 start-->
        <!--配置数据源 -->
        
        <bean id="master" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUrl" value="${jdbc.url}" />
            <property name="user" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            <property name="maxPoolSize" value="100" />
            <property name="minPoolSize" value="1" />
            <property name="initialPoolSize" value="1" />
            <property name="maxIdleTime" value="30" />
        </bean>
        
        <bean id="slave" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUrl" value="${slave.jdbc.url}" />
            <property name="user" value="${slave.jdbc.username}" />
            <property name="password" value="${slave.jdbc.password}" />
            <property name="maxPoolSize" value="100" />
            <property name="minPoolSize" value="1" />
            <property name="initialPoolSize" value="1" />
            <property name="maxIdleTime" value="30" />
        </bean>
        
        <!-- 动态数据源 -->  
       <bean id="dynamicDataSource" class="com.ceshi.util.DynamicDataSource">  
           <!-- 通过key-value关联数据源 -->  
           <property name="targetDataSources">  
               <map>  
                   <entry value-ref="master" key="master"></entry>  
                   <entry value-ref="slave" key="slave"></entry>  
               </map>  
           </property>  
           <property name="defaultTargetDataSource" ref="master" />      
       </bean>
      
        <!--mybatis与Spring整合 开始 -->  
        <bean id="sqlSessionFactory" name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
            <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
            <property name="dataSource" ref="dynamicDataSource" />  
            <property name="mapperLocations" value="classpath:mybatis/*-mapper.xml" />
            <property name="typeAliasesPackage" value="com.ceshi.dto" />
        </bean> 
        
        <bean name="mapperScannerConfigurer1" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
             <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
            <property name="basePackage" value="com.ceshi.dao" />
        </bean>
        <!-- 数据源1 end-->
        
        <!-- 数据源2 start-->
        <bean id="master_ceshi" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUrl" value="${ceshi.jdbc.url}" />
            <property name="user" value="${ceshi.jdbc.username}" />
            <property name="password" value="${ceshi.jdbc.password}" />
            <property name="maxPoolSize" value="100" />
            <property name="minPoolSize" value="1" />
            <property name="initialPoolSize" value="1" />
            <property name="maxIdleTime" value="30" />
        </bean>
        
        <bean id="slave_ceshi" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUrl" value="${ceshi.slave.jdbc.url}" />
            <property name="user" value="${ceshi.slave.jdbc.username}" />
            <property name="password" value="${ceshi.slave.jdbc.password}" />
            <property name="maxPoolSize" value="100" />
            <property name="minPoolSize" value="1" />
            <property name="initialPoolSize" value="1" />
            <property name="maxIdleTime" value="30" /> 
        </bean>
        
       <!-- 动态数据源 -->  
       <bean id="dynamicDataSource_videoplat" class="com.ceshi.ceshi.DynamicDataSource">
           <!-- 通过key-value关联数据源 -->  
           <property name="targetDataSources">  
               <map>  
                   <entry value-ref="master_ceshi" key="master_ceshi"></entry>  
                   <entry value-ref="slave_ceshi" key="slave_ceshi"></entry>  
               </map>  
           </property>  
           <property name="defaultTargetDataSource" ref="master_ceshi" />      
       </bean> 
       
       <!--mybatis与Spring整合 开始 -->  
        <bean id="sqlSessionFactory_ceshi" name="sqlSessionFactory_ceshi" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="configLocation" value="classpath:mybatis/ceshi/mybatis-config.xml"></property>
            <property name="dataSource" ref="dynamicDataSource_ceshi" />
            <property name="mapperLocations" value="classpath:mybatis/ceshi/*-mapper.xml" />
            <property name="typeAliasesPackage" value="com.ceshi.dto.ceshi" />
        </bean> 
        
        <bean name="mapperScannerConfigurer2" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_ceshi"/>
            <property name="basePackage" value="com.ceshi.dao_videoplat" />
        </bean>
        <!-- 数据源2 end-->
    
        <!-- 数据源3 start-->
        <bean id="master_jed" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUrl" value="${jed.jdbc.url}" />
            <property name="user" value="${jed.jdbc.username}" />
            <property name="password" value="${jed.jdbc.password}" />
            <property name="maxPoolSize" value="100" />
            <property name="minPoolSize" value="1" />
            <property name="initialPoolSize" value="1" />
            <property name="maxIdleTime" value="30" />
        </bean>
    
        <bean id="slave_jed" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUrl" value="${jed.slave.jdbc.url}" />
            <property name="user" value="${jed.slave.jdbc.username}" />
            <property name="password" value="${jed.slave.jdbc.password}" />
            <property name="maxPoolSize" value="100" />
            <property name="minPoolSize" value="1" />
            <property name="initialPoolSize" value="1" />
            <property name="maxIdleTime" value="30" />
        </bean>
    
        <!-- 动态数据源 -->
        <bean id="dynamicDataSource_jed" class="com.util.jed.DynamicDataSource">
            <!-- 通过key-value关联数据源 -->
            <property name="targetDataSources">
                <map>
                    <entry value-ref="master_jed" key="master_jed"></entry>
                    <entry value-ref="slave_jed" key="slave_jed"></entry>
                </map>
            </property>
            <property name="defaultTargetDataSource" ref="master_jed" />
        </bean>
    
        <!--mybatis与Spring整合 开始 -->
        <bean id="sqlSessionFactory_jed" name="sqlSessionFactory_jed" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="configLocation" value="classpath:mybatis/jed/mybatis-config.xml"></property>
            <property name="dataSource" ref="dynamicDataSource_jed" />
            <property name="mapperLocations" value="classpath:mybatis/jed/Band(或者此处填 *)-mapper.xml" />
            <property name="typeAliasesPackage" value="com.ceshi.dto.ceshi" />
        </bean>
    
        <bean name="mapperScannerConfigurer3" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_jed"/>
            <property name="basePackage" value="com.jd.vd.manage.dao_jed" />
        </bean>
        <!-- 数据源3 end-->
        
    </beans>

    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>
            <!-- 全局映射器启用缓存 -->
            <setting name="cacheEnabled" value="true" />
            <!-- 查询时,关闭关联对象即时加载以提高性能 -->
            <setting name="lazyLoadingEnabled" value="true" />
            <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
            <setting name="aggressiveLazyLoading" value="false" />
            <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
            <setting name="multipleResultSetsEnabled" value="true" />
            <!-- 允许使用列标签代替列名 -->
            <setting name="useColumnLabel" value="true" />
            <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
            <!--  <setting name="useGeneratedKeys" value="true" /> -->
            <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
            <setting name="autoMappingBehavior" value="FULL" />
            <!-- 对于批量更新操作缓存SQL以提高性能 -->
            <!-- <setting name="defaultExecutorType" value="BATCH" /> -->
            <!-- 数据库超过25000秒仍未响应则超时 -->
            <setting name="defaultStatementTimeout" value="0" />
            <!--强制指定MyBatis使用log4j作为日志日志框架,若不指定那么当部署到如Tomcat等应用容器时,会被容器设置为使用common-logging来记录日志-->
            <setting name="logImpl" value="LOG4J"/>
        </settings>
    
    </configuration>

    二  创建动态数据源的工具类

    DynamicDataSource.java
    package com.util.jed;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
    
    public class DynamicDataSource extends AbstractRoutingDataSource {  
        
        private static final Logger logger = LoggerFactory.getLogger(DynamicDataSource.class);
    
        /** 
         * Description: 自动查找datasource 
         * @return 
         */  
        @Override  
        protected Object determineCurrentLookupKey() {  return JEDDBContextHolder.getDbType();
        }  
      
    }  
    
    
    JEDContextHolder.java

    package com.util.jed;
    public class JEDContextHolder { /** * 线程threadlocal */ private static ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static String DB_TYPE_RW_JED = "master_jed"; public static String DB_TYPE_R_JED = "slave_jed"; public static String getDbType() { String db = contextHolder.get(); if (db == null) { db = DB_TYPE_RW_JED;// 默认是读写库 } return db; } /** * * 设置本线程的dbtype */ public static void setDbType(String str) { contextHolder.set(str); } /** * clearDBType * * @Title: clearDBType * @Description: 清理连接类型 */ public static void
    clearDBType() { contextHolder.remove(); } }

    三  创建其他必要文件

    JedDao.java
    package com.jed.dao_jed;
    
    import com.jed.Jed;
    import org.springframework.stereotype.Repository;
    
    @Repository("jedDao")
    public interface JedDao {
        Jed selectJed(Jed jed);
    }

    Jed-mapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.jed.dao_jed.JedDao">
      <sql id="Base_Column" >
          id,
          title
       </sql>
        <sql id="COMMON">
            <trim prefix="WHERE" prefixOverrides="AND | OR">
                <if test="minId!=null and minId!=''">
                    <![CDATA[
                              and id >= #{minId}
                        ]]>
                </if>
                <if test="uploadTimeBegin!=null and uploadTimeBegin!=''">
                    <![CDATA[
                            and create_time >= #{uploadTimeBegin}
                    ]]>
                </if>
                <if test="uploadTimeEnd!=null and uploadTimeEnd!=''">
                    <![CDATA[
                            and create_time <= #{uploadTimeEnd}
                    ]]>
                </if>
             
            </trim>
        </sql>
    
       <select id="selectJed" parameterType="Jed" resultType="Jed">
          select <include refid="Base_Column" /> from jed  <include refid="COMMON" />  limit 1
      </select>
    
    </mapper>

    impl.java

     Jed jed = new Jed();
     Jed.setId(id);
     JEDContextHolder.setDbType(JEDContextHolder.DB_TYPE_R_JED);
     jed = jedDao.selectJed(jed);
  • 相关阅读:
    移动端的dl
    以resnet作为前置网络的ssd目标提取检测
    MobileNet V2
    axis
    后RCNN时代的物体检测及实例分割进展
    RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa
    caffe2安装
    git学习
    各种各样的卷积核
    数字图像处理_基础知识
  • 原文地址:https://www.cnblogs.com/Rnan/p/10684297.html
Copyright © 2020-2023  润新知