sharding分表后主键_Sharding-JDBC 使用入门和基本配置

34ab280c2ff713a6a38f9522f50e93e7.png

一、什么是Sharding-JDBC

Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

二、Sharding-JDBC能做什么

  • 分库 & 分表
  • 读写分离
  • 分布式主键
  • 分布式事务

三、适用项目框架

Sharding-JDBC适用于:

  • 任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意实现JDBC规范的数据库,目前支持MySQL,Oracle,SQLServer和PostgreSQL。

四、Maven依赖

<!-- sharding jdbc 开始-->
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-core</artifactId><version>${sharding.version}</version>
</dependency>
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-jdbc-spring-namespace</artifactId><version>${sharding.version}</version>
</dependency>
<!—如果不配置分布式事务的话配置上边两个就够了 --> 
<!--分布式事务引用依赖-->
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-transaction-2pc-xa</artifactId><version>${sharding.version}</version></dependency>
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-transaction-spring</artifactId><version>${sharding.version}</version>
</dependency>
<!-- sharding jdbc 结束-->
<!--AspectJ AOP支持 -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectjweaver.version}</version>
</dependency>

五、读写分离

5.1 数据源配置

先配置数据源

也可以配置读写分离

以下配置是ds0ds1两个数据库的主和从一共四个数据源。

parentDs 是数据源公共的配置,抽出去以免写重复代码。

<!-- ds0的主-->
<bean id="ds0_master" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs"> 
<property name="driverClassName" value=""/><property name="url" value=""/>
</bean>
<!-- ds0的从-->
<bean id="ds0_slave" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs"><property name="driverClassName" value=""/><property name="url" value="${sharding.connection.url.0}"/>
</bean>
<!-- ds1的主-->
<bean id="ds1_master" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs"><property name="driverClassName" value=""/><property name="url" value="${sharding.connection.url.1}"/>
</bean>
<!-- ds1的从-->
<bean id="ds1_slave" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs"><property name="driverClassName" value=""/><property name="url" value="${sharding.connection.url.1}"/>
</bean>

5.2 读写分离配置

只配置主从不配置分库分表的情况如下,如果要配置分库分表则不需要下面这个配置。

master-data-source-name 是主数据源ID

slave-data-source-names 是从数据源ID

<master-slave:data-source id="masterSlaveDataSource" master-data-source-name="ds0_master, ds1_master" slave-data-source-names="ds0_slave, ds1_slave " ><master-slave:props><prop key="sql.show">${sql_show}</prop><prop key="executor.size">10</prop><prop key="foo">bar</prop></master-slave:props>
</master-slave:data-source>

5.3 读写分离和分库分表一起配置

如果读写分离和分库分表一起使用的话把主从路由配置到 shardingdata-source下就可以了。

sharding:master-slave-rule 的 id 就是配置出来的逻辑的数据源的名称,如果多个从的话还可以通过配置strategy-ref来配置负载均衡。

master-data-source 配置的是主库数据源ID 。

slave-data-source 配置的是从库数据源ID,多个以逗号分开。

<!-- sharding数据源-->
<sharding:data-source id="shardingDataSource"><!-- 读写分离的话要把所有的主从数据源都写在这里--><sharding:sharding-ruledata-source-names="ds0_master,ds0_slave,ds1_master,ds1_slave "><!-- 读写分离的路由 一主一从配置 strategy-ref  --><sharding:master-slave-rules><sharding:master-slave-rule id="ds0" master-data-source-name="ds0_master"                                        slave-data-source-names="ds0_slave"/><sharding:master-slave-rule id="ds1" master-data-source-name="ds1_master"                                        slave-data-source-names="ds1_slave"/></sharding:master-slave-rules><!-- 读写分离配置 结束--><sharding:table-rules><!— 这里是分库分表路由的配置 --></sharding:table-rules><sharding:binding-table-rules><!—- 绑定表的配置 --> </sharding:binding-table-rules></sharding:sharding-rule>
<sharding:props><!-- 显示SQL --><prop key="sql.show">true</prop></sharding:props>
</sharding:data-source>

六、数据分片

6.1 分片支持

Sharding-JDBC提供了5种分片策略。由于分片算法和业务实现紧密相关,因此Sharding-JDBC并未提供内置分片算法,而是通过分片策略将各种场景提炼出来,提供更高层级的抽象,并提供接口让应用开发者自行实现分片算法。

StandardShardingStrategy

