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
- spring4.0.2+mybatis3.2.4+sharding-jdbc1.4.2实现分库分表、读写分离及事物支持
- Sharding-JDBC 1.3.0发布——支持读写分离
- Sharding-JDBC读写分离探秘
- Spring实现动态数据源,支持动态添加、删除和设置权重及读写分离
- Spring实现动态数据源,支持动态添加、删除和设置权重及读写分离
- sharding-jdbc读写分离原理解读
- 数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离
- YII支持读写分离
- MongoDB集群及客户端读写分离实现
- Mongodb副本集实现及读写分离
- 读写分离组件Meods原理及实现
- Spring4--Spring4整合mybatis3
- springmvc4.2.1+mybatis3.3.0+maven3.3+mysql读写分离
- mycat+mysql集群:实现读写分离,分库分表
- spring-ddal实现读写分离、分库分表
- MYSQL实现读写分离
- mysql读写分离实现
- CodeIgniter实现读写分离
- 论文《Learning both Weights and Connections for Efficient Neural Network》阅读笔记
- linux中file_operations结构体
- 页面的缓存与不缓存设置
- Oracle11g dgbroker进行自动failover
- Eclipse常用快捷键
- spring4.0.2+mybatis3.2.4+sharding-jdbc1.4.2实现分库分表、读写分离及事物支持
- oracle 最大编码后四位自加并且补零
- 什么是跨域?
- 如何去除vue项目中的 # --- History模式
- 商城项目记录(1)html静态注册页面
- 前端上传组件Plupload学习
- Spark Streaming 应用:空气质量流数据检测
- 数据结构 拓扑排序
- 成为专业程序员路上用到的各种优秀资料、神器及框架