jpa 级联查询重复第一条数据_纯干货 | Sharding-jdbc + JPA + Druid分库分表具体实现源码...

本文详细介绍了如何使用Sharding-JDBC结合JPA和Druid实现分库分表,包括数据库分片方案、Sharding-JDBC的特性、配置步骤以及Mybatis的集成,提供了具体的源码分析,帮助开发者理解和实践分布式数据访问。
摘要由CSDN通过智能技术生成

分库分表是解决关系数据库大表的一个很重要的方式,本文将详细讲解如何使用当当网开源的框架来实现分库分表的具体实现,本文是不可多得的详细讲解并亲自实践的Sharding-jdbc的文章,请大家收藏学习。

一:数据库分片方案

  • 客户端代理: 分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现。 当当网的 Sharding-JDBC 、阿里的TDDL是两种比较常用的实现。
  • 中间件代理: 在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。 我们现在谈的 Mycat、360的Atlas、网易的DDB等等都是这种架构的实现

二:Sharding-JDBC

Sharding-JDBC: https://github.com/dangdangdotcom/sharding-jdbc

Sharding-JDBC是一个开源的适用于微服务的分布式数据访问基础类库,它始终以云原生的基础开发套件为目标。

Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,未使用中间层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式,可理解为增强版的JDBC驱动,旧代码迁移成本几乎为零。

Sharding-JDBC完整的实现了分库分表,读写分离和分布式主键功能,并初步实现了柔性事务。从2016年开源至今,在经历了整体架构的数次精炼以及稳定性打磨后,如今它已积累了足够的底蕴,相信可以成为开发者选择技术组件时的一个参考。

1.分库分表

  • SQL解析功能完善,支持聚合,分组,排序,LIMIT,TOP等查询,并且支持级联表以及笛卡尔积的表查询
  • 支持内、外连接查询
  • 分片策略灵活,可支持=,BETWEEN,IN等多维度分片,也可支持多分片键共用,以及自定义分片策略
  • 基于Hint的强制分库分表路由

2.读写分离

  • 一主多从的读写分离配置,可配合分库分表使用
  • 基于Hint的强制主库路由

3.柔性事务

  • 最大努力送达型事务
  • TCC型事务(TBD)

4.分布式主键

  • 统一的分布式基于时间序列的ID生成器

5.兼容性

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

6.灵活多样的配置

  • Java
  • YAML
  • Inline表达式
  • Spring命名空间
  • Spring boot starter

7.分布式治理能力 (2.0新功能)

  • 配置集中化与动态化,可支持数据源、表与分片策略的动态切换(2.0.0.M1)
  • 客户端的数据库治理,数据源失效自动切换(2.0.0.M2)
  • 基于Open Tracing协议的APM信息输出(2.0.0.M3)

架构图

5249b6c98ad38c82fccfaa32f977e375.png

三:sharding-jdbc + jpa + druid集成

072b202e1cf947086028bcef0d671302.png

1. 数据库准备

-- 在db0数据库上分别创建t_order_0、t_order_1表USE db0;DROP TABLE IF EXISTS t_order_0; CREATE TABLE t_order_0 ( order_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, PRIMARY KEY (order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; DROP TABLE IF EXISTS t_order_1; CREATE TABLE t_order_1 ( order_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, PRIMARY KEY (order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- 在db1数据库上分别创建t_order_0、t_order_1表USE db1;DROP TABLE IF EXISTS t_order_0; CREATE TABLE t_order_0 ( order_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, PRIMARY KEY (order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; DROP TABLE IF EXISTS t_order_1; CREATE TABLE t_order_1 ( order_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, PRIMARY KEY (order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

2. 引入依赖

<?xml version="1.0" encoding="UTF-8"?>4.0.0com.company    sharding-jdbc    0.0.1-SNAPSHOTjarsharding-jdbcDemo project for Spring Bootorg.springframework.boot        spring-boot-starter-parent        2.0.3.RELEASEUTF-8UTF-81.8mysql            mysql-connector-java            5.1.41com.alibaba            druid            1.1.10org.springframework.boot            spring-boot-starter-data-jpa        com.dangdang            sharding-jdbc-core            1.5.4org.springframework.boot            spring-boot-starter-web        org.projectlombok            lombok            trueorg.springframework.boot            spring-boot-starter-test            testorg.springframework.boot   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值