zoukankan      html  css  js  c++  java
  • spring+mybatis实现读写分离

    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);		
    	}
    }
    
  • 相关阅读:
    Codeforces 834D The Bakery
    hdu 1394 Minimum Inversion Number
    Codeforces 837E Vasya's Function
    Codeforces 837D Round Subset
    Codeforces 825E Minimal Labels
    Codeforces 437D The Child and Zoo
    Codeforces 822D My pretty girl Noora
    Codeforces 799D Field expansion
    Codeforces 438D The Child and Sequence
    Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D)
  • 原文地址:https://www.cnblogs.com/tangyanbo/p/4601220.html
Copyright © 2011-2022 走看看