陈奇网络工作室

Sharding-JDBC开始使用和基本配置

服务器

【技术沙龙002期】数据中台:宜信敏捷数据中台建设实践|宜信技术沙龙将于5月23日晚8点在线直播,点击报名

一.什么是Sharding-JDBC

Sharding-JDBC被定位为轻量级Java框架,是在Java的JDBC层提供的附加服务。 使用客户端直连数据库作为jar包提供服务。 不需要额外的部署或依赖。 可以理解为扩展版的JDBC驱动程序,与JDBC和各种ORM框架完全兼容。

二. Sharding-JDBC能做什么

分库分表

读写分离

分布式主键

分布式事务处理

三.适用项目框架

Sharding-JDBC适用于以下用途:

基于Java的ORM框架,例如直接使用JPA、Hibernate、Mybatis、spring JDBC模板或JDBC。

基于第三方数据库连接池,如DBCP、C3P0、BoneCP、Druid和HikariCP。

支持实现任何JDBC规范的数据库,目前支持mysql、Oracle、SQLServer和PostgreSQL。

四. Maven依赖

! --shardingjdbc开始-

依存

groupid io.shardingsphere/groupid

授权共享核心/授权id

version $ { s Harding.version }/version

/dependency

依存

groupid io.shardingsphere/groupid

artifactidsharding-JDBC-spring-namespace/artifact id

version $ { s Harding.version }/version

/dependency

! -如果不部署分布式事务,则部署上面两个就足够了-

! -分布式事务引用相关性-

依存

groupid io.shardingsphere/groupid

授权共享-传输- 2pc-xa /授权id

version $ { s Harding.version }/version

/dependency

依存

groupid io.shardingsphere/groupid

授权共享-传输- spring /授权标识

version $ { s Harding.version }/version

/dependency

! --shardingjdbc结束-

! --AspectJAOP支持-

依存

groupIdorg.aspectj/groupId

artifactidaspectjweaver/artifact id

version $ { AspectJ weaver.version }/version

/dependency

五.读写分离

5.1数据源配置

首先设置数据源

也可以配置读写隔离

以下构成

ds0

ds1

两个数据库的主从共四个数据源。

parentDs

在数据源通用配置中,提取不要写重复代码。

! --ds0的主-

beanid=& #039; ds0_master& #039; class=& #039; com.Alibaba.druid.pool.druid data source & amp; #039; destroy-method=& #039; close& #039; 部件=& amp; #039; close& #039; 部件=& amp; #039;

propertyname=& #039; 驱动程序类名称& amp; #039; value=& #039; & #039; /

propertyname=& #039; url& #039; value=& #039; & #039; /

/bean

! --ds0的从-

beanid=& #039; ds0_slave& #039; class=& #039; com.Alibaba.druid.pool.druid data source & amp; #039; destroy-method=& #039; close& #039; 部件=& amp; #039; parent=

propertyname=& #039; 驱动程序类名称& amp; #039; value=& #039; & #039; /

propertyname=& #039; URL& #039; value=& #039; $ { s Harding.connection.URL.0 } & amp; #039; /

/bean

! --ds1的主-

beanid=& #039; ds1_master& #039; class=& #039; com.Alibaba.druid.pool.druid data source & amp; #039; destroy-method=& #039; close& #039; 部件=& amp; #039; close& #039; 部件=& amp; #039;

propertyname=& #039; 驱动程序类名称& amp; #039; value=& #039; & #039; /

propertyname=& #039; URL& #039; value=& #039; $ { s Harding.connection.URL.1 } & amp; #039; /

/bean

! --ds1的从-

beanid=& #039; ds1_slave& #039; class=& #039; com.Alibaba.druid.pool.druid data source & amp; #039; destroy-method=& #039; close& #039; 部件=& amp; #039; pparent=

propertyname=& #039; 驱动程序类名称& amp; #039; value=& #039; & #039; /

propertyname=& #039; URL& #039; value=& #039; $ { s Harding.connection.URL.1 } & amp; #039; /

/bean

5.2读写隔离配置

如果只配置主机而不构成分区表,则如下所示,构成分区表时不需要以下结构。

主-数据来源-名称

这是主数据源ID

slave-data-source-names

从数据源ID

master-slave:data-source id=& amp; #039; masterslavedatasource& #039; master-data-source-name=& #039; ds0_master,ds1_master& #039;

master-slave:props

