Какая польза от переработанной конфигурации spring.sql.init в Spring Boot 2.5.0?

Java

несколько дней тому назадSpring Boot 2.5.0Он был выпущен, в котором упоминалась настройка механизма инициализации Datasource, Некоторые читатели в частном порядке писали, чтобы узнать, какие корректировки были сделаны в этом отношении. Итак, сегодня я подробно расскажу о переработанном содержании конфигурации, а также расскажу о своем понимании и практических предложениях в сочетании с реальной ситуацией.

Устаревший контент

Давайте сначала исправим недоразумение. В основном, когда было представлено обновление версии, были некоторые проблемы с презентацией. Некоторые читатели думают, что это обновление является корректировкой инициализации самого источника данных, но это не так. Этот редизайн — это просто редизайн механизма инициализации сценария источника данных.

Давайте сначала взглянем на содержимое этой устаревшей части (расположенной по адресуorg.springframework.boot.autoconfigure.jdbc.DataSourceProperties), если вы использовали это содержимое конфигурации, новую конфигурацию легко понять.

	/**
	 * Mode to apply when determining if DataSource initialization should be performed
	 * using the available DDL and DML scripts.
	 */
	@Deprecated
	private DataSourceInitializationMode initializationMode = DataSourceInitializationMode.EMBEDDED;

	/**
	 * Platform to use in the DDL or DML scripts (such as schema-${platform}.sql or
	 * data-${platform}.sql).
	 */
	@Deprecated
	private String platform = "all";

	/**
	 * Schema (DDL) script resource references.
	 */
	private List<String> schema;

	/**
	 * Username of the database to execute DDL scripts (if different).
	 */
	@Deprecated
	private String schemaUsername;

	/**
	 * Password of the database to execute DDL scripts (if different).
	 */
	@Deprecated
	private String schemaPassword;

	/**
	 * Data (DML) script resource references.
	 */
	@Deprecated
	private List<String> data;

	/**
	 * Username of the database to execute DML scripts (if different).
	 */
	@Deprecated
	private String dataUsername;

	/**
	 * Password of the database to execute DML scripts (if different).
	 */
	@Deprecated
	private String dataPassword;

	/**
	 * Whether to stop if an error occurs while initializing the database.
	 */
	@Deprecated
	private boolean continueOnError = false;

	/**
	 * Statement separator in SQL initialization scripts.
	 */
	@Deprecated
	private String separator = ";";

	/**
	 * SQL scripts encoding.
	 */
	@Deprecated
	private Charset sqlScriptEncoding;

Свойства, соответствующие конфигурационному файлу, следующие (здесь перечислены лишь некоторые, не все, в основном соответствующие свойствам в приведенном выше исходном коде):

spring.datasource.schema=
spring.datasource.schema-username=
spring.datasource.schema-password=
...

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

новый дизайн

Начиная с Spring Boot 2.5.0, был включен новый метод настройки, мы можем начать с этого классаorg.springframework.boot.autoconfigure.sql.init.SqlInitializationPropertiesподробности см. здесь.

Ниже мы используем простой пример, чтобы испытать роль этой функции.

  • Создайте базовое приложение Spring Boot и добавьте зависимости с mysql в pom.xml:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
  • Добавьте конфигурацию источника данных и источника данных инициализации в файл конфигурации следующим образом:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Spring Boot 2.5.0 init schema & data
# 执行初始化脚本的用户名称
spring.sql.init.username=root
# 执行初始化脚本的用户密码
spring.sql.init.password=
# 初始化的schema脚本位置
spring.sql.init.schema-locations=classpath*:schema-all.sql
  • Согласно определению приведенной выше конфигурации, следующим шагом являетсяresourceкаталог, создайте файл сценарияschema-all.sql, и напишите несколько скриптов, которые инициализируют структуру таблицы
