标签:postgresq   shm   utf8mb4   如何   template   表达式   otc   tables   code

介绍:

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

  Sharding-JDBC的核心功能为 数据分片 和 读写分离 ,通过 Sharding-JDBC,应用可以透明的使用 jdbc 访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分布。

  适用于任何基于 Java 的ORM框架,如: Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。

  基于任何第三方的数据库连接池,如: DBCP, C3P0, BoneCP, Druid, HikariCP等。

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

  使用Sharding-Jdbc前需要人工对数据库进行分库分表,在应用程序中加入Sharding-Jdbc的Jar包,应用程序通过Sharding-Jdbc操作分库分表后的数据库和数据表,由于Sharding-Jdbc是对Jdbc驱动的增强,使用Sharding-Jdbc就像使用Jdbc驱动一样,在应用程序中是无需指定具体要操作的分库和分表的。

快速入门:

  1.需求说明

    人工创建两张表,t_order_1和t_order_2,这两张表是订单表拆分后的表,通过Sharding-Jdbc向订单表插入数据,按照一定的分片规则,主键为奇数的进入t_order_1,另一部分数据进入t_order_2,通过Sharding-Jdbc 查询数据,根据 SQL语句的内容从t_order_1或t_order_2查询数据。

  2.创建数据库,创建表

CREATE DATABASE `order_db` CHARACTER SET ‘utf8mb4‘;

USE order_db;

DROP TABLE IF EXISTS t_order_1 ;

