spring4.0.2+mybatis3.2.4+sharding-jdbc1.4.2实现分库分表、读写分离及事物支持

来源:互联网 发布:智慧树网络课答案2017 编辑:程序博客网 时间:2024/06/08 17:53

当当sharding-jdbc的使用公司挺多的,今天就整理下sharding-jdbc最新的配置及使用,包含实现分库分表、主从及事物支持范围。

1、pom文件引用

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <spring.version>4.0.2.RELEASE</spring.version><mybatis.version>3.2.4</mybatis.version>    <sharding-jdbc.version>1.4.2</sharding-jdbc.version></properties>

<dependency><groupId>com.dangdang</groupId><artifactId>sharding-jdbc-core</artifactId><version>${sharding-jdbc.version}</version></dependency><dependency><groupId>com.dangdang</groupId><artifactId>sharding-jdbc-config-spring</artifactId><version>${sharding-jdbc.version}</version></dependency>
2、spring配置
       spring-database.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"xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"><context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/><bean name="sharding_0" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="url" value="${jdbc_url0}" /><property name="username" value="${jdbc_username0}" /><property name="password" value="${jdbc_password0}" /><!-- <property name="driverClass" value="${jdbc_driver0}" /> --><!-- 初始化连接大小 --><property name="initialSize" value="0" /><!-- 连接池最大使用连接数量 --><property name="maxActive" value="20" /><!-- 连接池最小空闲 --><property name="minIdle" value="0" /><!-- 获取连接最大等待时间 --><property name="maxWait" value="60000" /><property name="validationQuery" value="${validationQuery}" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><property name="testWhileIdle" value="true" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="25200000" /><!-- 打开removeAbandoned功能 --><property name="removeAbandoned" value="true" /><!-- 1800秒,也就是30分钟 --><property name="removeAbandonedTimeout" value="1800" /><!-- 关闭abanded连接时输出错误日志 --><property name="logAbandoned" value="true" /><property name="filters" value="stat" /></bean><bean name="sharding_1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="url" value="${jdbc_url1}" /><property name="username" value="${jdbc_username1}" /><property name="password" value="${jdbc_password1}" /><!-- <property name="driverClass" value="${jdbc_driver1}" /> --><!-- 初始化连接大小 --><property name="initialSize" value="0" /><!-- 连接池最大使用连接数量 --><property name="maxActive" value="20" /><!-- 连接池最小空闲 --><property name="minIdle" value="0" /><!-- 获取连接最大等待时间 --><property name="maxWait" value="60000" /><property name="validationQuery" value="${validationQuery}" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><property name="testWhileIdle" value="true" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="25200000" /><!-- 打开removeAbandoned功能 --><property name="removeAbandoned" value="true" /><!-- 1800秒,也就是30分钟 --><property name="removeAbandonedTimeout" value="1800" /><!-- 关闭abanded连接时输出错误日志 --><property name="logAbandoned" value="true" /><property name="filters" value="stat" /></bean><bean name="sharding_0_slave" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="url" value="${jdbc_slave_url0}" /><property name="username" value="${jdbc_slave_username0}" /><property name="password" value="${jdbc_slave_password0}" /><!-- <property name="driverClass" value="${jdbc_driver0}" /> --><!-- 初始化连接大小 --><property name="initialSize" value="0" /><!-- 连接池最大使用连接数量 --><property name="maxActive" value="20" /><!-- 连接池最小空闲 --><property name="minIdle" value="0" /><!-- 获取连接最大等待时间 --><property name="maxWait" value="60000" /><property name="validationQuery" value="${validationQuery}" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><property name="testWhileIdle" value="true" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="25200000" /><!-- 打开removeAbandoned功能 --><property name="removeAbandoned" value="true" /><!-- 1800秒,也就是30分钟 --><property name="removeAbandonedTimeout" value="1800" /><!-- 关闭abanded连接时输出错误日志 --><property name="logAbandoned" value="true" /><property name="filters" value="stat" /></bean><bean name="sharding_1_slave" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="url" value="${jdbc_slave_url1}" /><property name="username" value="${jdbc_slave_username1}" /><property name="password" value="${jdbc_slave_password1}" /><!-- <property name="driverClass" value="${jdbc_driver1}" /> --><!-- 初始化连接大小 --><property name="initialSize" value="0" /><!-- 连接池最大使用连接数量 --><property name="maxActive" value="20" /><!-- 连接池最小空闲 --><property name="minIdle" value="0" /><!-- 获取连接最大等待时间 --><property name="maxWait" value="60000" /><property name="validationQuery" value="${validationQuery}" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><property name="testWhileIdle" value="true" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="25200000" /><!-- 打开removeAbandoned功能 --><property name="removeAbandoned" value="true" /><!-- 1800秒,也就是30分钟 --><property name="removeAbandonedTimeout" value="1800" /><!-- 关闭abanded连接时输出错误日志 --><property name="logAbandoned" value="true" /><property name="filters" value="stat" /></bean></beans>
     spring-sharding.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"xmlns:tx="http://www.springframework.org/schema/tx"       xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd       http://www.dangdang.com/schema/ddframe/rdb  http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd">    <import resource="spring-database.xml"/><context:component-scan base-package="com.yufei.sharding_jdbc" />            <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">        <property name="basePackage" value="com.yufei.sharding_jdbc.mapper"/>        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>    </bean>        <!-- 配置sqlSessionFactory -->     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="shardingDataSource"/>        <property name="mapperLocations" value="classpath:mapper/*.xml"/>    </bean>    <rdb:master-slave-data-source id="rbb_0" master-data-source-ref="sharding_0" slave-data-sources-ref="sharding_0_slave"/>    <rdb:master-slave-data-source id="rbb_1" master-data-source-ref="sharding_1" slave-data-sources-ref="sharding_1_slave"/>    <rdb:strategy id="userTableStrategy"  sharding-columns="user_id" algorithm-class="com.yufei.sharding_jdbc.algorithm.UserTableShardingAlgorithm"/>    <rdb:strategy id="userDataBaseStrategy"  sharding-columns="user_id" algorithm-class="com.yufei.sharding_jdbc.algorithm.UserDataBaseShardingAlgorithm"/>    <rdb:data-source id="shardingDataSource">        <rdb:sharding-rule data-sources="rbb_0,rbb_1" default-data-source="rbb_0">            <rdb:table-rules>                <rdb:table-rule logic-table="t_user" actual-tables="t_user_${0..2}" database-strategy="userDataBaseStrategy" table-strategy="userTableStrategy"/>            </rdb:table-rules>        </rdb:sharding-rule>    </rdb:data-source>    <!-- 事务 -->    <bean id="transactionManager"          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="shardingDataSource" />    </bean>    <tx:annotation-driven transaction-manager="transactionManager" /></beans>

    3、分库规则实现
        
 /**     * sql 中关键字 匹配符为 =的时候,表的路由函数     * @param availableTargetNames     * @param shardingValue     * @return     */    public String doEqualSharding(Collection<String> availableTargetNames, ShardingValue<Integer> shardingValue) {        for (String each : availableTargetNames) {            if (each.endsWith(shardingValue.getValue() % 2 + "")) {                return each;            }        }        throw new IllegalArgumentException();    }    /**     * sql 中关键字 匹配符为 in 的时候,表的路由函数     * @param availableTargetNames     * @param shardingValue     * @return     */    public Collection<String> doInSharding(Collection<String> availableTargetNames, ShardingValue<Integer> shardingValue) {        Collection<String> result = new LinkedHashSet<String>(availableTargetNames.size());        for (Integer value : shardingValue.getValues()) {            for (String tableName : availableTargetNames) {                if (tableName.endsWith(value % 2 + "")) {                    result.add(tableName);                }            }        }        return result;    }

      分表规则实现:
       
 /**     * sql 中 = 操作时,table的映射     * @param tableNames     * @param shardingValue     * @return     */    public String doEqualSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) {        for (String each : tableNames) {            if (each.endsWith(shardingValue.getValue() % 3 + "")) {                return each;            }        }        throw new IllegalArgumentException();    }    /**     * sql 中 in 操作时,table的映射     * @param tableNames     * @param shardingValue     * @return     */    public Collection<String> doInSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) {        Collection<String> result = new LinkedHashSet<String>(tableNames.size());        for (Integer value : shardingValue.getValues()) {            for (String tableName : tableNames) {                if (tableName.endsWith(value % 3 + "")) {                    result.add(tableName);                }            }        }        return result;    }

    本来想详细描述下的, 但是时间有限,这里我就把demo分享给大家,大家有疑问的地方,我们一起探讨沟通。如不正确的地方,也希望能留言指正,谢谢  demo下载地址:http://download.csdn.net/download/yufei_java/10140530   

阅读全文
0 0
原创粉丝点击