9.10。数据库初始化

可以使用不同的方式初始化SQL数据库,具体取决于堆栈是什么。当然,如果数据库是一个单独的进程,您也可以手动执行。建议使用单一机制进行模式生成。

9.10.1。使用JPA初始化数据库

JPA具有用于DDL生成的功能,可以将其设置为在启动时针对数据库运行。这是通过两个外部属性控制的:

  • spring.jpa.generate-ddl (布尔值)打开和关闭该功能,并且与供应商无关。
  • spring.jpa.hibernate.ddl-auto(枚举)是一种Hibernate功能,可以更精细地控制行为。

9.10.2。使用Hibernate初始化数据库

您可以设置spring.jpa.hibernate.ddl-auto为明确和标准的Hibernate属性值:nonevalidateupdatecreate,和create-drop。Spring Boot根据您的数据库是嵌入式的为您选择默认值。如果未检测到任何模式管理器或在none所有其他情况下默认为create-drop。通过查看Connection类型可以检测到嵌入式数据库。 hsqldb,h2和derby是嵌入式的,而其他不是。从内存数据库转换为“真实”数据库时,请不要对新平台中表和数据的存在做出假设。您必须显式设置ddl-auto或使用其他机制之一来初始化数据库。

您可以通过启用org.hibernate.SQL记录器来输出模式创建。如果启用调试模式,此操作将自动为您完成。

另外,如果Hibernate从头开始创建模式(即,如果ddl-auto属性设置为createcreate-drop),则在启动时将执行在类路径的根目录中命名import.sql的文件。如果您小心的话,这对于演示和测试很有用,但可能不希望出现在生产环境的类路径中。这是一个Hibernate功能(与Spring无关)。

9.10.3。初始化数据库

Spring Boot可以自动创建您的DataSource的模式(DDL脚本)并对其进行初始化(DML脚本)。它分别从标准根类路径位置下的schema.sqldata.sql加载SQL。另外,Spring Boot处理schema-${platform}.sqldata-${platform}.sql文件(如果存在),其中platform的值为spring.datasource.platform。这使您可以在必要时切换到特定于数据库的脚本。例如,您可以选择将其设置为数据库中的供应商名称(hsqldb,h2,oracle,mysql,postgresql等)。

Spring Boot自动创建一个嵌入式模式DataSource。可以使用spring.datasource.initialization-mode属性来自定义此行为。例如,如果您希望始终初始化,则DataSource无论其类型如何:

spring.datasource.initialization-mode =always

默认情况下,Spring Boot启用Spring JDBC初始化程序的快速失败功能。这意味着,如果脚本导致异常,则应用程序将无法启动。您可以通过设置spring.datasource.continue-on-error来调整该行为。

在基于JPA的应用程序中,您可以选择让Hibernate创建模式或使用schema.sql,但您不能两者都做。如果使用schema.sql,请确保禁用spring.jpa.hibernate.ddl-auto

9.10.4。初始化一个Spring Batch数据库

如果您使用Spring Batch,则它随大多数流行的数据库平台一起预包装了SQL初始化脚本。Spring Boot可以检测您的数据库类型并在启动时执行这些脚本。如果您使用嵌入式数据库,则默认情况下会发生这种情况。您还可以为任何数据库类型启用它,如以下示例所示:

spring.batch.initialize-schema =always

您还可以通过设置spring.batch.initialize-schema=never明确关闭初始化。

9.10.5。使用高级数据库迁移工具

Spring Boot支持两种更高级别的迁移工具:FlywayLiquibase

在启动时执行Flyway数据库迁移

要在启动时自动运行Flyway数据库迁移,请将org.flywaydb:flyway-core添加到您的类路径中。

通常,迁移是采用以下形式的脚本V<VERSION>__<NAME>.sql(带有<VERSION>下划线分隔的版本,例如“1”或“ 2_1”)。默认情况下,它们位于名为classpath:db/migration的文件夹中,但是您可以通过设置spring.flyway.locations修改该位置。这是一个或多个classpath:filesystem:位置的逗号分隔列表。例如,以下配置将在默认类路径位置和/opt/migration目录中搜索脚本:

spring.flyway.locations=classpath:db/migration,filesystem:/opt/migration

您还可以添加特殊的{vendor}占位符以使用特定于供应商的脚本。假设以下内容:

spring.flyway.locations=classpath:db/migration/{vendor}

前面的配置不是使用db/migration,而是根据数据库的类型(例如,db/migration/mysql对于MySQL)来设置要使用的文件夹。支持的数据库列表在DatabaseDriver中提供。

迁移也可以用Java编写。Flyway将使用任何实现JavaMigration的bean自动配置。

FlywayProperties提供Flyway的大多数设置以及少量的其他属性,这些属性可用于禁用迁移或关闭位置检查。如果需要对配置进行更多控制,考虑注册FlywayConfigurationCustomizer Bean。

Spring Boot调用Flyway.migrate()以执行数据库迁移。如果您想要更多控制,请提供实现FlywayMigrationStrategy的@Bean。

Flyway支持SQL和Java 回调。要使用基于SQL的回调,请将回调脚本放在classpath:db/migration文件夹中。要使用基于Java的回调,请创建一个或多个实现Callback的bean。任何此类bean都会自动向Flyway进行注册。可以通过使用@Order或实现Ordered来调整顺序。也可以检测到实现了不推荐使用的FlywayCallback接口的Bean ,但是不能与Callback Bean 一起使用。

默认情况下,Flyway自动在您的上下文中自动连接(@Primary)DataSource并将其用于迁移。如果您想使用其他DataSource,则可以创建一个并将其标记为@FlywayDataSource的@Bean。如果这样做并想要两个数据源,请记住创建另一个数据源并将其标记为@Primary。另外,您可以通过设置spring.flyway.[url,user,password]外部属性来使用Flyway的本机DataSource。设置spring.flyway.urlspring.flyway.user足以使Flyway使用自己的DataSource。如果未设置这三个属性中的任何一个,则将使用其等效属性spring.datasource的值。

您还可以使用Flyway为特定情况提供数据。例如,您可以在src/test/resources中放入特定于测试的迁移,并且仅在您的应用程序开始进行测试时才运行它们。另外,您可以使用特定于profile的配置进行自定义spring.flyway.locations,以便仅在特定配置文件处于活动状态时才运行某些迁移。例如,在application-dev.properties中,您可以指定以下设置:

spring.flyway.locations=classpath:/db/migration,classpath:/dev/db/migration

使用该设置,dev/db/migration的迁移仅在dev profile处于活动状态时才运行。

在启动时执行Liquibase数据库迁移

要在启动时自动运行Liquibase数据库迁移,请将org.liquibase:liquibase-core添加到您的类路径中。

默认情况下,从db/changelog/db.changelog-master.yaml中读取主更改日志,但是您可以通过设置spring.liquibase.change-log来更改位置。除了YAML,Liquibase还支持JSON,XML和SQL更改日志格式。

默认情况下,Liquibase 在您的上下文中自动装配(@Primary)DataSource并将其用于迁移。如果需要使用其他DataSource,则可以创建一个并将其标记为@LiquibaseDataSource的@Bean。如果这样做,并且想要两个数据源,请记住创建另一个数据源并将其标记为@Primary。另外,您可以通过设置spring.liquibase.[url,user,password]外部属性来使用Liquibase的本机DataSource。设置spring.liquibase.urlspring.liquibase.user足以使Liquibase使用其自己的DataSource。如果未设置这三个属性中的任何一个,则将使用其等效属性spring.datasource的值。

请参阅LiquibaseProperties以获取有关可用设置的详细信息,例如上下文,默认架构和其他。