CREATE TABLE t_order_1 (
order_id BIGINT (20) NOT NULL COMMENT ‘订单id‘,
price DECIMAL (10, 2) NOT NULL COMMENT ‘订单价格‘,
</span><span style="color: #ff00ff;">user_id</span> BIGINT (20) NOT NULL COMMENT ‘下单用户id‘,
status VARCHAR (50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘订单状态‘,
PRIMARY KEY (order_id) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC ;

DROP TABLE IF EXISTS t_order_2 ;

CREATE TABLE t_order_2 (
order_id BIGINT (20) NOT NULL COMMENT ‘订单id‘,
price DECIMAL (10, 2) NOT NULL COMMENT ‘订单价格‘,
</span><span style="color: #ff00ff;">user_id</span> BIGINT (20) NOT NULL COMMENT ‘下单用户id‘,
status VARCHAR (50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘订单状态‘,
PRIMARY KEY (order_id) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC ;

  3.创建springboot工程,引入maven依赖

<!-- sharding-jdbc和SpringBoot整合的Jar包 -->
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version>
</dependency>

    具体spring boot相关依赖及配置省略.......

  4.分片规则配置

#sharding-jdbc分片规则配置
#数据源
spring.shardingsphere.datasource.names = m1

spring.shardingsphere.datasource.m1.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m1.url = jdbc:mysql://localhost:3306/order_db?useUnicode=true
spring.shardingsphere.datasource.m1.username = root
spring.shardingsphere.datasource.m1.password = root

指定t_order表的数据分布情况,配置数据节点 m1.t_order_1,m1.t_order_2

spring.shardingsphere.sharding.tables.t_order.actual-data-nodes = m1.t_order_$->{1…2}

指定t_order表的主键生成策略为SNOWFLAKE(雪花算法)

spring.shardingsphere.sharding.tables.t_order.key-generator.column = order_id
spring.shardingsphere.sharding.tables.t_order.key-generator.type = SNOWFLAKE

指定t_order表的分片策略,分片策略包括分片键和分片算法  {order_id % 2 + 1}:计算出的值要么为1,要么为2,根据结果选择使用哪张表

spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column = order_id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression = t_order_$->{order_id % 2 + 1}

打开sql输出日志

spring.shardingsphere.props.sql.show = true

    1. 首先定义数据源m1,并对m1进行实际的参数配置。
    2.指定t_order表的数据分布情况,他分布在 m1.t_order_1,m1.t_order_2
    3.指定t_order表的主键生成策略为SNOWFLAKE,SNOWFLAKE是一种分布式自增算法,保证id全局唯一
    4.定义t_order分片策略,order_id为偶数的数据落在t_order_1,为奇数的落在t_order_2,分表策略的表达式为 t_order_$->{order_id % 2 + 1}

  5.持久层

@Mapper
public interface OrderDao {
</span><span style="color: #008000;">/**</span><span style="color: #008000;">* 插入订单* </span><span style="color: #808080;">@param</span><span style="color: #008000;"> price* </span><span style="color: #808080;">@param</span><span style="color: #008000;"> userId* </span><span style="color: #808080;">@param</span><span style="color: #008000;"> status* </span><span style="color: #808080;">@return</span><span style="color: #008000;">*/</span><span style="color: #000000;">
@Insert(</span>"insert into t_order(price, user_id, status) values(#{price}, #{userId}, #{status})"<span style="color: #000000;">)
</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> insertOrder(BigDecimal price, Long userId, String status);</span><span style="color: #008000;">/**</span><span style="color: #008000;">* 根据id列表查询订单* </span><span style="color: #808080;">@param</span><span style="color: #008000;"> orderIds* </span><span style="color: #808080;">@return</span><span style="color: #008000;">*/</span><span style="color: #000000;">
@Select(</span>"&lt;script&gt;" +"select" +" * " +" from t_order o " +" where o.order_id in " +" &lt;foreach collection=‘orderIds‘ open=‘(‘ separator=‘,‘ close=‘)‘ item=‘id‘&gt;" +" #{id} " +" &lt;/foreach&gt;" +"&lt;/script&gt;"<span style="color: #000000;">)
List</span>&lt;Map&gt; selectOrderbyIds(@Param("orderIds") List&lt;Long&gt;<span style="color: #000000;"> orderIds);

}

  6.测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ShardingJdbcSimpleBootstrap.class})
public class OrderDaoTest {
@Autowired
OrderDao orderDao;@Test
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> testInsertOrder() {</span><span style="color: #008000;">//</span><span style="color: #008000;"> for (int i = 1; i &lt;= 20; i++) {</span>orderDao.insertOrder(<span style="color: #0000ff;">new</span> BigDecimal(21), 1L, "SUCCESS"<span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;"> }</span>

}

@Test
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> testSelectOrderbyIds() {List</span>&lt;Long&gt; ids = <span style="color: #0000ff;">new</span> ArrayList&lt;&gt;<span style="color: #000000;">();ids.add(</span>463369285373263872L<span style="color: #000000;">);ids.add(</span>463369285301960704L<span style="color: #000000;">);List</span>&lt;Map&gt; maps =<span style="color: #000000;"> orderDao.selectOrderbyIds(ids);System.out.println(maps);
}

}

执行流程:

  查看日志,Sharding-JDBC在拿到用户要执行的sql之后干了哪些事儿:
    (1)解析sql,获取片键值,在本例中是order_id
    (2)Sharding-JDBC通过规则配置 t_order_$->{order_id % 2 + 1},知道了当order_id为偶数时,应该往t_order_1表插数据,为奇数时,往t_order_2插数据。
    (3)于是Sharding-JDBC根据order_id的值改写sql语句,改写后的SQL语句是真实所要执行的SQL语句。
    (4)执行改写后的真实sql语句
    (5)将所有真正执行sql的结果进行汇总合并,返回。

Java配置类的方式配置分片规则:

@Configuration
public class ShardingJdbcConfig {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 配置分片规则
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义数据源</span>
Map&lt;String, DataSource&gt;<span style="color: #000000;"> createDataSourceMap() {DruidDataSource dataSource1 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> DruidDataSource();dataSource1.setDriverClassName(</span>"com.mysql.jdbc.Driver"<span style="color: #000000;">);dataSource1.setUrl(</span>"jdbc:mysql://localhost:3306/order_db?useUnicode=true"<span style="color: #000000;">);dataSource1.setUsername(</span>"root"<span style="color: #000000;">);dataSource1.setPassword(</span>"root"<span style="color: #000000;">);Map</span>&lt;String, DataSource&gt; result = <span style="color: #0000ff;">new</span> HashMap&lt;&gt;<span style="color: #000000;">();result.put(</span>"m1"<span style="color: #000000;">, dataSource1);</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> result;
}</span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义主键生成策略</span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> KeyGeneratorConfiguration getKeyGeneratorConfiguration() {KeyGeneratorConfiguration result </span>= <span style="color: #0000ff;">new</span> KeyGeneratorConfiguration("SNOWFLAKE", "order_id"<span style="color: #000000;">);</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> result;
}</span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义t_order表的分片策略</span>

TableRuleConfiguration getOrderTableRuleConfiguration() {
TableRuleConfiguration result = new TableRuleConfiguration(“t_order”, “m1.t_order_KaTeX parse error: Expected 'EOF', got '&' at position 2: -&̲gt;{1..2}"<span…->{order_id % 2 + 1}”));
result.setKeyGeneratorConfig(getKeyGeneratorConfiguration());

    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> result;
}</span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义sharding-Jdbc数据源</span>

@Bean
DataSource getShardingDataSource() throws SQLException {
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());
//spring.shardingsphere.props.sql.show = true
Properties properties = new Properties();
properties.put(“sql.show”, “true”);
return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, properties);
}
}

  由于采用了配置类所以需要屏蔽原来 application.properties 文件中spring.shardingsphere开头的配置信息。
  需要在SpringBoot启动类中屏蔽使用spring.shardingsphere配置项的类:@SpringBootApplication(exclude = SpringBootConfiguration.class)

Sharding-JDBC 快速入门(水平分表)

标签:postgresq   shm   utf8mb4   如何   template   表达式   otc   tables   code

原文地址:https://www.cnblogs.com/roadlandscape/p/12818732.html

(0)

(0)

   

举报
评论 一句话评论(0
                        <div id="commentlistend" name="commentlistend" class="divtextaligncenter margintop20"><span id="lblpage"></span></div></div><div class="margintop20"><form method="post" action="/ajaxjs/info_detail_commentadd.aspx"><div class="divtextalignleft paddingtop20"><div id="commenthf" class="divbackgroundcolor1"></div><div><textarea name="tbcommentcontent" id="tbcommentcontent" class="tb" disabled="disabled" style="width: 680px;height: 120px;"></textarea></div></div><div class="divtextalignright paddingtop10 "><span id="addCommentTishi" class="colorboldHong">登录后才能评论!</span><span id="loginno"><input type="button" class="mbtn1" value="登录" onclick="location.href='http://member.mamicode.com/login.aspx?returnUrl='+document.URL.replace(new RegExp('&amp;', 'g'), '(_)')"></span></div></form></div></div></div><script type="text/javascript">                    mamicode_adload('content_bottom');</script><div style="margin:20px 0 20px 0;">    <div class="_2s94w8raros"><iframe id="iframeu5994850_0" name="iframeu5994850_0" src="https://pos.baidu.com/vczm?conwid=680&amp;conhei=200&amp;rdid=5994850&amp;dc=3&amp;exps=110011&amp;psi=6676795520671d987fef9befb9313ec4&amp;di=u5994850&amp;dri=0&amp;dis=0&amp;dai=2&amp;ps=8284x284&amp;enu=encoding&amp;ant=0&amp;dcb=___adblockplus_&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1595485914705&amp;ti=Sharding-JDBC%20%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%EF%BC%88%E6%B0%B4%E5%B9%B3%E5%88%86%E8%A1%A8%EF%BC%89&amp;ari=2&amp;ver=0716&amp;dbv=2&amp;drs=3&amp;pcs=1583x767&amp;pss=1583x8570&amp;cfv=0&amp;cpl=3&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1595485914&amp;prot=2&amp;rw=767&amp;ltu=http%3A%2F%2Fwww.mamicode.com%2Finfo-detail-2996675.html&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DzkpIdc9xQWVOyKKmuz_bWiwGjglZrGJSMiStQBmjM-kTqgEyodIlXUsuiWta25L2y55SNsVIN0igddgbdYiMNK%26wd%3D%26eqid%3Dcf771d4f000ffa10000000035f192e8a&amp;lcr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DzkpIdc9xQWVOyKKmuz_bWiwGjglZrGJSMiStQBmjM-kTqgEyodIlXUsuiWta25L2y55SNsVIN0igddgbdYiMNK%26wd%3D%26eqid%3Dcf771d4f000ffa10000000035f192e8a&amp;ecd=1&amp;uc=1600x870&amp;pis=-1x-1&amp;sr=1600x900&amp;tcn=1595485915&amp;qn=93e8f8c02680300c&amp;tt=1595485914590.233.233.233" width="680" height="200" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" style="border:0;vertical-align:bottom;margin:0;width:680px;height:200px" allowtransparency="true"></iframe></div>        <script type="text/javascript">        (window.slotbydup = window.slotbydup || []).push({            id: "u5994850",            container: "_2s94w8raros",            async: true        });    </script></div></div></div>

Sharding-JDBC水平分表详细教程相关推荐

  1. Mycat超详细最常用的水平分表规则

    Mycat水平分表ER表 <table name="orders" dataNode="dn1,dn2" rule="mod_rule" ...

  2. 使用sharding-jdbc实现水平分库+水平分表

    前面的文章使用sharding-jdbc实现水平分表中详细记录了如何使用sharding-jdbc实现水平分表,即根据相应的策略,将一部分数据存入到表1中,一部分数据存入到表2中,逻辑上为同一张表,分 ...

  3. 2、ShardingSphere 之 Sharding-JDBC实现水平分表

    文章目录 1 Sharding-JDBC简介 2 Sharding-JDBC 3 Sharding-JDBC实现水平分表 3.1 搭建环境 3.1.1 总体概览 3.1.2 创建SpringBoot工 ...

  4. ShardingSphere(二) 水平分表配置搭建,实现分表写入读取

    概述:本章内容分将搭建一个ShardingSphere工程环境,并实现最简单的单库下的水平分表配置演示.通过解读配置文件我们来了解ShardingSphere中是如何实现他的路由操作. 环境:Spri ...

  5. 水平分表、分库和垂直分表、分库和公共表的代码实现和讲解

    文章目录 一.教学讲解视频 二.环境准备 三.水平分表 1.概念 2.代码 四.水平分库 1.概念 2.代码 五.垂直分表 1.概念 2.代码 六.垂直分库 1.概念 2.代码 七.公共表 1.概念 ...

  6. mysql使用MRG_MyISAM(MERGE)实现水平分表

    来源:http://m.oschina.net/blog/382658 在MySql中数据的优化尤其是大数据量的优化是一门很大的学问,当然其它数据库也是如此,即使你不是DBA,做为一名程序员掌握一些基 ...

  7. mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)

    主从关系 准备三台不同ip的虚拟机 (第一批)主从关系的配置 主192.168.47.131 配置/etc/my.cnf,在[mysqld]下配置 log-error=/var/log/mysqld. ...

  8. 数据库--分库分表--垂直分表与水平分表

    原文网址:数据库--分库分表--垂直分表与水平分表_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍数据库的分库分表的方案:垂直分表与水平分表. 关系型数据库本身比较容易成为系统瓶颈,单机存储容 ...

  9. 彻底搞清分库分表(垂直分库,垂直分表,水平分库,水平分表)

    分库分表是什么 下边以电商系统中的例子来说明,下图是电商系统卖家模块的表结构: 通过以下SQL能够获取到商品相关的店铺信息.地理区域信息: SELECT p.*,r.[地理区域名称],s.[店铺名称] ...

最新文章

  1. PHP Webservice的发布与调用
  2. c#,winform,验证输入内容,文本框,长度,errorprovider组件,方便,快捷
  3. 从delphi到C++Builder
  4. java 邮件 附件_java中javamail发送带附件的邮件实现方法
  5. SAP收购的coresystem app的使用截图
  6. Cookie和会话Session
  7. bat批处理执行python_通过批处理来运行python程序
  8. 帮你快速拿Offer!渣本逆袭大厂面经分享
  9. 文件读写’r'和’rb’区别
  10. amd显卡bios更新工具_【硬件资讯】AMD又Yes啦?全新Ryzen 5000发布!游戏最强CPU尘埃落定!现有主板无缝衔接!!...
  11. (一)spring Boot菜鸟教程-搭建开发环境
  12. Ubuntu 16.04 安装无线网卡 Tenda U12
  13. OOP的六大原则+一法则
  14. 彩色照片转化为黑白照片
  15. app防御ddos/cc攻击
  16. java二维数组周边元素_求出二维数组主对角线、次对角线以及周边元素之和
  17. java表格组件_表格组件 java
  18. 数值分析--matlab迭代求根式
  19. 公司抽奖小程序(自定义名单,空格控制滚动、抽奖,可作弊,可满足千人团队, 带可执行程序下载及源代码)
  20. 谷歌千元级TPU芯片发布,TensorFlow更换Logo推出2.0最新版

热门文章

  1. 图像处理中的Tone Mapping初步学习
  2. 投票功能+代码+java_java投票程序代码
  3. C4D渲染太慢怎么解决,为什么我的C4D老是崩溃?
  4. mx4 pro 刷 原生 android,魅族MX4 Pro怎么刷机?通用刷机和固件升级教程
  5. 日志易—大数据日志分析行业的新星(第一节)
  6. 关于datetimepicker显示1899年的问题
  7. 施晓琴C语言任务测试模拟卷,c语言学习与应用
  8. vscode配置Markdown snippet 的快捷键
  9. 简单介绍一下阿里巴巴矢量图标库的使用
  10. 电脑添加新的固态应硬盘的步骤