spring+mybatis实现读写分离
springmore-core
spring+ibatis实现读写分离
- 特点 
 无缝结合spring+ibatis,对于程序员来说,是透明的
 除了修改配置信息之外,程序的代码不需要修改任何东西
 支持spring的容器事务
- 规则: 
- 基于spring配置的容器事务
- 读写事务到主库
- 只读事务到从库
- 如果没有配置事务,更新语句全部到主库,查询语句均衡到从库
 实现源码: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实现读写分离的更多相关文章
- spring MVC、mybatis配置读写分离
		spring MVC.mybatis配置读写分离 1.环境: 3台数据库机器,一个master,二台slave,分别为slave1,slave2 2.要实现的目标: ①使数据写入到master ②读数 ... 
- Spring AOP 实现读写分离
		原文地址:Spring AOP 实现读写分离 博客地址:http://www.extlight.com 一.前言 上一篇<MySQL 实现主从复制> 文章中介绍了 MySQL 主从复制的搭 ... 
- 使用Spring实现MySQL读写分离(转)
		使用Spring实现MySQL读写分离 为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务, 数据库的压力较大, 需要分流 大量的应用场景, 是读多写少, 数据库读取的压力更大 一个很 ... 
- spring MVC、mybatis配置读写分离,ReplicationDriver(转载)
		参考:http://shift-alt-ctrl.iteye.com/blog/2271730c 环境: 3台数据库机器,一个master,二台slave,分别为slave1,slave2 2.要实现 ... 
- Spring Boot+MyBatis+MySQL读写分离
		读写分离要做的事情就是对于一条sql语句该选择去哪个数据库执行,至于谁来做选择数据库的事情,无非两个,1:中间件(比如MyCat):二:程序自己去做分离操作. 但是从程序成眠去做读写分离最大的弱点就是 ... 
- Spring 实现数据库读写分离
		随着互联网的大型网站系统访问量的增高,数据库访问压力方面不断的显现而出,所以许多公司在数据库层面采用读写分离技术,也就是一个master,多个slave.master负责数据的实时更新或实时查询,而s ... 
- spring实现数据库读写分离
		现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应 ... 
- SpringBoot+MyBatis+MySQL读写分离
		1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做.因此,一般来讲,读写分离有两种实现方式.第一种是依 ... 
- SpringBoot+MyBatis+MySQL读写分离(实例)
		 1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做.因此,一般来讲,读写分离有两种实现方式.第一种是 ... 
随机推荐
- Oracle  PLSQL
			Oracle :show explain plan select * from table(dbms_xplan.display); EXPLAIN PLAN FOR statements In fa ... 
- CentOS 6.5部署安装Memcached
			1. Yum安装Memcache 查找memcached yum search memcached 该命令可以查询yum库中有关memcached的安装包信息,以下是搜寻结果截图: 安装 memc ... 
- RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础
			Abstract: 贡献主要有两点1:可以将卷积神经网络应用region proposal的策略,自底下上训练可以用来定位目标物和图像分割 2:当标注数据是比较稀疏的时候,在有监督的数据集上训练之后到 ... 
- HTML5性能优化
			HTML5性能优化 在看完这两章内容之后,我意犹未尽,于是乎从网上搜索关键字“Java Web高性能”,在IBM社区找到两篇不错的文章,而让人更意外的是我发现那两篇文章的内容跟<高性能HTML5 ... 
- UVALive 6450 Social Advertising DFS解法
			题意:一些人有朋友关系,在某个人的社交网站上投放广告可以被所有该人的直接朋友看到,问最小投放多少个广告使给出的人都看到广告.(n<=20) 解法:看到n的范围可以想到用二进制数表示每个人被覆盖与 ... 
- 2014 Super Training #8 A Gears --并查集
			题意: 有N个齿轮,三种操作1.操作L x y:把齿轮x,y链接,若x,y已经属于某个齿轮组中,则这两组也会合并.2.操作Q x y:询问x,y旋转方向是否相同(等价于齿轮x,y的相对距离的奇偶性). ... 
- Ajax类库需要注意的问题
			构建Ajax类库时,注意四步就可以了: 1:创建Ajax 对象 2:链接服务器 3:发送请求 4:返回响应 下面是我自己写的一个Ajax类库: function ajax(url,fnn,fai) ... 
- 003医疗项目-关于<context:property-placeholder location="classpath:db.properties"/>的问题
			项目结构如下: 
- [转]Linux查看物理CPU个数、核数、逻辑CPU个数
			From : http://www.cnblogs.com/emanlee/p/3587571.html # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个 ... 
- Linux 进程通信(有名管道)
			有名管道(FIFO) 有名管道是持久稳定的. 它们存在于文件系统中. FIFO比无名管道作用更大,因为他们能让无关联的进程之间交换数据. 管道文件一般用于交换数据. shell命令创建管道 一个she ... 