20191128 Spring Boot官方文档学习(9.10)的更多相关文章

  1. 20191128 Spring Boot官方文档学习(10)

    10.附录 附录A:通用应用程序属性 附录B:配置元数据 附录C:自动配置类 附录D:测试的自动配置注释 附录E:可执行的Jar格式 附录F:依赖版本

  2. 20191128 Spring Boot官方文档学习(9.4-9.8)

    9.4.Spring MVC Spring Boot有许多启动器包含Spring MVC.请注意,一些启动器包括对Spring MVC的依赖,而不是直接包含它. 9.4.1.编写JSON REST服务 ...

  3. 20191128 Spring Boot官方文档学习【目录】

    Spring Boot文档 入门 使用Spring Boot 3.1. 构建系统 3.2. 结构化代码 3.3. 配置类 3.4. 自动配置 3.5. Spring beans和依赖注入 3.6. 使 ...

  4. 20191128 Spring Boot官方文档学习(9.11-9.17)

    9.11.消息传递 Spring Boot提供了许多包含消息传递的启动器.本部分回答了将消息与Spring Boot一起使用所引起的问题. 9.11.1.禁用事务JMS会话 如果您的JMS代理不支持事 ...

  5. 20191128 Spring Boot官方文档学习(9.9)

    9.9.数据存取 Spring Boot包含许多用于处理数据源的启动器. 9.9.1.配置自定义数据源 要配置自己的DataSource,请在配置中定义该类型的@Bean.Spring Boot可以在 ...

  6. Spring Boot 官方文档学习(一)入门及使用

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  7. Spring boot官方文档学习(一)

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  8. 20191106 Spring Boot官方文档学习(1-2)

    学习内容相关信息 最新版本:2.2.0 CURRENT GA 官网地址 官方文档地址 单页版文档地址 代码生成网址 2.入门 Spring Boot的主要目标是: 为所有Spring开发提供更快且入门 ...

  9. 20191127 Spring Boot官方文档学习(9.1-9.3)

    9."使用方法"指南 9.1.Spring Boot应用程序 9.1.1.创建自己的FailureAnalyzer FailureAnalyzer被包装在FailureAnalys ...

随机推荐

  1. Java并发编程实战 第10章 避免活跃性危险

    死锁 经典的死锁:哲学家进餐问题.5个哲学家 5个筷子 如果没有哲学家都占了一个筷子 互相等待筷子 陷入死锁 数据库设计系统中一般有死锁检测,通过在表示等待关系的有向图中搜索循环来实现. JVM没有死 ...

  2. java 集合之HashMap、Hashtable、LinkedHashMap、TreeMap

    HashMap 实现了Map接口,线程不安全. 实现原理: HashMap由数组+链表组成,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的. 如果通过hash定位到数组位置没有链表, ...

  3. cve-2019-1609,Harbor任意管理员注册漏洞复现

    一.Harbor介绍 以Docker为代表的容器技术的出现,改变了传统的交付方式.通过把业务及其依赖的环境打包进Docker镜像,解决了开发环境和生产环境的差异问题,提升了业务交付的效率.如何高效地管 ...

  4. vs2017 mvc 启动时经常出现调用的目标发生异常

    1.vs  2017 调试web 程序时老是出现调用的目标发生异常 本人眼拙,基本上看了网站说的一些方法,设置环境变量是无效的,只有一个办法,卸载重装. 1.0 卸载过程 打开计算机-卸载或更改软件- ...

  5. LeetCode - LRU怎么将书架上的旧书完美淘汰呢

    你有一排书架,有空时会拿些书来看,经常性会买些新书.无奈书架容量有限,当新买的书放不下时,需要一个策略将旧书淘汰. LRU(最近最少使用)缓存淘汰机制正合适. 1)新买的书放在最左侧. 2)最近常看的 ...

  6. 【HDU6667】Roundgod and Milk Tea【贪心】

    题目大意:给你ai,bi,限制ai不能流向bi,求最大流 题解:贪心,对于第i个班级,考虑前i-1个班级匹配完剩余多少a,b,将这些ab对第i个班级进行贪心匹配 匹配完若第i个班级还有剩余的ab,考虑 ...

  7. nbu还原集群数据库异常问题

    集群数据库软件均已安装完毕,现在想从NBU上还原数据库,但在还原控制文件报错 [oracle@oracle-db1 ~]$ rman target / Recovery Manager: Releas ...

  8. SpringBoot项目的几种创建方式,启动、和访问

    最常用的4种方式,但除了这些以外,还有其他方式: ①在线创建 ②STS构建 ③Intell  Idea内置构建工具 ④Maven创建 STS官网:https://start.spring.io  .S ...

  9. python 正则之字母匹配

    \A:匹配字符串的开始   \b:匹配一个单词边界   取出a边界单词的个数 >>> len(re.findall(r"\ba"," ab abc ad ...

  10. git回滚操作

    一,找到之前的版本历史纪录,确定要回滚到那个版本号:git log 二,回滚到这个版本:git reset --hard 72229f823c8b21cbe52142a944d74f1883fa41a ...