PS:使用AbstractRoutingDataSource路由数据源实现动态数据库的调用
 

1、 连接哪个数据源的环境变量

package com.hysoft.common;  
public class JdbcContextHolder {
    private static final ThreadLocal<String> CONTEXTHOLDER = new ThreadLocal<String>();
    
    public static void setJdbcType(String jdbcType) {
        CONTEXTHOLDER.set(jdbcType);
    }
 
    /**
     * 写读数据库
     */
    public static void setWriteDataSource() {
        setJdbcType("writeDataSource");
    }
    /**
     * 设置读数据库
     */
    public static void setReadyDataSource() {
        clearJdbcType();
    }
 
    public static String getJdbcType() {
        return (String) CONTEXTHOLDER.get();
    }
 
    public static void clearJdbcType() {
        CONTEXTHOLDER.remove();
    }
 

}

 
2、建立动态数据源类,这个类必须继承AbstractRoutingDataSource 
package com.hysoft.common;
 
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource{
 
    @Override
    protected Object determineCurrentLookupKey() {
        return JdbcContextHolder.getJdbcType();
    }
 
3、配置数据库初始化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:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation=" 
          http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-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/context 
          http://www.springframework.org/schema/context/spring-context-3.0.xsd 
          http://www.springframework.org/schema/aop 
          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
 
    <!-- 数据库连接 -->
    <!-- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxPoolSize" value="${c3p0.pool.size.max}" />
        <property name="minPoolSize" value="${c3p0.pool.size.min}" />
        <property name="initialPoolSize" value="${c3p0.pool.size.ini}" />
        <property name="acquireIncrement" value="${c3p0.pool.size.increment}" />
    </bean> -->
    
    <!-- ready only DataSource -->
    <bean id="readyDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
        <property name="driverClass" value="${jdbc.ready.driverClassName}" />  
        <property name="jdbcUrl" value="${jdbc.ready.url}" />  
        <property name="user" value="${jdbc.ready.username}" />  
        <property name="password" value="${jdbc.ready.password}" />  
        <property name="maxPoolSize" value="${c3p0.pool.size.max}" />
        <property name="minPoolSize" value="${c3p0.pool.size.min}" />
        <property name="initialPoolSize" value="${c3p0.pool.size.ini}" />
        <property name="acquireIncrement" value="${c3p0.pool.size.increment}" />
    </bean>
    <!-- write only DataSource -->
    <bean id="writeDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
        <property name="driverClass" value="${jdbc.write.driverClassName}" />  
        <property name="jdbcUrl" value="${jdbc.write.url}" />  
        <property name="user" value="${jdbc.write.username}" />  
        <property name="password" value="${jdbc.write.password}" />  
        <property name="maxPoolSize" value="${c3p0.pool.size.max}" />
        <property name="minPoolSize" value="${c3p0.pool.size.min}" />
        <property name="initialPoolSize" value="${c3p0.pool.size.ini}" />
        <property name="acquireIncrement" value="${c3p0.pool.size.increment}" />
    </bean>
    <!-- 动态路由数据库连接 ,默认是读数据库 -->
    <bean id="mySqlDataSource" class="com.hysoft.common.DynamicDataSource">   
        <property name="targetDataSources">   
            <map>   
                <entry key="writeDataSource" value-ref="writeDataSource"/>   
            </map>   
        </property>   
        <property name="defaultTargetDataSource" ref="readyDataSource"/>   
    </bean>
    
 
    <!-- sessionFactory 将spring和mybatis整合 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="mySqlDataSource" />
        <!-- 自动扫描xml目录,省掉手工配置 -->
        <property name="mapperLocations" value="classpath:mapping/*/*.xml" />
        <property name="plugins">
            <list>
                <ref bean="pageInterceptor" />
            </list>
        </property>
    </bean>
 
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.hysoft.*.dao"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>
 
    <!-- AOP事务管理 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="mySqlDataSource" />
    </bean>
 
    <!-- 注解方式配置事物 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

</beans>

 
4、在serverice层指出使用的数据源
public Map<String, Object> getAllUserByPage(Map<String, Object> paramMap, String rows, String page){
        //主库 读 (默认,可以不写)
        JdbcContextHolder.setReadyDataSource();
        //辅库 写
//        JdbcContextHolder.setWriteDataSource();
        Map<String, Object> resultMap = new HashMap<String, Object>();
        PageParameter mypage = getPageMap(paramMap, Integer.valueOf(page), Integer.valueOf(rows));
        List<UserInfoDomain> rtnList = userInfoMapper.getAllUserByPage(paramMap);
        resultMap.put("total", mypage.getTotalCount());
        resultMap.put("rows", rtnList);      
        return resultMap;
    } 
 
 
/**
     * 新增数据
     * @param view
     */
    public void saveUser(UserInfoDomain domain){
        JdbcContextHolder.setWriteDataSource();
        this.userInfoMapper.insert(domain);
    }
    
    /**
     * 编辑数据
     * @param view
     */
    public void updateUser(UserInfoDomain domain){
        JdbcContextHolder.setWriteDataSource();
        this.userInfoMapper.updateByPrimaryKeySelective(domain);

}

160310、oracle数据库的读写分离的更多相关文章

  1. 基于 EntityFramework 的数据库主从读写分离服务插件

    基于 EntityFramework 的数据库主从读写分离服务插件 1. 版本信息和源码 1.1 版本信息 v1.01 beta(2015-04-07),基于 EF 6.1 开发,支持 EF 6.1 ...

  2. 利用oneproxy部署mysql数据库的读写分离

    实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 oneproxy-rhel ...

  3. MySQL搭建主从数据库 实现读写分离

    首先声明,实际生产中,网站为了提高用户体验,性能等,将数据库实现读写分离是有必要的,我们让主数据库去写入数据,然后当用户查询的时候,然后在从数据库读取数据,故能减轻数据库的压力,实现良好的用户体验! ...

  4. Mycat - 实现数据库的读写分离与高可用

    前言 开心一刻 上语文课,不小心睡着了,坐在边上的同桌突然叫醒了我,并小声说道:“读课文第三段”.我立马起身大声读了起来.正在黑板写字的老师吓了一跳,老师郁闷的看着我,问道:“同学有什么问题吗?”,我 ...

  5. 基于 EntityFramework 的数据库主从读写分离架构 - 目录

    基于 EntityFramework 的数据库主从读写分离架构       回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目 ...

  6. 基于 EntityFramework 的数据库主从读写分离架构(1) - 原理概述和基本功能实现

        回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录:      src\ NDF.Data.EntityFramew ...

  7. 如何轻松实现MySQL数据库的读写分离和负载均衡?

    配置好了 Mysql 的主从复制结构后,我们希望实现读写分离,把读操作分散到从服务器中,并且对多个从服务器能实现负载均衡.读写分离和负载均衡是 Mysql 集群的基础需求,MaxScale 就可以帮着 ...

  8. springboot+mybatis实现数据库的读写分离

    介绍 随着业务的发展,除了拆分业务模块外,数据库的读写分离也是常见的优化手段.方案使用了AbstractRoutingDataSource和mybatis plugin来动态的选择数据源选择这个方案的 ...

  9. 利用mysql-proxy进行mysql数据库的读写分离

    实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 mysql-proxy-0 ...

随机推荐

  1. maven ArtifactTransferException:failure

    手动下载对应jar放在本地仓库 -> Update Dependencies(Maven4Myeclipse:eclipse上maven插件)

  2. Docker背景介绍

    背景介绍 Docker是PasS提供商DoctCloud开源的一个基于LXC的高级容器引擎,源代码托管在Github上,基于go语言并遵从Apache2.0协议开源.Docker近期非常火热,无论是从 ...

  3. java中成员变量、代码块、构造函数运行顺序

    1.java虚拟机执行程序,首先须要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量 再load子类. 初始化子类静态代码块和成员变量 2.load完成父类与子类后,从main函数入口运行 ...

  4. html增加锚点定位

    第一种方法,也是最简单的方法是锚点用<a>标签,在href属性中写入DIV的id.如下: <!DOCTYPE html><html><head>< ...

  5. mplayer 全屏问题

    [root@ok home]# gedit ~/.mplayer/config # Write your default config options here! zoom=yes #加上这个参数!全 ...

  6. Vim-复制选中内容至系统剪贴板,光标移动到指定行的行首和行尾

    1.全选并复制到系统剪贴板 ggVG或ggvG 然后 "+y gg 让光标移到首行,在vim才有效,vi中无效 V 是进入Visual(可视)模式 G 光标移到最后一行 "+y 复 ...

  7. CXSprite.cpp文件

    #include "XSprite.h" CXSprite::CXSprite(void) { m_strPic.clear(); } CXSprite::~CXSprite() ...

  8. 每日英语:Yahoo's Rally: Made in China

    The typical honeymoon doesn't last too long before the hard work of marriage begins. And so it norma ...

  9. 知乎日报 API 分析

    声明 下面全部 API 均由 知乎(Zhihu.Inc) 提供,本人採取非正常手段获取. 获取与共享之行为或有侵犯知乎权益的嫌疑.若被告知需停止共享与使用.本人会及时删除此页面与整个项目. 请您暸解相 ...

  10. boa 服务的启动

    使用 buildroot 添加 boa 服务后,通过命令 boa 不能启动该服务,就研究了一下boa.conf的配置. etc/boa/boa.conf # 更改user 和Group 为root. ...