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. nginx 配置wordpress固定链接(自定义)

    今天在wordpress 下配置文章固定链接的时候,遇到了404的错误.我首先在wordpress下的设置里的“固定链接”配置页面,自定义链接的结构 “http://www.haozi8.com/%p ...

  2. python module getopt usage

    import getopt import sys def usage(): print 'this is a usage.' def main(): try: print sys.argv #sys. ...

  3. Git指令总结和图表

    Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. Git常用操作命令: 1) 远程仓库相关命令 检出仓库:$ git clone g ...

  4. 新手在sae部署程序容易忽略的一个细节

    从来没用过这类云空间服务,尝了下鲜试用一下sae,但是部署的时候发现问题了,各种404..各种无奈啊..虽然百度无数篇介绍,但是都千篇一律没什么启发.. 但是巧在我部署的应用有个欢迎页面,点击链接的时 ...

  5. Merge compare columns when null

    Key words: merge compare columns when we contact merge sql in ETL, When we update some columns we sh ...

  6. [转]How to insert a row between two rows in an existing excel with HSSF (Apache POI)

    本文转自:http://stackoverflow.com/questions/5785724/how-to-insert-a-row-between-two-rows-in-an-existing- ...

  7. selenium获取html的表格单元格数据

    获取网页的表格的某个单元格的值,思路: 1.获取表格 2.获取表格的所有行 3.根据某一行获取该行的所有列 4.根据某一列获得该行该列的单元格值 根据以上思路,可以知道,只需要行.列就可以得到单元格的 ...

  8. 【温故而知新-Javascript】使用数组

    Javascript 数组的工作方式与大多数编程语言的数组类似. <!DOCTYPE html> <html lang="en"> <head> ...

  9. 【Ext.Net学习笔记】07:后续

    这些笔记都是在这个地址看到的:http://www.qeefee.com/category/extnet 然后跟着敲,去理解的. Ext.NET其实就是基于跨浏览器的ExtJS库和.NET Frame ...

  10. Zbrush 4R7 P3中各类模型怎么快速隐藏

    在ZBrush®软件中除了遮罩功能可以对模型局部进行编辑外,我们还可以通过显示和隐藏来对模型的局部进行控制. 查看更多内容请直接前往:http://www.zbrushcn.com/jichu/xia ...