spring+mybatis读写分离配置
2017-04-20 00:00
232 查看
<!-- 数据源的配置 --> <bean id="masterHikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="poolName" value="springHikariCP"/> <property name="connectionTestQuery" value="SELECT 1"/> <property name="dataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"/> <property name="dataSourceProperties"> <props> <prop key="url">${jdbc.master.url}</prop> <prop key="user">${jdbc.master.username}</prop> <prop key="password">${jdbc.master.password}</prop> </props> </property> <property name="autoCommit" value="true"/> </bean> <bean id="slave01HikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="poolName" value="springHikariCP"/> <property name="connectionTestQuery" value="SELECT 1"/> <property name="dataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"/> <property name="dataSourceProperties"> <props> <prop key="url">${jdbc.slave01.url}</prop> <prop key="user">${jdbc.slave01.username}</prop> <prop key="password">${jdbc.slave01.password}</prop> </props> </property> <property name="autoCommit" value="true"/> </bean> <!--主数据源--> <bean id="masterDataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="masterHikariConfig"/> </bean> <!--从数据源--> <bean id="slave01DataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="slave01HikariConfig"/> </bean> <!--定义dynamic数据源--> <bean id="dataSource" class="com.xwtec.activity.datasource.DynamicDataSource"> <!-- 设置多个数据源 --> <property name="targetDataSources"> <map key-type="java.lang.String"> <!-- 这个key需要和程序中的key一致 --> <entry key="master" value-ref="masterDataSource"/> <entry key="slave" value-ref="slave01DataSource"/> </map> </property> <!-- 设置默认的数据源,这里默认走写库 --> <property name="defaultTargetDataSource" ref="masterDataSource"/> </bean> <!-- 定义AOP切面处理器 --> <bean class="com.xwtec.activity.datasource.DataSourceAspect" id="dataSourceAspect"/> <!-- 配置数据库注解aop --> <bean id="dynamicDataSourceAspect" class="com.xwtec.activity.datasource.DataSourceAspect" /> <aop:config> <aop:aspect id="c" ref="dynamicDataSourceAspect"> <!--如果只针对活动,则配置改为execution(* com.xwtec.activity.dao.*.*(..))--> <aop:pointcut id="route" expression="execution(* com.xwtec.*.dao.*.*(..))"/> <aop:before pointcut-ref="route" method="before"/> </aop:aspect> </aop:config> <!-- 配置数据库注解aop -->
/** * 定义数据源的AOP切面,通过该Service的方法名判断是应该走读库还是写库 * */ public class DataSourceAspect { /** * 在进入Service方法之前执行 * * @param point 切面对象 */ public void before(JoinPoint point) { // 获取到当前执行的方法名 String methodName = point.getSignature().getName(); if (isSlave(methodName)) { // 标记为读库 DynamicDataSourceHolder.markSlave(); } else { // 标记为写库 DynamicDataSourceHolder.markMaster(); } } /** * 判断是否为读库 * * @param methodName * @return */ private Boolean isSlave(String methodName) { // 方法名以query、find、get开头的方法名走从库 return StringUtils.startsWithAny(methodName, new String[]{"query", "find", "get","select"}); }
/** * 定义动态数据源,实现通过集成Spring提供的AbstractRoutingDataSource,只需要实现determineCurrentLookupKey方法即可 * <p> * 由于DynamicDataSource是单例的,线程不安全的,所以采用ThreadLocal保证线程安全,由DynamicDataSourceHolder完成。 */ public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // 使用DynamicDataSourceHolder保证线程安全,并且得到当前线程中的数据源key return DynamicDataSourceHolder.getDataSourceKey(); } }
/** * 使用ThreadLocal技术来记录当前线程中的数据源的key */ public class DynamicDataSourceHolder { //写库对应的数据源key private static final String MASTER = "master"; //读库对应的数据源key private static final String SLAVE = "slave"; //使用ThreadLocal记录当前线程的数据源key private static final ThreadLocal<String> holder = new ThreadLocal<String>(); /** * 设置数据源key * * @param key */ public static void putDataSourceKey(String key) { holder.set(key); } /** * 获取数据源key * * @return */ public static String getDataSourceKey() { return holder.get(); } /** * 标记写库 */ public static void markMaster() { putDataSourceKey(MASTER); } /** * 标记读库 */ public static void markSlave() { putDataSourceKey(SLAVE); }
相关文章推荐
- springmvc+mybatis+druid+mysql proxy读写分离配置
- java-durid、mybatis、spring 整合基于 AbstractRoutingDataSource 的多数据源读写分离配置
- spring+mybatis读写分离配置
- mysql+spring+mybatis实现数据库读写分离[代码配置] .
- Spring+Mybatis 实现aop数据库读写分离与多数据库源配置操作
- 未测试---- mysql+spring+mybatis实现数据库读写分离[代码配置]
- mysql+spring+mybatis实现数据库读写分离[代码配置]
- Spring+mybatis 实现aop数据库读写分离,多数据库源配置
- mysql+spring+mybatis实现数据库读写分离[代码配置]
- mysql+spring+mybatis实现数据库读写分离[代码配置]
- spring + mybatis + mysql(主从) 配置多个resource(读写分离)
- SpringMVC+ Mybatis 配置多数据源 + 自动数据源切换 + 实现数据库读写分离
- 一、MyBatis简介与配置MyBatis+Spring+MySql
- MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql
- 一、MyBatis简介与配置MyBatis+Spring+MySql
- SqlMapConfig.xml --- 在spring配置文件中自动加载的mybatis文件
- Spring、MyBatis的整合数据映射器类(UserMapper->iocContext.xml)配置文件详解
- spring3.0.5+mybatis 3.04+struts2.2.3+junit 完整配置
- Spring3.0和Mybatis的集成,含事务配置
- MyBatis简介与配置MyBatis+Spring+MySql