create table test.user_info
(
    id          int unsigned auto_increment comment '用户id'
        primary key,
    open_id     varchar(255)     default '' null comment '微信小程序openid',
    nick_name   varchar(255)     default '' null comment '微信名',
    head_img    varchar(255)     default '' null comment '微信头像',
    sex         varchar(255)     default '' null comment '性别',
    phone       varchar(255)     default '' null comment '手机',
    province    varchar(255)     default '' null comment '注册地址:省',
    city        varchar(255)     default '' null comment '注册地址:城市',
    country     varchar(255)     default '' null comment '注册地址:县/区',
    status      tinyint unsigned default 0  not null comment '是否标记删除 0:否 1:是',
    create_time datetime                    not null comment '创建时间',
    update_time datetime                    not null comment '更新时间'
)
comment '用户表';
  • После выполнения вышеуказанных действий запустите приложение. Затем откройте клиент MySQL, вы можете увидеть вtestПод библиотекой есть еще одинuser_infoповерхность

В приведенном выше примере нетрудно подумать, что такую ​​функцию можно в основном использовать для управления автоматическим выполнением запуска приложения и настройки базы данных, чтобы уменьшить объем ручного выполнения в процессе развертывания приложения и сократить шаги выполнения. развертывания приложений.

Подробная конфигурация

В дополнение к свойствам конфигурации, использованным выше, существуют некоторые другие конфигурации, которые будут подробно описаны ниже.

  • spring.sql.init.enabled: Запускать ли переключатель инициализации, по умолчанию true. Если вы не хотите выполнять сценарий инициализации, установите для него значение false. Легче управлять с помощью аргумента командной строки -D.
  • spring.sql.init.usernameа такжеspring.sql.init.password: Настройте имя пользователя и пароль для выполнения сценария инициализации. Это очень необходимо.Из-за требований управления безопасностью пользователи, которым обычно назначают бизнес-приложения, не имеют разрешения на создание и удаление таблиц и других команд. Этим можно управлять отдельно от пользователей в источнике данных.
  • spring.sql.init.schema-locations: Настройка сценариев sql, связанных с изменениями схемы, можно настроить несколько (по умолчанию;сегментация)
  • spring.sql.init.data-locations: используется для настройки сценариев sql, связанных с данными, можно настроить несколько (по умолчанию;сегментация)
  • spring.sql.init.encoding: Кодировка файла скрипта конфигурации
  • spring.sql.init.separator: настроить разделитель для нескольких файлов sql, по умолчанию;
  • spring.sql.init.continue-on-error:如果执行脚本过程中碰到错误是否继续,默认是false`; Следовательно, приведенный выше пример сообщит об ошибке и не запустится при повторном выполнении, поскольку таблица уже существует при первом выполнении.

Рекомендации по применению

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

Таким образом, можно ли полагаться на эти конфигурации для автоматической реализации инициализации базы данных во время развертывания бизнес-приложений?

Лично я думаю, что описанная выше конфигурация имеет определенную возможность автоматического выполнения. Однако из-за отсутствия возможности оценить текущую среду этого недостаточно для работы с реальными сценариями развертывания.

Если вы хотите автоматически управлять структурой таблицы базы данных и инициализировать данные, я предлагаю:

  1. Эта функция инициализации, предоставляемая по умолчанию, может использоваться только для модульного тестирования, автоматически создает структуру базы данных и инициализирует данные, а также уничтожает их после использования. Удобно контролировать среду выполнения каждого модульного теста, чтобы она была согласованной.
  2. Когда приложение развернуто в среде, по-прежнему необходимо использовать представленный ранее Flyway.Как использовать предыдущий общий доступ:Используйте Flyway для управления версиями базы данных.
  3. Используется совместно с Flyway, черезorg.springframework.jdbc.datasource.init.DataSourceInitializerдля определения более сложной логики выполнения.

Больше бесплатных руководств из этой серии«Нажмите, чтобы войти в общий каталог»

пример кода

Примеры этой статьи можно найти в следующем репозиторииchapter3-13содержание:

Оригинально не просто, если вы считаете, что эта статья хороша, добро пожаловатьStarПоддержите, ваше внимание - движущая сила моего упорства!

Приглашаю обратить внимание на мой публичный номер: Программист ДД, поделитесь галантереей и мыслями, которых не видно снаружи!