标准分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片;RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。

ComplexShardingStrategy

复合分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此Sharding-JDBC并未做过多的封装,而是直接将分片键值组合以及分片操作符交于算法接口,完全由应用开发者实现,提供最大的灵活度。

InlineShardingStrategy

Inline表达式分片策略。使用Groovy的Inline表达式,提供对SQL语句中的=和IN的分片操作支持。InlineShardingStrategy只支持单分片键,对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: tuser${user_id % 8} 表示t_user表按照user_id按8取模分成8个表,表名称为t_user_0到t_user_7。

HintShardingStrategy

通过Hint而非SQL解析的方式分片的策略。

NoneShardingStrategy

不分片的策略。

6.2 分片配置

标准分片配置

 <!-- 标准分片策略。-->
<bean id="demoUserStandardStrategy" class="shard.strategy.DemoUserStandardStrategy"/>
<sharding:standard-strategy id="shardingDemoUserStandardStrategy"precise-algorithm-ref="demoUserStandardStrategy" sharding-column="id"                            range-algorithm-ref=""/>

DemoUserStandardStrategy标准分片要实现 PreciseShardingAlgorithm 接口,doSharding的两个参数一个是所有数据源的cllection.另一个参数是执行SQL时传过来的分片的值。

/*** 根据ID取* 标准分片策略* 用于处理=和IN的分片* @author yulonggao* @date 2019/1/31 14:35*/
@Slf4j
public class DemoUserStandardStrategy implements PreciseShardingAlgorithm<Long> {@Overridepublic String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {//这个里边有异常会被处理掉,然后导致拿不到分片。但出异常一般是业务代码写错了。//每条指定分片的操作都会调用此方法,如果是in 条件查询的话每个值会调用一次此方法,如果是批量插入也是每一条都要调用一次进行分片log.info("DemoUserStandardStrategy_preciseShardingValue={}", preciseShardingValue);Long suffix = preciseShardingValue.getValue() % 4;log.info("suffix={}", suffix);final String targetDb = String.valueOf(Math.abs(suffix.intValue()));String shardingValue = collection.stream().filter(p -> p.endsWith(targetDb)).findFirst().get();log.info("preciseShardingValue={},shardingValue={}", preciseShardingValue, shardingValue);return shardingValue;}

强制分片

<!-- 强制路由分片策略-->
<bean id="demoUserHintStrategy" class="shard.strategy.DemoUserHintStrategy"/><!-- 强制路由例子使用-->
<sharding:hint-strategy id="shardingDemoUserHintStrategy" algorithm-ref="demoUserHintStrategy"/>DemoUserHintStrategy 的Java 如下,强制分片要实现HintShardingAlgorithm接口。/*** DemoUserHint强制路由分片策略,其实可以共用,只是例子* @author yulonggao* @date 2019/1/31 14:35*/
@Slf4j
public class DemoUserHintStrategy implements HintShardingAlgorithm {@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, ShardingValue shardingValue) {//availableTargetNames 这个参数是所有的dataSource的集合,shardingValue是HintManager传过来的分片信息log.info("DemoUserHintStrategy_availableTargetNames={}", availableTargetNames);log.info("DemoUserHintStrategy_shardingValue={}", shardingValue);ListShardingValue listShardingValue = (ListShardingValue) shardingValue;Collection shardingValueList = listShardingValue.getValues();//因为调用的时候分片是直接传的 DataSource的名称,所以直接返回就可以了,如果传其它值则要加业务逻辑进行分片筛选//返回结果只能是availableTargetNames 里边所包含的return shardingValueList;}}

生成分部式ID的配置,生成主键的类要实现KeyGenerator接口。

<!—主键生成 -->
<bean id="keyId" class="shard.key.DefaultKeyGenerator"/>

41e8d2fe1131706509962b812e48e054.png

七、分布式事务

把下面这行代码配置在spring里,shardingTransaction.xml 是jar包里边带的。

文件的源码只有两行配置:

<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="shardingDataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 事务支持-->
<import resource="classpath:META-INF/shardingTransaction.xml"/>

使用注解配置事务要同时使用ShardingTransactionType和Transactional两个注解。

/*** 注意:@ShardingTransactionType需要同Spring的@Transactional配套使用,事务才会生效。* @param param* @return*/
@ShardingTransactionType(TransactionType.XA)
@Transactional(rollbackFor = Exception.class)
@Override
public int addParam(DemoParam param) {
log.info("addParam-param={}", param);
return demoParamDao.addParam(param);
}

7.1 支持程度

完全支持非跨库事务,例如:仅分表或分库但是路由的结果在单库中。

完全支持因逻辑异常导致的跨库事务。例如:同一事务中跨两个库更新,更新完毕后,抛出空指针,则两个库的内容都能回滚。

支持数据库字段约束造成的回滚。

不支持因网络、硬件异常导致的跨库事务。例如:同一事务中跨两个库更新,更新完毕后、未提交之前,第一个库死机,则只有第二个库数据提交。

八、其他问题

关于order by 排序,如果排序的字段不在查询结果中,生成的SQL也会被带上,但结果不返回给你。

53544e56748b2fa23f33b827368d5e32.png

九、参考文档

https://shardingsphere.apache.org/document/current/cn/manual/sharding-jdbc/usage/sharding/

作者:高玉珑

来源:宜信技术学院

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯官网试题 - 基础练习】 矩形面积交 (几何)

题干&#xff1a; 问题描述 平面上有两个矩形&#xff0c;它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形&#xff0c;我们给出它的一对相对顶点的坐标&#xff0c;请你编程算出两个矩形的交的面积。 输入格式 输入仅包含两行&#xff0c;每行描述一个矩形。   在每行中…

实现运动轨迹_【自动驾驶】运动规划丨速度规划丨时间维度

运动规划是自动驾驶技术栈中的关键一步&#xff0c;负责把上游的孤立、异构、模糊的多方面信息整合成自洽的运动轨迹&#xff08;trajectory&#xff09;&#xff1b;好的轨迹需要满足多方面的要求&#xff0c;其中最重要的方面包括安全性&#xff08;safety&#xff09;和舒适…

【HDU - 1247】Hat’s Words(字典树,预处理,tricks)

题干&#xff1a; A hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary. You are to find all the hat’s words in a dictionary. Input Standard input consists of a number of lowercase words, one …

mysql操作json优点和缺点_MySQL与JSON-为什么?

我正在设计一个小的网络应用程序/游戏。 哪个更好&#xff1a;MySQL表或json文件&#xff1f; 它们都存储信息。 它们都可以由PHP解析。 优点/缺点是什么&#xff1f;这就是我的意思&#xff1a;username | password-------------------seefour | abc123与{"username"…

【csust】最小素因子问题(树状数组)

题干&#xff1a; http://csustacm.com:4803/problem/1083 Description 寒冰射手艾希新学会了一个技能&#xff0c;艾希通过这个技能成为了一名声名远扬的神箭手&#xff0c;从此再也无人敢侵犯弗雷尔卓德&#xff01; 这个技能的描述如下&#xff08;假设英雄联盟内的每个…

操作表格_Excel表格基础操作-新手入门级

今日新学了几个基础操作&#xff0c;觉得很有意思&#xff0c;分享给大家。不过真心觉得&#xff0c;有些操作当时学会了&#xff0c;长时间不用&#xff0c;转眼就忘了&#xff1b;另一方面&#xff0c;如果购买相关课程&#xff0c;学着也没什么意思&#xff0c;我前段时间买…

【csust】寻宝(贪心,思维)

题干&#xff1a; Description 在一维坐标轴上有许多宝藏&#xff0c;总共n种宝藏&#xff0c;每种宝藏有k个。现在共k个人寻宝&#xff0c;k个人初始位置可以位于任意点。但是每人需要按指定顺序捡起宝藏&#xff08;1->2->3->...->n&#xff0c;先捡第1种&…

dmsetup remove_all 这命令干啥的_分一个小知识,服务器上的一个解压与压缩文件的命令....

在服务器上对文件做解压操作,是一件非常常见的操作,如安装软件就有很多是要用的到这个操作的.去官网下载一个压缩包,然后解压,编译,再安装.当然网上是能找到相应的命令操作.但是每次都要去找命令,就算记住了,不知道为什么要这样去使用,那么如果不经常使用那还是会忘记的.所以要…

【POJ - 1947】Rebuilding Roads (树形dp,背包问题,树形背包dp)

题干&#xff1a; The cows have reconstructed Farmer Johns farm, with its N barns (1 < N < 150, number 1..N) after the terrible earthquake last May. The cows didnt have time to rebuild any extra roads, so now there is exactly one way to get from any …

seo vue 动态路由_基于vue.jsvue-router的动态更新TDK(SEO优化)

本文基于工作项目开发&#xff0c;做的整理笔记前几天帮朋友解决这个问题&#xff0c;顺带学习了一下&#xff0c;做个笔记Mark下。前提条件&#xff1a;你已经了解并使用vue&#xff0c;能够搭建应用站点。编码环境&#xff1a;system&#xff1a;OS X EI Capitan 10.13.3npm&…

*多叉树的树形背包常见建模方法

一.多叉树变二叉树。 这个技巧其实也有两种具体的方法&#xff1a;树的孩子兄弟表示法与dfs序法。 1.树的孩子兄弟表示法。 大家在学习树形结构时一定接触了一个多叉树变二叉树的方法&#xff0c;就是把每个点与它的第一个儿子连边&#xff0c;然后将它的儿子依次连接起来。可…

python把英语句子成分字母_求一个可以分析英语句子成分的软件或网站

目前还没有&#xff0c;最好的翻译软件都不能翻译英语语法&#xff0c;只能翻译语法结构简单的句子&#xff0c;更别提专业分析句子成分的软件了&#xff1b;出现专业分析英语句子成分的软件&#xff0c;英语老师应该就失业了。求一个可以分析英语句子成分的软件或网站句子是按…

【51nod - 1076】2条不相交的路径(Tarjan无向图判环)

题干&#xff1a; 给出一个无向图G的顶点V和边E。进行Q次查询&#xff0c;查询从G的某个顶点V[s]到另一个顶点V[t]&#xff0c;是否存在2条不相交的路径。&#xff08;两条路径不经过相同的边&#xff09; &#xff08;注&#xff0c;无向图中不存在重边&#xff0c;也就是说…

python 导入csv文件到oracle_python将文件夹下的所有csv文件存入mysql和oracle数据库

#oracle版首先新建python脚本(d:/python/orclImport.py)import os #引入os包if __name__ __main__:#遍历文件夹下所有的dmp文件&#xff0c;其中filename为所有文件、文件夹的名称。#因为我文件夹下确定都是dmp文件&#xff0c;所以无需进行特殊判断for filename in os.listdi…

createform用法_vue自定义表单生成器form-create使用详解

介绍form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成器。并且支持生成任何 Vue 组件。结合内置17种常用表单组件和自定义组件&#xff0c;再复杂的表单都可以轻松搞定。文档 | github演示项目: 开源的高品质微信商城功能自定义组件可生…

【蓝桥杯官网试题 - 历届试题】发现环(dfs+并查集,或无向图tarjan判环,无向环,或拓扑排序)

题干&#xff1a; 问题描述 小明的实验室有N台电脑&#xff0c;编号1~N。原本这N台电脑之间有N-1条数据链接相连&#xff0c;恰好构成一个树形网络。在树形网络上&#xff0c;任意两台电脑之间有唯一的路径相连。   不过在最近一次维护网络时&#xff0c;管理员误操作使得某…

倍福 在 vs 里 编程 是怎么做到的_截图里的文字要改,字体怎么做到一模一样?...

大家是不是碰到过这么一个尴尬的情况&#xff1a;一个截图里有一个错别字&#xff0c;或者其中一小段文字要修改&#xff0c;可是苦于找不到源文件&#xff0c;又没办法找出和原来文字一模一样的字体。每次遇到这样的情况你都是怎么处理的呢&#xff1f;火箭君今天给大家介绍一…

【ZOJ - 3591】Nim(博弈问题,思维,STLmap)

题干&#xff1a; Nim is a mathematical game of strategy in which two players take turns removing objects from distinct heaps. The game ends when one of the players is unable to remove object in his/her turn. This player will then lose. On each turn, a pla…

【牛客 - 369B】小A与任务(贪心,优先队列)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/369/B 来源&#xff1a;牛客网 小A手头有 n 份任务&#xff0c;他可以以任意顺序完成这些任务&#xff0c;只有完成当前的任务后&#xff0c;他才能做下一个任务 第 i 个任务需要花费 xixi 的时间…

word硬回车是怎么产生的_在word中怎样删除软硬回车?

1.点击“开始”&#xff0d;“程序”&#xff0d;“附件”&#xff0d;“记事本”&#xff0c;打开“记事本”&#xff0c;放在一边。2.打开需要调整的Word文档&#xff0c;在文章的任意处单击一下鼠标左键。然后按住键盘的“Ctrl”键不要松&#xff0c;再按一下“A”键&#x…