springmore-core

spring+ibatis实现读写分离

  • 特点

    无缝结合spring+ibatis,对于程序员来说,是透明的

    除了修改配置信息之外,程序的代码不需要修改任何东西

    支持spring的容器事务

  • 规则:

  1. 基于spring配置的容器事务
  2. 读写事务到主库
  3. 只读事务到从库
  4. 如果没有配置事务,更新语句全部到主库,查询语句均衡到从库

    实现源码:https://gitcafe.com/tangyanbo/springmore

    下载spring-core即可
  • 快速入门

    maven依赖
<dependency>
<groupId>org.springmore</groupId>
<artifactId>springmore-core</artifactId>
<version>1.0.0</version>
</dependency>

dataSource配置(applicationContext.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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<!-- C3P0连接池配置 -->
<bean id="master" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:mysql://192.168.1.246:3306/db1</value>
</property>
<property name="user">
<value>ysb</value>
</property>
<property name="password">
<value>ysb</value>
</property>
<property name="initialPoolSize">
<value>20</value>
</property>
<property name="minPoolSize">
<value>20</value>
</property>
<property name="maxPoolSize">
<value>200</value>
</property>
<property name="maxIdleTime">
<value>255000</value>
</property>
</bean> <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:mysql://192.168.1.246:3306/db2</value>
</property>
<property name="user">
<value>ysb</value>
</property>
<property name="password">
<value>ysb</value>
</property>
<property name="initialPoolSize">
<value>20</value>
</property>
<property name="minPoolSize">
<value>20</value>
</property>
<property name="maxPoolSize">
<value>200</value>
</property>
<property name="maxIdleTime">
<value>255000</value>
</property>
</bean> <bean id="dataSource3" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:mysql://192.168.1.246:3306/db3</value>
</property>
<property name="user">
<value>ysb</value>
</property>
<property name="password">
<value>ysb</value>
</property>
<property name="initialPoolSize">
<value>20</value>
</property>
<property name="minPoolSize">
<value>20</value>
</property>
<property name="maxPoolSize">
<value>200</value>
</property>
<property name="maxIdleTime">
<value>255000</value>
</property>
</bean> <bean id="dataSource" class="org.springmore.core.datasource.DynamicDataSource">
<property name="master" ref="master" />
<property name="slaves">
<list>
<ref bean="dataSource2"/>
<ref bean="dataSource3"/>
</list>
</property>
</bean>
</beans>

整合mybatis配置(applicationContext.xml中)

	<!-- ibatis3 工厂类 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:sqlMapConfig.xml" />
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean> <bean id="dynamicSqlSessionTemplate" class="org.springmore.core.datasource.DynamicSqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionTemplate" />
</bean>

事务配置(applicationContext.xml中)

	<!-- 定义单个jdbc数据源的事务管理器 -->
<bean id="transactionManager"
class="org.springmore.core.datasource.DynamicDataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 以 @Transactional 标注来定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true" /> <!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" read-only="false"
rollback-for="Exception" />
<tx:method name="delete*" propagation="REQUIRED" read-only="false"
rollback-for="Exception" />
<tx:method name="update*" propagation="REQUIRED" read-only="false"
rollback-for="Exception" />
<tx:method name="proc*" propagation="REQUIRED" read-only="false"
rollback-for="Exception" />
<tx:method name="select*" read-only="true" />
<tx:method name="*" read-only="false" />
<!-- <tx:method name="*" read-only="true" /> -->
</tx:attributes>
</tx:advice>
<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* org.springmore.core.dao..*(..))" />
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" />
</aop:config>

dao代码示例:

@Repository("UserMapperImpl")
public class UserMapperImpl implements UserMapper{ @Autowired
private DynamicSqlSessionTemplate sqlSessionTemplate; //从库
public List<User> selectByUserNameAndPwd(User user) {
return sqlSessionTemplate.selectList("selectByUserNameAndPwd", user);
} //主库
public void insert(User user) {
sqlSessionTemplate.insert("insert", user);
}
}

