Spring Boot 2.5.0 重新設(shè)計的spring.sql.init 配置有啥用羹蚣?

前幾天Spring Boot 2.5.0發(fā)布了原探,其中提到了關(guān)于Datasource初始化機制的調(diào)整,有讀者私信想了解這方面做了什么調(diào)整顽素。那么今天就要詳細(xì)說說這個重新設(shè)計的配置內(nèi)容咽弦,并結(jié)合實際情況說說我的理解和實踐建議。

棄用內(nèi)容

先來糾正一個誤區(qū)胁出。主要之前在版本更新介紹的時候型型,存在一些表述上的問題。導(dǎo)致部分讀者認(rèn)為這次的更新是Datasource本身初始化的調(diào)整全蝶,但其實并不是闹蒜。這次重新設(shè)計的只是對Datasource腳本初始化機制的重新設(shè)計。

先來看看這次被棄用部分的內(nèi)容(位于org.springframework.boot.autoconfigure.jdbc.DataSourceProperties)抑淫,如果你有用過這些配置內(nèi)容绷落,那么新配置就很容易理解了。

    /**
     * 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;

對應(yīng)到配置文件里的屬性如下(這里僅列出部分始苇,就不全部列出了砌烁,主要就是對應(yīng)上面源碼中的屬性):

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

這些配置主要用來指定數(shù)據(jù)源初始化之后要用什么用戶、去執(zhí)行哪些腳本催式、遇到錯誤是否繼續(xù)等功能往弓。

新的設(shè)計

Spring Boot 2.5.0開始,啟用了全新的配置方式蓄氧,我們可以從這個類org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties里看到詳情函似。

下面我們通過一個簡單的例子來體驗這個功能的作用。

  • 創(chuàng)建一個Spring Boot的基礎(chǔ)應(yīng)用喉童,并在pom.xml中引入和mysql的依賴:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
  • 在配置文件中增加數(shù)據(jù)源和初始化數(shù)據(jù)源的配置撇寞,具體如下:
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
# 執(zhí)行初始化腳本的用戶名稱
spring.sql.init.username=root
# 執(zhí)行初始化腳本的用戶密碼
spring.sql.init.password=
# 初始化的schema腳本位置
spring.sql.init.schema-locations=classpath*:schema-all.sql
  • 根據(jù)上面配置的定義,接下來就在resource目錄下堂氯,創(chuàng)建腳本文件schema-all.sql蔑担,并寫入一些初始化表結(jié)構(gòu)的腳本
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 '注冊地址:縣/區(qū)',
    status      tinyint unsigned default 0  not null comment '是否標(biāo)記刪除 0:否 1:是',
    create_time datetime                    not null comment '創(chuàng)建時間',
    update_time datetime                    not null comment '更新時間'
)
comment '用戶表';
  • 完成上面步驟之后,啟動應(yīng)用咽白。然后打開MySQL客戶端啤握,可以看到在test庫下,多了一個user_info

通過上面的例子晶框,不難想到這樣的功能主要可以用來管理應(yīng)用啟動與數(shù)據(jù)庫配置的自動執(zhí)行排抬,以減少應(yīng)用部署過程中手工執(zhí)行的內(nèi)容懂从,降低應(yīng)用部署的執(zhí)行步驟。

配置詳解

除了上面用到的配置屬性之外蹲蒲,還有一些其他的配置番甩,下面詳細(xì)講解一下作用。

  • spring.sql.init.enabled:是否啟動初始化的開關(guān)届搁,默認(rèn)是true缘薛。如果不想執(zhí)行初始化腳本,設(shè)置為false即可卡睦。通過-D的命令行參數(shù)會更容易控制宴胧。
  • spring.sql.init.usernamespring.sql.init.password:配置執(zhí)行初始化腳本的用戶名與密碼。這個非常有必要表锻,因為安全管理要求恕齐,通常給業(yè)務(wù)應(yīng)用分配的用戶對一些建表刪表等命令沒有權(quán)限。這樣就可以與datasource中的用戶分開管理浩嫌。
  • spring.sql.init.schema-locations:配置與schema變更相關(guān)的sql腳本檐迟,可配置多個(默認(rèn)用;分割)
  • spring.sql.init.data-locations:用來配置與數(shù)據(jù)相關(guān)的sql腳本,可配置多個(默認(rèn)用;分割)
  • spring.sql.init.encoding:配置腳本文件的編碼
  • spring.sql.init.separator:配置多個sql文件的分隔符码耐,默認(rèn)是;
  • spring.sql.init.continue-on-error:如果執(zhí)行腳本過程中碰到錯誤是否繼續(xù)追迟,默認(rèn)是false`;所以骚腥,上面的例子第二次執(zhí)行的時候會報錯并啟動失敗敦间,因為第一次執(zhí)行的時候表已經(jīng)存在。

應(yīng)用建議

關(guān)于這些配置的應(yīng)用束铭,相信聰明的你一定會把它與數(shù)據(jù)庫的版本管理聯(lián)系起來(因為可以自動的執(zhí)行腳本)廓块。

那么依靠這些配置,是否可以勝任業(yè)務(wù)應(yīng)用部署時候數(shù)據(jù)庫初始化的自動化實現(xiàn)呢契沫?

個人認(rèn)為就上述所介紹的配置带猴,雖然具備了一定的自動執(zhí)行能力。但由于缺失對當(dāng)前環(huán)境的判斷能力懈万,所以要應(yīng)對實際的部署場景來說拴清,還是遠(yuǎn)遠(yuǎn)不夠的。

如果要自動化的管理數(shù)據(jù)庫表結(jié)構(gòu)会通、初始化數(shù)據(jù)的話口予,我的建議是:

  1. 默認(rèn)提供的這個初始化功能可以且僅用于單元測試,自動創(chuàng)建數(shù)據(jù)庫結(jié)構(gòu)與初始化數(shù)據(jù)涕侈,使用完畢后銷毀沪停。可以方便的控制每次單元測試的執(zhí)行環(huán)境一致。
  2. 應(yīng)用在環(huán)境部署的時候木张,還是要使用之前介紹過的Flyway來實現(xiàn)众辨,如何使用可見之前的分享:使用Flyway來管理數(shù)據(jù)庫版本
  3. 聯(lián)合Flyway一同使用窟哺,通過org.springframework.jdbc.datasource.init.DataSourceInitializer來定義更復(fù)雜的執(zhí)行邏輯泻轰。

更多本系列免費教程連載「點擊進(jìn)入?yún)R總目錄」

代碼示例

本文的相關(guān)例子可以查看下面?zhèn)}庫中的chapter3-13目錄:

原創(chuàng)不易技肩,如果您覺得本文不錯且轨,歡迎Star支持,您的關(guān)注是我堅持的動力虚婿!

歡迎關(guān)注我的公眾號:程序猿DD旋奢,分享外面看不到的干貨!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末然痊,一起剝皮案震驚了整個濱河市至朗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剧浸,老刑警劉巖锹引,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異唆香,居然都是意外死亡嫌变,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門躬它,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腾啥,“玉大人,你說我怎么就攤上這事冯吓√却” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵组贺,是天一觀的道長凸舵。 經(jīng)常有香客問我,道長失尖,這世上最難降的妖魔是什么啊奄? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮雹仿,結(jié)果婚禮上增热,老公的妹妹穿的比我還像新娘。我一直安慰自己胧辽,他們只是感情好峻仇,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邑商,像睡著了一般摄咆。 火紅的嫁衣襯著肌膚如雪凡蚜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天吭从,我揣著相機與錄音朝蜘,去河邊找鬼。 笑死涩金,一個胖子當(dāng)著我的面吹牛谱醇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播步做,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼副渴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了全度?” 一聲冷哼從身側(cè)響起煮剧,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎将鸵,沒想到半個月后勉盅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡顶掉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年草娜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片一喘。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡驱还,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凸克,到底是詐尸還是另有隱情议蟆,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布萎战,位于F島的核電站咐容,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚂维。R本人自食惡果不足惜戳粒,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虫啥。 院中可真熱鬧蔚约,春花似錦、人聲如沸涂籽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至树枫,卻和暖如春直焙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砂轻。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工奔誓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搔涝。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓厨喂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親体谒。 傳聞我的和親對象是個殘疾皇子杯聚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容