[Бой SpringBoot] Быстрая настройка нескольких источников данных (интеграция MyBatis)

Spring Boot

QQ截图20191004101934.jpg

предисловие

Из-за бизнес-требований два набора источников данных (соединяющих две базы данных) должны быть настроены в SpringBoot одновременно, и требуется, чтобы сервисный уровень мог автоматически переключать источник данных при вызове преобразователя каждой таблицы базы данных, что то есть картограф автоматически обращается к правильной базе данных.

Содержание этой статьи:

  • На основе проекта Springboot+Mybatis изучите быструю настройку нескольких источников данных.
  • Избегайте ям некоторых статей по настройке источников данных в Интернете.

Обзор практического руководства по SpringBoot:

[Springboot] SpringCache + Redis реализует кеширование данных

[Springboot] Отправка писем и сброс паролей

[Springboot] Интеграция ElasticSearch для реализации нечеткого поиска данных (Logstash синхронизирует данные Mysql)

текст

Конфигурация с несколькими источниками данных (интеграция MyBatis)

Версия SpringBoot: 2.0.6.RELEASE

Схема структуры проекта (простите меня за защиту кода конфиденциальности):

image.png

Исключить класс автоматической конфигурации SpringBoot DataSourceAutoConfiguration.

Во-первых, исключите этот класс из @SpringBootApplication, поскольку он будет читать свойства spring.datasource.* файла application.properties и автоматически настраивать единственный источник данных.

@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class
})

Настройте информацию о подключении к нескольким источникам данных в application.properties.

Сколько источников базы данных вам нужно подключить, просто настройте несколько, имена могут быть свободно названы вместо db1, db2

# database
db.conn.str = useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useLocalSessionState=true&tinyInt1isBit=false

spring.datasource.db1.jdbc-url=jdbc:mysql://xxxx1:xxxx/xxxxx1?${db.conn.str}
spring.datasource.db1.username=xxxxx
spring.datasource.db1.password=xxxxx
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.db2.jdbc-url=jdbc:mysql://xxxxx2:xxxx/xxxxx2?${db.conn.str}
spring.datasource.db2.username=xxxxx
spring.datasource.db2.password=xxxxx
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver

Примечание. Обязательно измените spring.datasource.db1.url на spring.datasource.db1.jdbc-url.

Объяснение из официальной документации: поскольку фактический тип пула соединений не раскрывается, ключ не создается в метаданных вашего пользовательского источника данных и не выполняется в среде IDE (поскольку интерфейс DataSource не предоставляет свойства ). Кроме того, если у вас есть Hikari в пути к классам, эта базовая настройка не будет работать, поскольку у Hikari нет свойства url (но есть свойство jdbcUrl). В этом случае вы должны переписать свою конфигурацию следующим образом:

Вручную создавать классы конфигурации базы данных

Поскольку мы отключили автоматическую настройку источников данных, нам нужно вручную создать эти источники данных на следующем шаге и создать класс DataSourceConfig.

@Configuration
public class DataSourceConfig {

    @Bean(name = "db1")
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource businessDbDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "db2")
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource newhomeDbDataSource() {
        return DataSourceBuilder.create().build();
    }
}

Настройте SqlSessionFactory mybatis для разных источников данных соответственно.

Это позволяет нашим картографам под разными именами пакетов автоматически использовать разные источники данных.

Создайте Db1Config:

/**
 * @author yangzhendong01
 */
@Configuration
@MapperScan(basePackages = {"com.xxxxx.webApi.mapper.db1"}, sqlSessionFactoryRef = "sqlSessionFactoryDb1")
public class Db1Config {

    @Autowired
    @Qualifier("db1")
    private DataSource dataSourceDb1;


    @Bean
    public SqlSessionFactory sqlSessionFactoryDb1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSourceDb1);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/*.xml"));
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateDb1() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryDb1());
    }

}

Создайте Db2Config:

/**
 * @author yangzhendong01
 */
@Configuration
@MapperScan(basePackages = {"com.xxxxx.webApi.mapper.db2"}, sqlSessionFactoryRef = "sqlSessionFactoryDb2")
public class Db2Config {

    @Autowired
    @Qualifier("db2")
    private DataSource dataSourceDb2;


    @Bean
    public SqlSessionFactory sqlSessionFactoryDb2() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSourceDb2);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/*.xml"));
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateDb2() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryDb2());
    }

}

Примечание. На этом шаге необходимо добавить путь сканирования файла mapper.xml, в противном случае будет сообщено об ошибке Неверный связанный оператор (не найден)

factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/xxxxxx/*.xml"));

После выполнения этих конфигураций допустим у нас есть 2 маппера mapper.db1.xxxMapper и mapper.db2.xxxMapper, когда мы используем первый в любом месте программы, будет автоматически подключаться библиотека db1, а последний будет подключаться к библиотеке db2 .

использованная литература

Основная ссылка:

blog.CSDN.net/нео Смит/AR…

Другие ссылки:

блог Brother space.com/spring boot…

Суммировать

Эта статья основана на проекте Springboot+Mybatis, посвященном быстрой настройке нескольких источников данных.

Поздравляю всех с праздником Дня Республики!

Подписывайтесь на меня

В настоящее время я backend-разработчик. Основное внимание уделяется back-end разработке, безопасности данных, граничным вычислениям и другим направлениям.

WeChat: yangzd1102 (укажите цель)

Гитхаб:@qqxx6661

личный блог:

Оригинальное основное содержание блога

  • Полное руководство по обзору знаний Java
  • Анализ вопросов алгоритма Leetcode
  • Меч относится к анализу проблемы алгоритма предложения.
  • Боевая серия для новичков SpringCloud
  • Боевая серия для новичков SpringBoot
  • Технические статьи о краулерах
  • Технические статьи, связанные с бэкенд-разработкой

Личный публичный аккаунт: разговор о технологиях back-end

公众号201992.jpg

Если статья оказалась для вас полезной, вы можете забрать ее и отправить своим друзьям~