spring+mybatis实现读写分离的更多相关文章

  1. spring MVC、mybatis配置读写分离

    spring MVC.mybatis配置读写分离 1.环境: 3台数据库机器,一个master,二台slave,分别为slave1,slave2 2.要实现的目标: ①使数据写入到master ②读数 ...

  2. Spring AOP 实现读写分离

    原文地址:Spring AOP 实现读写分离 博客地址:http://www.extlight.com 一.前言 上一篇<MySQL 实现主从复制> 文章中介绍了 MySQL 主从复制的搭 ...

  3. 使用Spring实现MySQL读写分离(转)

    使用Spring实现MySQL读写分离 为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务, 数据库的压力较大, 需要分流 大量的应用场景, 是读多写少, 数据库读取的压力更大 一个很 ...

  4. spring MVC、mybatis配置读写分离,ReplicationDriver(转载)

    参考:http://shift-alt-ctrl.iteye.com/blog/2271730c 环境: 3台数据库机器,一个master,二台slave,分别为slave1,slave2 2.要实现 ...

  5. Spring Boot+MyBatis+MySQL读写分离

    读写分离要做的事情就是对于一条sql语句该选择去哪个数据库执行,至于谁来做选择数据库的事情,无非两个,1:中间件(比如MyCat):二:程序自己去做分离操作. 但是从程序成眠去做读写分离最大的弱点就是 ...

  6. Spring 实现数据库读写分离

    随着互联网的大型网站系统访问量的增高,数据库访问压力方面不断的显现而出,所以许多公司在数据库层面采用读写分离技术,也就是一个master,多个slave.master负责数据的实时更新或实时查询,而s ...

  7. spring实现数据库读写分离

    现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应 ...

  8. SpringBoot+MyBatis+MySQL读写分离

    1.  引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做.因此,一般来讲,读写分离有两种实现方式.第一种是依 ...

  9. SpringBoot+MyBatis+MySQL读写分离(实例)

    ​ 1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做.因此,一般来讲,读写分离有两种实现方式.第一种是 ...

随机推荐

  1. putExtra方法

    [开篇骂几句:fuck]1.扯淡intent.putExtra()怎么使用?2.胡说intent.putExtra(); [扯淡:其实你在问它怎么用的时候,你要明白,你知道不知道这是个什么东东,有必要 ...

  2. 解决Mac Chrome打开HTTPS证书错误问题

    goagent代理,在chrome下中总提示“该网站的安全证书不受信任” 并且没有 “继续访问” 的按钮. 解决方法 一.打开[应用程序]>[实用工具]>[钥匙串访问],并在左侧导航选择[ ...

  3. JavaScript生成GUID的算法

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...

  4. 【MVC 4】6.SportsSore:导航

     作者:[美]Adam Freeman      来源:<精通ASP.NET MVC 4> 前面的文章[MVC 4]5.SportsSore —— 一个真实的应用程序 建立了 Sports ...

  5. 敬爱的GitHub” —— 致GitHub的一封地下信   英文原文:"Dear GitHub…" An Open Letter to GitHub

    敬爱的GitHub” —— 致GitHub的一封地下信 英文原文:"Dear GitHub…" An Open Letter to GitHub 最近,一个由开源名目(包含一些最盛 ...

  6. nginx + fastDFS 设置开机自动启动

    由于在服务器上有太多的软件 不可能每次启动都要重新启动服务吧(每晚断电...必须重启电脑) vim /etc/rc.d/rc.local 添加下列脚本 /usr/bin/fdfs_trackerd / ...

  7. Html之初体验

    概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言.相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器根据标记 ...

  8. sql点滴46—Can't connect to MySQL server (10060)

    如下图所示,链接远程的数据库提示Can't connect to MySQL server (10060). 遇到这个问题,我们首先做一个分析,导致这种状况出现的几种原因: a.bind-addres ...

  9. 给H5页面添加百分比的进度条,精确度高

    进度条样式地址:http://sandbox.runjs.cn/show/6vxbxjrf SVG圆环样式地址:http://sandbox.runjs.cn/show/3ho1qpe9 原理:由于H ...

  10. Gradle命令行操作

    任务排除 gradle task1 -x task2 task2就是被排除的任务,同时task2依赖的任务也会被排除掉 守护进行执行 默认情况下,每次构建,都要启动一次JVM, gradle -dae ...