несколько дней тому назад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`; Следовательно, приведенный выше пример сообщит об ошибке и не запустится при повторном выполнении, поскольку таблица уже существует при первом выполнении.
Рекомендации по применению
Что касается применения этих конфигураций, я полагаю, что вы достаточно сообразительны, чтобы связать их с управлением версиями базы данных (поскольку сценарий может выполняться автоматически).
Таким образом, можно ли полагаться на эти конфигурации для автоматической реализации инициализации базы данных во время развертывания бизнес-приложений?
Лично я думаю, что описанная выше конфигурация имеет определенную возможность автоматического выполнения. Однако из-за отсутствия возможности оценить текущую среду этого недостаточно для работы с реальными сценариями развертывания.
Если вы хотите автоматически управлять структурой таблицы базы данных и инициализировать данные, я предлагаю:
- Эта функция инициализации, предоставляемая по умолчанию, может использоваться только для модульного тестирования, автоматически создает структуру базы данных и инициализирует данные, а также уничтожает их после использования. Удобно контролировать среду выполнения каждого модульного теста, чтобы она была согласованной.
- Когда приложение развернуто в среде, по-прежнему необходимо использовать представленный ранее Flyway.Как использовать предыдущий общий доступ:Используйте Flyway для управления версиями базы данных.
- Используется совместно с Flyway, через
org.springframework.jdbc.datasource.init.DataSourceInitializer
для определения более сложной логики выполнения.
Больше бесплатных руководств из этой серии«Нажмите, чтобы войти в общий каталог»
пример кода
Примеры этой статьи можно найти в следующем репозиторииchapter3-13
содержание:
- Гитхаб:GitHub.com/first87112/sp…
- Гостиница:git ee.com/brother space/S…
Оригинально не просто, если вы считаете, что эта статья хороша, добро пожаловатьStar
Поддержите, ваше внимание - движущая сила моего упорства!
Приглашаю обратить внимание на мой публичный номер: Программист ДД, поделитесь галантереей и мыслями, которых не видно снаружи!