在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库。Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询。因为在实际的应用中,数据库都是读多写少(读取数据的频率高,更新数据的频率相对较少),而读取数据通常耗时比较长,占用数据库服务器的CPU较多,从而影响用户体验。我们通常的做法就是把查询从主库中抽取出来,采用多个从库,使用负载均衡,减轻每个从库的查询压力。

 

废话不多说,多数据源配置和主从数据配置原理一样

 

1、首先配置  jdbc.properties 两个数据库 A 和 B

#============ 双数据源 ======#

#----------------------A servers--------------------------#
A.driver=com.mysql.jdbc.Driver
A.url=jdbc:mysql://localhost:3619/gps4?useUnicode=true&characterEncoding=utf8
A.username=gpsadmin
A.password=1qaz&619

#----------------------B servers--------------------------# B.driver=com.mysql.jdbc.Driver B.url=jdbc:mysql://localhost:3619/gps6?useUnicode=true&characterEncoding=utf8 B.username=gpsadmin B.password=1qaz&619

 

 2、配置 spring-mybatis.xml 文件【重要】

<!-- 引入配置文件 -->
    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:resources/jdbc.properties" />
    </bean>
    

    <!-- DBCP连接池 -->
    <!-- <bean  
        destroy-method="close"> <property name="driverClassName" value="${driver}" 
        /> <property name="url" value="${url}" /> <property name="username" value="${username}" 
        /> <property name="password" value="${password}" /> 初始化连接大小 <property name="initialSize" 
        value="${initialSize}"></property> 连接池最大数量 <property name="maxActive" value="${maxActive}"></property> 
        连接池最大空闲 <property name="maxIdle" value="${maxIdle}"></property> 连接池最小空闲 <property 
        name="minIdle" value="${minIdle}"></property> 获取连接最大等待时间 <property name="maxWait" 
        value="${maxWait}"></property> </``> -->
    
    <!-- 【重点】 A 数据源 -->
    <bean name="dataSourceA" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${A.driver}" />
        <property name="url" value="${A.url}" />
        <property name="username" value="${A.username}" />
        <property name="password" value="${A.password}" />
    </bean>
    
    <!-- 【重点】 B 数据源 -->
    <bean name="dataSourceB" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${B.driver}" />
        <property name="url" value="${B.url}" />
        <property name="username" value="${B.username}" />
        <property name="password" value="${B.password}" />
    </bean>

    <!--【重点】 双数据源  配合  -->
    <bean id="dataSource" class="com.ifengSearch.common.database.DynamicDataSource">
        <property name="defaultTargetDataSource" ref="dataSourceB"/>
        <property name="targetDataSources">
            <map>
                <entry key="dataSourceA" value-ref="dataSourceA"/>
                <entry key="dataSourceB" value-ref="dataSourceB"/>
            </map>
        </property>
    </bean>
    
    <!-- 【重点】 加入 aop 自动扫描  DataSourceAspect  配置数据库注解aop -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <bean id="manyDataSourceAspect" class="com.ifengSearch.common.database.DataSourceAspect" />
    <aop:config>
        <!-- 扫描 注解的 数据源 -->
        <aop:aspect id="c" ref="manyDataSourceAspect">
            <aop:pointcut id="tx" expression="execution(* com.ifengSearch.*.dao.*.*(..))"/>
            <aop:before pointcut-ref="tx" method="before"/>
        </aop:aspect>
    </aop:config>
    
    
    
     <!-- 配置数据连接 工厂   自动扫描mapping.xml文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 自动扫描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:com/ifengSearch/*/mapping/*.xml"></property>
    </bean>
    
     <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
             <property name="basePackage" value="com.ifengSearch.*.dao" />
             <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
     </bean>
     

    <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx 事务 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
View Code

相关文章: