zoukankan      html  css  js  c++  java
  • SpringBoot2.0整合Sharding-Jdbc

    maven:

    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.3.RELEASE</version>
            <relativePath /> <!-- lookup parent from repository -->
        </parent>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.0-beta</version>
            </dependency>
            <dependency>
                <groupId>io.shardingjdbc</groupId>
                <artifactId>sharding-jdbc-core</artifactId>
                <version>2.0.3</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
    
        </build>

    yml:

    mybatis-plus:
    #  mapper-locations: classpath*:/mapper/*.xml
      global-config:
        db-config:
          column-underline: true
    #shardingjdbc配置      
    sharding:
      jdbc:
        data-sources:
         ###配置第一个从数据库 名称随便起
          ds_slave_0:
            password: root
            jdbc-url: jdbc:mysql://192.168.91.9:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true
            driver-class-name: com.mysql.jdbc.Driver
            username: root
          ###主数据库配置   名称随便起
          ds_master:
            password: root
            jdbc-url: jdbc:mysql://192.168.91.8:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true
            driver-class-name: com.mysql.jdbc.Driver
            username: root
        ###配置读写分离    
        master-slave-rule:
        ###配置从库选择策略,提供轮询与随机,这里选择用轮询 如果从做了集群 查询时候做轮训查询
          load-balance-algorithm-type: round_robin
          ####指定从数据库 如果多个从 用逗号隔开
          slave-data-source-names: ds_slave_0
          name: ds_ms
          ####指定主数据库
          master-data-source-name: ds_master

    config配置:

    import java.sql.SQLException;
    import java.util.Map;
    
    import javax.sql.DataSource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.google.common.collect.Maps;
    
    import io.shardingjdbc.core.api.MasterSlaveDataSourceFactory;
    import lombok.extern.log4j.Log4j2;
    
    @Configuration
    @EnableConfigurationProperties(ShardingMasterSlaveConfig.class)
    @Log4j2
    // 读取ds_master主数据源和读写分离配置
    @ConditionalOnProperty({ "sharding.jdbc.data-sources.ds_master.jdbc-url",
            "sharding.jdbc.master-slave-rule.master-data-source-name" })
    public class ShardingDataSourceConfig {
    
        @Autowired
        private ShardingMasterSlaveConfig shardingMasterSlaveConfig;
    
        @Bean
        public DataSource masterSlaveDataSource() throws SQLException {
            final Map<String, DataSource> dataSourceMap = Maps.newHashMap();
            dataSourceMap.putAll(shardingMasterSlaveConfig.getDataSources());
            final Map<String, Object> newHashMap = Maps.newHashMap();
            // 创建 MasterSlave数据源
            DataSource dataSource = MasterSlaveDataSourceFactory.createDataSource(dataSourceMap,
                    shardingMasterSlaveConfig.getMasterSlaveRule(), newHashMap);
            log.info("masterSlaveDataSource config complete");
            return dataSource;
        }
    
    }
    import java.util.HashMap;
    import java.util.Map;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    import com.zaxxer.hikari.HikariDataSource;
    
    import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration;
    import lombok.Data;
    
    @Data      //表示读取本底配置文件 前缀sharding.jdbc
    @ConfigurationProperties(prefix = "sharding.jdbc")
    public class ShardingMasterSlaveConfig {
    
        // 存放本地多个数据源   最终放在map集合中   key为yml配置的 ds_slave_0
        private Map<String, HikariDataSource> dataSources = new HashMap<>();
    
        private MasterSlaveRuleConfiguration masterSlaveRule;
    }

    上面为核心代码

    下面是辅助的:

    Controller:

    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.mayikt.entity.UserEntity;
    import com.mayikt.service.UserService;
    
    @RestController
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @RequestMapping("/findUser")
        public List<UserEntity> findUser() {
            return userService.findUser();
        }
    
        @RequestMapping("/insertUser")
        public String insertUser(String userName) {
            return userService.insertUser(userName) > 0 ? "success" : "fail";
        }
    
    }

    entity:

    public class UserEntity {
    
        private String userName;
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
    }

    service:

    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.mayikt.entity.UserEntity;
    import com.mayikt.mapper.UserMapper;
    
    @Service
    public class UserService {
        @Autowired
        private UserMapper userMapper;
    
        // 使用读的数据源
        public List<UserEntity> findUser() {
            return userMapper.findUser();
        }
    
        // 使用写的数据源
        public int insertUser(String userName) {
            return userMapper.insertUser(userName);
        }
    
    }

    mapper:

    import java.util.List;
    
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    
    import com.mayikt.entity.UserEntity;
    
    public interface UserMapper {
        @Select("SELECT * FROM  user_info ")
        public List<UserEntity> findUser();
    
        @Insert("insert into user_info values (#{userName}); ")
        public int insertUser(@Param("userName") String userName);
    }

    启动类:

    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @MapperScan("com.toov5.mapper")
    public class AppMbatis {
        public static void main(String[] args) {
    
            SpringApplication.run(AppMbatis.class, args);
        }
    }
  • 相关阅读:
    linux下启动和关闭网卡命令及DHCP上网
    python 编码问题
    paddlepaddle
    Convolutional Neural Network Architectures for Matching Natural Language Sentences
    deep learning RNN
    Learning Structured Representation for Text Classification via Reinforcement Learning 学习笔记
    Python IO密集型任务、计算密集型任务,以及多线程、多进程
    EM 算法最好的解释
    tensorflow 调参过程
    tensorflow 学习纪录(持续更新)
  • 原文地址:https://www.cnblogs.com/toov5/p/10333935.html
Copyright © 2011-2022 走看看