zoukankan      html  css  js  c++  java
  • 20191128 Spring Boot官方文档学习(9.10)

    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以获取有关可用设置的详细信息,例如上下文,默认架构和其他。

  • 相关阅读:
    最大子数组问题(分治策略实现)
    Solving the Detached Many-to-Many Problem with the Entity Framework
    Working With Entity Framework Detached Objects
    Attaching detached POCO to EF DbContext
    如何获取qq空间最近访问人列表
    Health Monitoring in ASP.NET 2.0
    problem with displaying the markers on Google maps
    WebMatrix Database.Open… Close() and Dispose()
    Accessing and Updating Data in ASP.NET: Retrieving XML Data with XmlDataSource Control
    Create web setup project that has crystal reports and sql script run manually on client system
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/11947463.html
Copyright © 2011-2022 走看看