Предисловие:
По мере увеличения числа пользователей приложения количество соответствующих одновременных запросов также будет продолжать расти.Постепенно одна база данных больше не может удовлетворять наши частые запросы на операции с базой данных.В некоторых сценариях нам может потребоваться настроить дополнительный источник данных, используя несколько источников данных (например, реализация разделения базы данных на чтение и запись) для снижения нагрузки на систему и т. д. Точно так же Springboot официально предоставляет соответствующие реализации, чтобы помочь разработчикам настроить несколько источников данных, обычно разделенных на два типа. пока знаю), субподряд и АОП, в которых АОП используется для реализации динамического переключения нескольких источников данных, будут написаны в другой статье. Учитывая, что mybatis — это платформа баз данных, часто используемая разработчиками Java, в этой статье для настройки нескольких источников данных используется Springboot+Mybatis.
Без лишних слов, поехали.
1. Подготовка базы данных:
Поскольку мы настраиваем несколько источников данных, мы должны сначала подготовить соответствующие источники данных.Здесь я создал две новые базы данных локально, как показано в следующей таблице:
база данных | testdatasource1 | testdatasource2 |
---|---|---|
техническая спецификация | sys_user | sys_user2 |
поле | user_id (int), user_name (varchar) user_age (int) | такой же |
И вставьте соответственно две записи, для удобства сравнения testdatasource1 — это Чжан Сан, которому 25 лет на фанняне, а testdatasource2 — это Ли Си, которому 30 лет на фанняне.
2. Подготовка окружающей среды
Сначала создайте новый проект Springboot, моя версия здесь 2.1.7.RELEASE, и введите соответствующие зависимости в файл pom: основные зависимости следующие:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
На данный момент наша среда в основном настроена.
3. Раздел кода
1. Конфигурация нескольких источников данных
Прежде всего, настройте наш источник данных в нашем файле конфигурации Springboot. В отличие от предыдущего, поскольку у нас есть два источника данных, нам нужно указать имя соответствующей базы данных. Первичный источник данных является первичным, а вторичный источник данных — вторичным. следующим образом :
#配置主数据库
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/testdatasource1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
##配置次数据库
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/testdatasource2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
На что нам нужно обратить внимание, так это на то, что Springboot 2.0 должен использовать jdbc-url при настройке подключения к базе данных.Если используется только URL, он сообщит
jdbcUrl требуется с driverClassName Ошибка.
Создайте новый класс конфигурации PrimaryDataSourceConfig для настройки наших основных компонентов, связанных с базой данных.Код выглядит следующим образом:
@Configuration
@MapperScan(basePackages = "com.jdkcb.mybatisstuday.mapper.one", sqlSessionFactoryRef = "PrimarySqlSessionFactory")//basePackages:接口文件的包路径
public class PrimaryDataSourceConfig {
@Bean(name = "PrimaryDataSource")
// 表示这个数据源是默认数据源
@Primary//这个一定要加,如果两个数据源都没有@Primary会报错
@ConfigurationProperties(prefix = "spring.datasource.primary")//我们配置文件中的前缀
public DataSource getPrimaryDateSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "PrimarySqlSessionFactory")
@Primary
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("PrimaryDataSource") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/one/*.xml"));
return bean.getObject();// 设置mybatis的xml所在位置
}
@Bean("PrimarySqlSessionTemplate")
// 表示这个数据源是默认数据源
@Primary
public SqlSessionTemplate primarySqlSessionTemplate(
@Qualifier("PrimarySqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
}
Примечания:
@MapperScan: Где настроить класс интерфейса mybatis
@Primary: указывает, что используется база данных по умолчанию, ее следует добавить, иначе будет сообщено об ошибке, поскольку не известно, какая база данных является базой данных по умолчанию.
@ConfigurationProperties: чтение сопоставления параметра конфигурации в application.properties в объект, где префикс представляет собой префикс параметра.
Вы закончили~~ Вы закончили? Нет, тогда настройте класс конфигурации нашего второго источника данных, код выглядит следующим образом:
@Configuration
@MapperScan(basePackages = "com.jdkcb.mybatisstuday.mapper.two", sqlSessionFactoryRef = "SecondarySqlSessionFactory")
public class SecondaryDataSourceConfig {
@Bean(name = "SecondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource getSecondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "SecondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("SecondaryDataSource") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/two/*.xml"));
return bean.getObject();// 设置mybatis的xml所在位置
}
@Bean("SecondarySqlSessionTemplate")
public SqlSessionTemplate secondarySqlSessionTemplate(
@Qualifier("SecondarySqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
Осталось написать наш соответствующий xml-файл и класс интерфейса, код выглядит следующим образом:
@Component
@Mapper
public interface PrimaryUserMapper {
List<User> findAll();
}
@Component
@Mapper
public interface SecondaryUserMapper {
List<User> findAll();
}
Соответствующие 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.jdkcb.mybatisstuday.mapper.one.PrimaryUserMapper">
<select id="findAll" resultType="com.jdkcb.mybatisstuday.pojo.User">
select * from sys_user;
</select>
</mapper>
<?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.jdkcb.mybatisstuday.mapper.two.SecondaryUserMapper">
<select id="findAll" resultType="com.jdkcb.mybatisstuday.pojo.User">
select * from sys_user2;
</select>
</mapper>
Примечание. Каталог файла xml в этом примере: resources/mapping
2. Тест
Напишите контроллер для тестирования, потому что это тестовый экземпляр, а код относительно прост, поэтому уровень службы здесь не написан.
код показывает, как показано ниже:
@RestController
public class UserController {
@Autowired
private PrimaryUserMapper primaryUserMapper;
@Autowired
private SecondaryUserMapper secondaryUserMapper;
@RequestMapping("primary")
public Object primary(){
List<User> list = primaryUserMapper.findAll();
return list;
}
@RequestMapping("secondary")
public Object secondary (){
List<User> list = secondaryUserMapper.findAll();
return list;
}
}
Введите в браузере:http://127.0.0.1:8080/primaryиhttp://127.0.0.1:8080/secondary
Результат выглядит следующим образом:
[{"user_id":1,"user_name":"张三","user_age":25}] //primary
[{"user_id":1,"user_name":"李四","user_age":30}] //secondary
На этом Springboot в сочетании с mybatis для настройки нескольких источников данных завершен.
В конце концов, всем привет, я Хань Шу, гудите, следуйте за мной и ешьте привет фрукты (акимбо).
Не забудьте поставить лайк перед уходом~
Подождите минутку:
Соответствующий исходный код можно загрузить на мой github (добро пожаловать звездочка):