Propkey=& #039; SQL.show& #039; ${SQL_show}/Prop

propkey=& #039; executor.size& #039; 10/prop

propkey=& #039; foo& #039; bar/prop

/master-slave:props

/master-slave:data-source

5.3读写分离与分库分表配置在一起

如果读写分离与按库划分的表一起使用,则可以将主从路由置于shardingdata-source下。

sharding:master-slave-rule

的id是已配置逻辑的数据源的名称,如果有多个从站,还可以通过配置strategy-ref来配置负载平衡。

主-数据源

已配置主库数据源ID。

备用数据源

由库的数据源ID组成,用逗号分隔多个数据源。

! --sharding数据源-

sharding:data-sourceid=& #039; shardingdatasource& #039;

! -如果要分离读写,请在此处写入所有主从数据源-

sharding:sharding-rule

data-source-names=& #039; ds0_master、ds0_slave、ds1_master、ds1_slave& #039;

! -读写分离的路线主要是strategy-ref--

sharding:master-slave-rules

s Harding:master-slave-rule id=& amp; #039; ds0& #039; master-data-source-name=& #039; ds0_master& #039; slave-data-source-names=

s Harding:master-slave-rule id=& amp; #039; ds1& #039; master-data-source-name=& #039; ds1_master& #039; slave-data-source-names=

/sharding:master-slave-rules

! -读写分离配置结束-

sharding:table-rules

! -这里是分区表的路由配置-

/sharding:table-rules

sharding:binding-table-rules

! -配置绑定表-

/sharding:binding-table-rules

/sharding:sharding-rule

sharding:props

! -显示-SQL

propkey=& #039; sql.show& #039; 真/坡

/sharding:props

/sharding:data-source

六.数据切片

6.1瓷砖支持

Sharding-JDBC提供了五种分片策略。 由于分片算法与业务实现密切相关,因此Sharding-JDBC没有提供内置的分片算法。 相反,它通过分片策略提取各种场景,提供更高级的抽象,并提供接口以帮助APP应用程序开发人员自己实现分片算法。

标准共享存储

标准平铺策略。 支持SQL语句中的=,IN和BETWEEN AND平铺操作。 StandardShardingStrategy仅支持单个切片密钥,并提供了PreciseShardingAlgorithm和RangeShardingAlgorithm两种切片算法。 PreciseShardINgAlgorithm是必需的,用于处理=和in平铺; RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片。 如果不配置RangeShardingAlgorithm,则SQL的BETWEEN AND将根据整个库的路由进行处理。

ComplexShardingStrategy

复合分片策略。 支持SQL语句中的=,IN和BETWEEN AND平铺操作。 ComplexShardingStrategy支持多个切片密钥。 由于多个切片密钥之间的关系很复杂,Sharding-JDBC并不怎么封装,而是直接向算法接口传递切片密钥组合和切片操作符。 它完全由APP应用程序开发人员实施,可提供最大的灵活性。

InlineShardingStrategy

Inline表达式的分片策略。 使用groovy inline表达式支持SQL语句的=和in分片操作。 InlineShardingStrategy仅支持单个平铺键。 对于简单的分片算法,可以在简单的配置中使用,从而避免复杂的Java代码开发。 例如,tuser${user_id % 8}表示t_user表按user_id分为8个表,表名为

HintShardingStrategy

用Hint而不是SQL分析进行切片的策略。

NoneShardingStrategy

不分片策略。

6.2平铺布局

标准片配置

! -标准分片策略。 --

beanid=& #039; demouserstandardstrategy& #039; class=& #039; shard.strategy.demouserstandardstrategy & amp; #039; /

s Harding :标准策略id=& amp; #039; shardingdemouserstandardstrategy & amp; #039;

precise-algorithm-ref=& #039; demouserstandardstrategy& #039; sharding-column=& #039; id& #039; range-algorithm-ref=& #039; & #039; /

doSharding的两个参数是所有数据源的cllection,因为DemoUserStandardStrategy标准分片实现PreciseShardingAlgorithm接口。 另一个参数是运行SQL时传递的分片值。

//*

*根据身份证取用

*标准平铺策略

*处理=和输入平铺

*@authoryulonggao

*@date2019/1/3114:35

*/

@Slf4j

publicclassdemouserstandardstrategyimplementspreciseshardingalgorithmlong {

@Override

publicstringdosharding ( collectionstringcollection,preciseshardingvaluelongpreciseshardingvalue ) {

如果其中有异常,就会被处理,得不到瓷砖。 但是,发生异常一般是业务代码写错了。

//对于指定片的每个操作,都会调用此方法;对于in条件查询,则会按值调用此方法;对于批量插入,也会按片调用此方法

log.info ( demouserstandardstrategy _ preciseshardingvalue={ },preciseshardingvalue );

long suffix=preciseshardingvalue.getvalue ( % 4;

log.info(& #039; suffix={}& #039; suffix );

finalstringtargetdb=string.value of ( math.ABS ) suffix.intvalue ( );

stringshardingvalue=collection.stream (.filter ( p-p.endswith ( target db ) ).findFirst ).get );

log.info ( preciseshardingValue={},shardingvalue={ },preciseShardingValue,shardingvalue );

returnshardingValue

}

强制切片

! -强制路由分片策略-

beanid=& #039; demouserhintstrategy& #039; class=& #039; shard.strategy.demouserhintstrategy & amp; #039; /

! -使用强制路由示例-

sharding:hint-strategyid=& #039; shardingdemouserhintstrategy & amp; #039; algorithm-ref=& #039; demouserhintstrategy& #039; /

DemoUserHintStrategy的Java如下所示,强制片实现HintShardingAlgorithm接口。

//*

*DemoUserHint强制路由片策略实际上可以共享,但只是示例

*@authoryulonggao

*@date2019/1/3114:35

*/

@Slf4j

publicclassdemouserhintstrategyimplementshardingalgorithm {

@Override

publiccollectionstringdosharding ( collectionstringavailabletargetnames,ShardingValueshardingValue ) {

//availableTargetNames这个参数是所有数据源的集合,shardingValue是从HintManager传来的平铺信息

log.info ( demouserhintstrategy _ availabletargetnames={ },availabletargetnames );

log.info ( demouserhintstrategy _ shardingvalue={ } & amp; #039; shardingvalue );

listshardingvaluelistshardingvalue=( listshardingvalue ) shardingvalue;

collectionshardingvaluelist=listshardingvalue.get values (;

//调用时分片是直接传递的DataSource的名称,可以直接返回,但如果传递其他值,则添加业务逻辑进行分片过滤

//返回的结果只能包含在availableTargetNames中

returnshardingValueList

}

}

生成部门ID配置并生成主键的类实现KeyGenerator接口。

! -生成主键-

beanid=& #039; keyid& #039; class=& #039; shard.key.default key generator & amp; #039; /

七.分布式事务

将以下行代码放置在spring中: shardingTransaction.xml在jar包中。

的源代码只有两行。

beanid=& #039; 传输管理器& amp; #039;

class=& #039; org.spring framework.JDBC.data source.datasourcetransactionmanager & amp; #039;

propertyname=& #039; 数据来源& amp; #039; ref=& #039; shardingdatasource& #039; /property

/bean

tx:annotation-driven transaction-manager=& amp; #039; 传输管理器& amp; #039; /

! -事务支持-

importresource=& #039; class path:meta-INF/shardingtransaction.XML & amp; #039; /

要使用注释设置事务,请同时使用ShardingTransactionType和Transactional注释。

//*

*注意:在将@ShardingTransactionType与Spring的@Transactional组合使用之前,事务不会生效。

*@paramparam

*@return

*/

@ shardingtransactiontype ( transaction type.xa ) )。

@ transactional ( roll back for=exception.class ) )。

@Override

公共地址( demoparamparam )。

log.info(addparam-param={},param );

returndemoparamdao.add param ( param;

}

7.1支持级别

只拆分表或存储库,但完全支持非存储库事务,例如,路由结果位于一个存储库中。

完全支持逻辑异常导致的跨库事务。 例如,如果在同一事务中跨两个库进行更新,并且更新完成后抛出空指针,则这两个库的内容都将回滚。

支持通过数据库字段约束进行回滚。

不支持由于网络、硬件异常导致的库间事务。 例如,如果在同一事务中跨两个库进行更新,并且在更新完成后且未提交之前,第一个库死机,则只会提交第二个库数据。

八.其他问题

对于按order by排序,如果查询结果中没有已排序的字段,则还会携带生成的SQL,但不会返回任何结果。

九.参考文件

3359 shardingsphere.Apache.org/document/cn/manual/s Harding-JDBC/usage/s Harding /

作者:高玉珉

来源:

宜信技术学院

详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3