服务器
【技术沙龙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