Разделение чтения и записи базы данных на основе ShardingJDBC

Spring Cloud

1. Введите зависимости

проектpom.xmlВ файле представлены зависимости sharding-jdbc:

<dependency>
  	<groupId>org.apache.shardingsphere</groupId>
  	<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  	<version>4.0.0-RC1</version>
</dependency>

2. Увеличьте конфигурацию разделения чтения-записи

проектbootstrap.ymlДобавьте конфигурацию разделения чтения-записи, следующая конфигурация среды разработки:

spring:
  shardingsphere:
    datasource:
      names: master, slave
      master:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/testdb
        username: ''
        password: ''
      slave:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/testdb1
        username: ''
        password: ''
    masterslave:
      name: ms
      master-data-source-name: master
      slave-data-source-names: slave

3. Демонстрационный эффект

3.1 Создайте новую тестовую таблицу

Синхронизация master-slave фактически отключена в среде разработки, и эффект демонстрируется путем ручного изменения данных подчиненной библиотеки.

CREATE TABLE `t1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT 'testname',
  `age` int(10) unsigned NOT NULL DEFAULT '30',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 主库插入的数据
INSERT INTO `testdb`.`t1`(`id`, `name`, `age`) VALUES (1, 'wangao', 10);

-- 从库插入的数据
INSERT INTO `testdb1`.`t1`(`id`, `name`, `age`) VALUES (1, 'wangao', 20);

3.2, напишите интерфейс доступа к базе данных

@Entity
@Table(name = "t1")
@Data
public class User {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    
    @Column(name = "name")
    private String name;
    
    @Column(name = "age")
    private Integer age;
    
}
public interface UserDao extends JpaRepository<User, Integer> {
    
}

3.3, сохранить данные

@Test
public void base() {
  	User user = new User();
  	user.setName("wangao");
  	user.setAge(10);
  	user = userDao.save(user);
  	System.out.println(user);
}

Метод сохранения обычно может возвращать объект с автоматически увеличивающимся идентификатором:

В основную библиотеку добавлены новые данные:

В библиотеке слейв данных нет (синхронизация master-slave закрыта):

3.4, чтение данных

Прочитайте данные с id 1, обратите внимание, что они получены из библиотеки в это время, а возраст 20

@Test
public void readSlave() {
 		User user = userDao.findById(1).get();
  	System.out.println(user);
}

3.5 Принудительное чтение из основной библиотеки

В некоторых случаях необходимо принудительно читать из основной библиотеки. По-прежнему читаем данные с id 1, обратите внимание, что они получены из основной библиотеки в это время, а возраст равен 10:

@Test
public void readMaster() {
  	HintManager manager = HintManager.getInstance();
  	manager.setMasterRouteOnly();
  	User user = userDao.findById(1).get();
  	System.out.println(user);
  	//一定记得最后close
  	manager.close();
}

3.6, особое внимание

В официальном документе есть этот абзац о разделении чтения и записи:

Здесь следует отметить, что конфигурация по умолчаниюspring.jpa.open-in-view=true, в это время подключение Restful запроса к БД такое же, если есть операция записи, то последующие операции чтения читаются из основной БД

@RestController
public class UserController {
    
    private final UserDao userDao;
    
    public UserController(UserDao userDao) {
        this.userDao = userDao;
    }
    
    @GetMapping("api/user/{id}")
    public User get(@PathVariable int id) {
      	//进行写入操作
        User user = new User();
        user.setName("奥利奥");
        user.setAge(30);
        user = userDao.save(user);
        System.out.println(user);
        //进行读取操作
        return userDao.findById(id).orElse(null);
    }
}

Если вы измените конфигурацию наspring.jpa.open-in-view=false, в это время соединение каждой операционной базы данных будет получено из пула соединений, поэтому операция чтения будет считана из подчиненной библиотеки:

4. Ссылка

Для получения более подробной информации, пожалуйста, обратитесь к официальному веб-сайту sharding-jdbc за информацией:

Убейте верхнюю сферу.Apache.org/document/…