zoukankan      html  css  js  c++  java
  • Spring Boot整合Sharding-JDBC实现读写分离io.shardingsphere(2)

         在本文中使用Spring Boot 2.4.1+MyBatis+Druid+Sharding-JDBC+MySQL进行读写分离的案件讲解。

    1、数据库准备

           1、192.168.8.162  test1主

           2、192.168.8.134  test1从

           3、192.168.8.176  test1从

    2、上代码

       1、pom.xml配置引入maven依赖

     <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
          <!--springboot整合mybatis的依赖 -->
            <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.4</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.10</version>
            </dependency>
    
    
            <dependency>
                <groupId>io.shardingsphere</groupId>
                <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                <version>3.1.0.M1</version>
            </dependency>

     2、在application.yml中配置使用mybatis及引用数据源

    server.port: 8080
    mybatis.config-location: classpath:META-INF/mybatis-config.xml
    spring:
      main:
        allow-bean-definition-overriding: true
    sharding:
      jdbc:
        dataSource:
          names: dbtest0,dbtest1,dbtest2
          # 配置主库
          dbtest0: #org.apache.tomcat.jdbc.pool.DataSource
            type: com.alibaba.druid.pool.DruidDataSource
            driverClassName: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://192.168.8.162:3306/test1?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
            username: root
            password: root
            #最大连接数
            maxPoolSize: 20
          dbtest1: # 配置第一个从库
            type: com.alibaba.druid.pool.DruidDataSource
            driverClassName: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://192.168.8.134:3306/test1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
            username: root
            password: root
            maxPoolSize: 20
          dbtest2: # 配置第二个从库
            type: com.alibaba.druid.pool.DruidDataSource
            driverClassName: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://192.168.8.176:3306/test1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
            username: root
            password: root
            maxPoolSize: 20
        config:
          masterslave: # 配置读写分离
            name: ds_ms
            load-balance-algorithm-type: round-robin # 配置从库选择策略,提供轮询与随机,这里选择用轮询//random 随机 //round_robin 轮询
            master-data-source-name: dbtest0
            slave-data-source-names: dbtest1,dbtest2
        props:
          sql: # 开启SQL显示,默认值: false,注意:仅配置读写分离时不会打印日志!!!
            show: true

         sharding.jdbc.dataSource.names配置的是数据库的名称,就是多个数据源的名称。
         sharding.jdbc.dataSource配置多个数据源。需要配置数据库名称,和上面配置的对应。以及数据的配置,包括连接池的类型、连接器、数据库地址、
         数据库账户密码信息等。
         sharding.jdbc.config.masterslave.load-balance-algorithm-type查询时的负载均衡算法,目前有2种算法,round_robin(轮询)和random(随机)。
         sharding.jdbc.config.masterslave.master-data-source-name主数据源名称。
         sharding.jdbc.config.masterslave.slave-data-source-names从数据源名称,多个用逗号隔开。

    3、mybatis操作数据库配置

         mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <typeAliases>
            <package name="com.example.shardingjdbc.entity"/>
        </typeAliases>
        <mappers>
            <mapper resource="META-INF/mappers/User.xml"/>
        </mappers>
    </configuration>

    User.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.example.shardingjdbc.mapper.UserMapper">
        
        <resultMap id="baseResultMap" type="com.example.shardingjdbc.entity.User">
            <result column="id" property="id" jdbcType="INTEGER" />
            <result column="name" property="name" jdbcType="VARCHAR" />
            <result column="sex" property="sex" jdbcType="VARCHAR" />
        </resultMap>
        
        <insert id="addUser">
            INSERT INTO t_user (
              id, name, sex
            )
            VALUES (
            #{id,jdbcType=INTEGER},
            #{name,jdbcType=VARCHAR},
            #{sex,jdbcType=VARCHAR}
            )
        </insert>
       
        <select id="list" resultMap="baseResultMap">
            SELECT u.* FROM t_user u
        </select>
    
    </mapper>

       实体类

    package com.example.shardingjdbc.entity;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
    
        private static final long serialVersionUID = -1205226416664488559L;
        private Integer id;
        private String name;
        private String sex;
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public static long getSerialversionuid() {
            return serialVersionUID;
        }
    
    }

      mapper层

    package com.example.shardingjdbc.mapper;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Mapper;
    
    import com.example.shardingjdbc.entity.User;
    
    @Mapper
    public interface UserMapper {
    
    
        Long addUser(User user);
    
        List<User> list();
        
    }

    service层

    package com.example.shardingjdbc.service.impl;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.example.shardingjdbc.entity.User;
    import com.example.shardingjdbc.mapper.UserMapper;
    import com.example.shardingjdbc.service.UserService;
    
    @Service
    public class UserServiceImpl  implements UserService {
    
        @Autowired
        private UserMapper userMapper;
    
        @Override
        public Long addUser(User user) {
            return userMapper.addUser(user);
        }
    
        @Override
        public List<User> list() {
            return userMapper.list();
        }
    }

    controller层

    package com.example.shardingjdbc.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.example.shardingjdbc.entity.User;
    import com.example.shardingjdbc.service.UserService;
    
    @RestController
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @GetMapping("/users")
        public Object list() {
            return userService.list();
        }
    
        @GetMapping("/add")
        public Object add(@RequestParam Integer id,@RequestParam String name,@RequestParam String  sex) {
            User user = new User();
            user.setId(id);
            user.setName(name);
            user.setSex(sex);
            return userService.addUser(user);
        }
    }

    完成。用Sharding-JDBC实现了数据库的读写分离,对192.168.8.162  test1中t_user的操作,对92.168.8.134  test1,92.168.8.134  test1中t_user的查询。

    读写分离的好处就是在并发量比较大的情况下,将查询数据库的压力分担到多个从库中,能够满足高并发的要求。如下图

  • 相关阅读:
    [支付]银联支付(对jdk有要求,最好直接使用jdk7)
    [支付]支付宝支付(网银在线支付)
    Eclipse编辑窗口放大缩小的快捷键
    jQuery Validation Engine 表单验证
    Eclipse能否把选中的一段代码向前或向后缩进一个tab的位
    hql查询技巧
    Web桌面端
    大型网站技术架构
    FastDFS--分布式文件系统
    消息队列
  • 原文地址:https://www.cnblogs.com/h-z-y/p/14276352.html
Copyright © 2011-2022 走看看