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 за информацией: