• 全网最全最详细的Sharding-JDBC入门


    背景

    面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。

    如图,将数据库执行读写操作由一台变成两台:

    Sharding-JDBC介绍

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

    使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离。

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

    2、支持任何第三方的数据库连接池,如: DBCP, C3PO, BoneCP, Druid, HikariCP等。

    3、支持任意实现JDBC规范的数据库。目前支持MySQL, Oracle, SQLServer, PostgreSQL以及任何遵循SQL92标准的数据库。

    Sharding-JDBC入门案例

    准备工作,MySQL必须实现主从复制

    1、安装MySQL:

    Linux-18-软件安装_安装MySQL_哔哩哔哩_bilibili

    2、实现主从复制:

    项目优化Day2-03-MySQL主从复制_配置主库Master&从库Slave_哔哩哔哩_bilibili

    开始使用Sharding-JDBC实现读写分离

    1、创建一个maven工程,导入maven坐标

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <parent>
    7. <groupId>org.springframework.bootgroupId>
    8. <artifactId>spring-boot-starter-parentartifactId>
    9. <version>2.4.5version>
    10. <relativePath/>
    11. parent>
    12. <groupId>com.sjgroupId>
    13. <artifactId>sharding-jdbcartifactId>
    14. <version>1.0-SNAPSHOTversion>
    15. <properties>
    16. <java.version>1.8java.version>
    17. properties>
    18. <dependencies>
    19. <dependency>
    20. <groupId>org.springframework.bootgroupId>
    21. <artifactId>spring-boot-starter-webartifactId>
    22. <scope>compilescope>
    23. dependency>
    24. <dependency>
    25. <groupId>org.projectlombokgroupId>
    26. <artifactId>lombokartifactId>
    27. <version>1.18.20version>
    28. dependency>
    29. <dependency>
    30. <groupId>com.alibabagroupId>
    31. <artifactId>fastjsonartifactId>
    32. <version>1.2.76version>
    33. dependency>
    34. <dependency>
    35. <groupId>commons-langgroupId>
    36. <artifactId>commons-langartifactId>
    37. <version>2.6version>
    38. dependency>
    39. <dependency>
    40. <groupId>mysqlgroupId>
    41. <artifactId>mysql-connector-javaartifactId>
    42. <scope>runtimescope>
    43. dependency>
    44. <dependency>
    45. <groupId>com.baomidougroupId>
    46. <artifactId>mybatis-plus-boot-starterartifactId>
    47. <version>3.4.2version>
    48. dependency>
    49. <dependency>
    50. <groupId>com.alibabagroupId>
    51. <artifactId>druid-spring-boot-starterartifactId>
    52. <version>1.1.23version>
    53. dependency>
    54. <dependency>
    55. <groupId>org.apache.shardingspheregroupId>
    56. <artifactId>sharding-jdbc-spring-boot-starterartifactId>
    57. <version>4.0.0-RC1version>
    58. dependency>
    59. dependencies>
    60. <build>
    61. <plugins>
    62. <plugin>
    63. <groupId>org.springframework.bootgroupId>
    64. <artifactId>spring-boot-maven-pluginartifactId>
    65. <version>2.4.5version>
    66. plugin>
    67. plugins>
    68. build>
    69. project>

    2、编写yml配置文件

    1. server:
    2. port: 7777
    3. spring:
    4. shardingsphere:
    5. datasource:
    6. names:
    7. master,slave
    8. # 主数据源
    9. master:
    10. type: com.alibaba.druid.pool.DruidDataSource
    11. driver-class-name: com.mysql.cj.jdbc.Driver
    12. url: jdbc:mysql://192.168.11.101:3306/test?characterEncoding=utf-8
    13. username: root
    14. password: root
    15. # 从数据源
    16. slave:
    17. type: com.alibaba.druid.pool.DruidDataSource
    18. driver-class-name: com.mysql.cj.jdbc.Driver
    19. url: jdbc:mysql://192.168.11.102:3306/test?characterEncoding=utf-8
    20. username: root
    21. password: root
    22. masterslave:
    23. # 读写分离配置
    24. load-balance-algorithm-type: round_robin #轮询
    25. # 最终数据源名称
    26. name: dataSource
    27. # 主库数据源名称
    28. master-data-source-name: master
    29. # 从库数据源名称列表,多个逗号隔开
    30. slave-data-source-names: slave
    31. props:
    32. sql:
    33. #开启sql显示,默认为false
    34. show: true
    35. main:
    36. allow-bean-definition-overriding: true
    37. mybatis-plus:
    38. configuration:
    39. #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    40. map-underscore-to-camel-case: true
    41. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    42. global-config:
    43. db-config:
    44. id-type: ASSIGN_ID

    3、编写dao层,pojo层,service层,controller层,启动类进行测试

    dao层:

    1. package com.sj.dao;
    2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    3. import com.sj.pojo.User;
    4. import org.apache.ibatis.annotations.Mapper;
    5. @Mapper
    6. public interface UserMapper extends BaseMapper {
    7. }

    pojo层:

    1. package com.sj.pojo;
    2. import lombok.Data;
    3. import java.io.Serializable;
    4. @Data
    5. public class User implements Serializable {
    6. private static final long serialVersionUID = 1L;
    7. private Long id;
    8. private String name;
    9. private Integer age;
    10. private String address;
    11. }

    service层:

    1. package com.sj.service;
    2. import com.baomidou.mybatisplus.extension.service.IService;
    3. import com.sj.pojo.User;
    4. import java.util.List;
    5. public interface UserService extends IService {
    6. User saveUser(User user);
    7. String deleteUser(Long id);
    8. String updateUser(User user);
    9. User getUserById(Long id);
    10. List listUsers(User user);
    11. }
    1. package com.sj.service.impl;
    2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    4. import com.sj.dao.UserMapper;
    5. import com.sj.pojo.User;
    6. import com.sj.service.UserService;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.stereotype.Service;
    9. import javax.annotation.Resource;
    10. import javax.sql.DataSource;
    11. import java.util.List;
    12. @Service
    13. public class UserServiceImpl extends ServiceImpl implements UserService {
    14. @Autowired
    15. private DataSource dataSource;
    16. @Resource
    17. private UserMapper userMapper;
    18. /**
    19. * 新增用户
    20. * @param user
    21. * @return
    22. */
    23. @Override
    24. public User saveUser(User user) {
    25. userMapper.insert(user);
    26. return user;
    27. }
    28. /**
    29. * 删除用户
    30. * @param id 用户id
    31. */
    32. @Override
    33. public String deleteUser(Long id) {
    34. int deleteUser = userMapper.deleteById(id);
    35. return deleteUser > 0 ? "删除用户成功!!!" : "删除用户失败!!!";
    36. }
    37. /**
    38. * 修改用户信息
    39. * @param user
    40. * @return
    41. */
    42. @Override
    43. public String updateUser(User user) {
    44. int updateUser = userMapper.updateById(user);
    45. return updateUser > 0 ? "修改用户成功!!!" : "修改用户失败!!!";
    46. }
    47. /**
    48. * 根据id查询用户信息
    49. * @param id 用户id
    50. * @return
    51. */
    52. @Override
    53. public User getUserById(Long id) {
    54. return userMapper.selectById(id);
    55. }
    56. /**
    57. * 根据条件查询用户信息
    58. * @param user
    59. * @return
    60. */
    61. @Override
    62. public List listUsers(User user) {
    63. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    64. queryWrapper.eq(user.getId()!=null,User::getId,user.getId());
    65. queryWrapper.eq(user.getName()!=null,User::getName,user.getName());
    66. return userMapper.selectList(queryWrapper);
    67. }
    68. }

    controller层:

    1. package com.sj.controller;
    2. import com.sj.pojo.User;
    3. import com.sj.service.UserService;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.web.bind.annotation.*;
    6. import java.util.List;
    7. @RestController
    8. @RequestMapping("/user")
    9. public class UserController {
    10. @Autowired
    11. private UserService userService;
    12. @PostMapping
    13. public User saveUser(User user) {
    14. return userService.saveUser(user);
    15. }
    16. @DeleteMapping("/{id}")
    17. public String deleteUser(@PathVariable Long id) {
    18. return userService.deleteUser(id);
    19. }
    20. @PutMapping
    21. public String updateUser(User user){
    22. return userService.updateUser(user);
    23. }
    24. @GetMapping("/{id}")
    25. public User getUserById(@PathVariable Long id){
    26. return userService.getUserById(id);
    27. }
    28. @GetMapping("/list")
    29. public List listUsers(User user){
    30. return userService.listUsers(user);
    31. }
    32. }

    启动类:

    1. package com.sj;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.boot.SpringApplication;
    4. import org.springframework.boot.autoconfigure.SpringBootApplication;
    5. @Slf4j
    6. @SpringBootApplication
    7. public class ShardingJdbcApplication {
    8. public static void main(String[] args) {
    9. SpringApplication.run(ShardingJdbcApplication.class,args);
    10. log.info("项目启动成功......");
    11. }
    12. }

    查询测试:

    localhost:7777/user/123

    新增测试:

    localhost:7777/user?name=陈东&age=19

    修改测试:

    localhost:7777/user?name=东升&age=19&id=1588946291784720386

    删除测试:

    localhost:7777/user/1588946291784720386

     

  • 相关阅读:
    51.HarmonyOS鸿蒙系统 App(ArkUI)通知
    最快的 TCP 拥塞控制算法
    C# - readonly 和 const 关键字
    async和await用法介绍
    Android GPU版本和占用
    java计算机毕业设计HTML5互动游戏新闻网站设计与实现源码+mysql数据库+系统+lw文档+部署
    CentOS7安装Docker遇到的问题笔记
    [蓝桥杯 2022 省 A] 求和
    重新认识下JVM级别的本地缓存框架Guava Cache(2)——深入解读其容量限制与数据淘汰策略
    Java 日期格式(yyyy-MM-dd 与YYYY-MM-dd 区别
  • 原文地址:https://blog.csdn.net/weixin_55076626/article/details/127711780