编辑此页面

数据库的 Dev Services

在测试或以开发模式运行时,Quarkus 可以为您提供开箱即用的零配置数据库,这是一项我们称之为开发服务的功能。 根据您的数据库类型,您可能需要安装 Docker 才能使用此功能。 以下数据库支持开发服务

  • DB2(容器)(需要接受许可协议

  • Derby(进程内)

  • H2(进程内)

  • MariaDB(容器)

  • Microsoft SQL Server(容器)(需要接受许可协议

  • MySQL(容器)

  • Oracle Express Edition(容器)

  • PostgreSQL(容器)

如果您想使用开发服务,您只需包含所需数据库类型的相关扩展(反应式或 JDBC,或两者)。 不要配置数据库 URL、用户名和密码 - Quarkus 将提供数据库,您可以直接开始编码,而无需担心配置。

生产数据库需要像往常一样进行配置,因此如果您想在您的 application.properties 中包含生产数据库配置并继续使用开发服务,我们建议您使用 %prod. profile 来定义您的数据库设置。

启用/禁用数据库的开发服务

数据库的开发服务会在开发模式和运行测试时自动启动数据库服务器。 因此,您不必手动启动服务器。 应用程序会自动配置。

您可以在 application.properties 中通过以下方式禁用自动数据库启动

quarkus.devservices.enabled=false
# OR
quarkus.datasource.devservices.enabled=false

数据库的开发服务依赖 Docker 来启动服务器(H2 和 Derby 除外,它们在进程中运行)。 如果您的环境不支持 Docker,您需要手动启动服务器,或连接到已运行的服务器。

专有数据库 - 许可协议接受

如果您使用的是 DB2 或 MSSQL 等专有数据库,您需要接受许可协议。为此,请在您的项目中创建一个 src/main/resources/container-license-acceptance.txt 文件,并添加一行包含数据库的镜像名称和标签。 默认情况下,Quarkus 使用当前 Testcontainers 版本的默认镜像,如果您尝试启动 Quarkus,失败会告诉您正在使用的确切镜像名称,以便您添加到文件中。

以下显示了一个示例文件

src/main/resources/container-license-acceptance.txt
ibmcom/db2:11.5.0.0a
mcr.microsoft.com/mssql/server:2022-latest

捕获日志

默认情况下,不会公开底层数据库的日志。 通过捕获日志,它们会与其他日志语句一起可见

quarkus.datasource.devservices.show-logs=true

重用开发服务

一般情况

在开发模式会话或测试套件执行期间,只要数据库开发服务的配置(用户名、密码、环境、端口绑定等)没有更改,Quarkus 将始终重用它们。

当任何数据库开发服务的配置更改时,Quarkus 将始终重新启动所有数据库开发服务。

当开发模式会话或测试套件执行结束时,Quarkus 将(默认情况下)停止所有数据库开发服务。

跨运行重用开发服务容器

假设您依赖基于容器的开发服务(与 H2 或 Derby 不同),如果您想在开发模式会话或测试套件执行后保持开发服务容器运行,以便在下一个开发模式会话或测试套件执行中重用它们,这也是可能的。 只需通过在您的一个 TestContainers 配置文件(通常是 ~/.testcontainers.propertiesC:/Users/myuser/.testcontainers.properties)中插入此行来启用 TestContainers 重用

testcontainers.reuse.enable=true

即使启用了容器重用,只有当它们的启动命令没有更改时才会重用容器:相同的环境变量(特别是用户名/密码)、相同的端口绑定、相同的卷挂载等。

重用容器意味着重用它们的内部状态,包括数据库模式和表的内容。

如果这不是您想要的 —— 并且如果您的测试写入数据库,这可能不是您想要的 —— 请考虑适当配置 Hibernate ORM,或使用 FlywayLiquibase

启用容器重用后,旧容器(尤其是配置已过时的容器)可能会无限期地运行,即使在启动新的 Quarkus 开发模式会话或测试套件执行之后。

在这种情况下,您需要手动停止并删除这些容器。

如果您想为某些 Quarkus 应用程序重用容器,但不是所有应用程序,或者为某些开发服务重用,但不是所有开发服务,您可以通过将配置属性 quarkus.datasource.devservices.reuse/quarkus.datasource."datasource-name".devservices.reuse 设置为 false 来为特定开发服务禁用此功能。

将卷映射到数据库的开发服务中

将卷从 Docker 主机的文件系统映射到容器对于提供脚本或配置文件等文件很方便,但也可以保留数据库数据并在应用程序重新启动后重用它。

映射卷仅适用于具有基于容器的数据库(如 PostgreSQL)的开发服务。

可以将开发服务卷映射到文件系统或类路径

# Using a filesystem volume:
quarkus.datasource.devservices.volumes."/path/from"=/container/to (1)
# Using a classpath volume:
quarkus.datasource.devservices.volumes."classpath\:./file"=/container/to (2)
1 来自本地机器的文件或文件夹“/path/from”将在容器中的“/container/to”中访问。
2 使用类路径卷时,该位置必须以“classpath:”开头。 项目类路径中的文件或文件夹“./file”将在容器中的“/container/to”中访问。
冒号字符 : 需要在 .properties 文件中转义为 \:,否则它将被解释为键/值分隔符。
使用类路径卷时,容器将仅被授予读取权限。 另一方面,使用文件系统卷时,容器将被授予读取和写入权限。

映射卷以持久化数据库数据的示例

让我们看一个使用 PostgreSQL 的示例,我们将映射一个文件系统卷以永久保存数据库数据并使用它

quarkus.datasource.db-kind=postgresql
quarkus.datasource.devservices.volumes."/local/test/data"=/var/lib/postgresql/data

容器内的适当位置因数据库供应商而异。 对于 PostgreSQL 是“/var/lib/postgresql/data”,但对于 MySQL,您需要此配置

quarkus.datasource.db-kind=mysql
quarkus.datasource.devservices.volumes."/local/test/data"=/var/lib/mysql

启动开发服务时(例如,在测试或开发模式下),您将看到将在您的文件系统中创建文件夹“/local/test/data”,并且将包含所有数据库数据。 再次重新运行相同的开发服务时,此数据将包含您之前可能创建的所有数据。

将开发服务与 Hibernate ORM 一起使用时,默认情况下,Quarkus 会在应用程序启动时清除数据库,这将清除 Docker 主机文件系统上的数据库数据。 配置 quarkus.hibernate-orm.schema-management.strategy=nonequarkus.hibernate-orm.schema-management.strategy=validate 以避免此行为。

此外,在启动应用程序时使用 Flyway 迁移您的模式将修改 Docker 主机的文件系统上的数据库数据。

数据库供应商特定配置

所有基于容器的服务都使用 Testcontainers 运行,但 Quarkus 没有使用 Testcontainers JDBC 驱动程序。 因此,即使可以在您的 application.properties 文件中设置额外的 JDBC URL 属性,也不支持 Testcontainers JDBC 驱动程序支持的特定属性,例如 TC_INITSCRIPTTC_INITFUNCTIONTC_DAEMONTC_TMPFS

Quarkus 可以支持发送到容器本身的特定属性,例如 TC_MY_CNF 允许覆盖 MariaDB/MySQL 配置文件。

覆盖 MariaDB/MySQL 配置将按如下方式完成

quarkus.datasource.devservices.container-properties.TC_MY_CNF=testcontainers/mysql-conf

此支持是数据库特定的,需要专门在每个开发服务中实现。

连接到作为开发服务运行的数据库

您可以连接到作为开发服务运行的数据库,就像连接到 Docker 容器内运行的任何数据库一样。

大多数数据库的登录凭据都相同,除非数据库要求不允许

数据库 用户名 密码 数据库名称

PostgreSQL、MariaDB、MySQL、IBM Db2、H2

quarkus

quarkus

默认数据源的 quarkus 或数据源的名称

Microsoft SQL Server

sa

Quarkus123

Microsoft SQL Server Testcontainer 不支持定义用户名或数据库名称。 它还需要一个强密码。

对于支持它的数据库(即除 Microsoft SQL Server 之外的所有数据库,对于 Microsoft SQL Server 只能覆盖密码),您可以覆盖开发服务使用的数据库名称、用户名和密码。

有关更多信息,请参见配置参考

请记住,除非另有配置(请参见下文),否则开发服务在随机端口上运行。 例如,当您将 PostgreSQL 作为开发服务运行并在主机上安装了 psql 时,您可以通过以下方式连接

psql -h localhost -p <random port> -U quarkus

可以使用 docker ps 找到随机端口

docker ps

# returns something like this:

CONTAINER ID   IMAGE           [..]    PORTS                                         [..]
b826e3a168c4   postgres:14.2   [..]    0.0.0.0:49174->5432/tcp, :::49174->5432/tcp   [..] (1)
1 随机端口是 49174

您可以使用以下方式要求数据库开发服务的固定端口

quarkus.datasource.devservices.port=<your fixed port> (1)

quarkus.datasource."datasource-name".devservices.port=<your fixed port> (2)
1 默认数据源的固定端口。
2 命名数据源的固定端口。

docker ps 允许使用 --format 参数更高级地检索容器信息。 例如,要获取运行容器 ID、镜像、标签和端口,可以使用以下命令

docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Labels}}\t{{.Ports}}

以下是使用 PostgreSQL 的开发服务的示例输出

CONTAINER ID   IMAGE          LABELS                                                                        PORTS
a7034c91a392   postgres:14    org.testcontainers.sessionId=xyz,datasource=default,org.testcontainers=true   0.0.0.0:49154->5432/tcp, :::49154->5432/tcp

在标签选项卡中,我们看到 Quarkus 添加了数据源标签,这在启动多个开发服务时区分容器非常有用。

Compose

数据库开发服务支持 Compose 开发服务。 它依赖于 compose-devservices.yml,例如

name: <application name>
services:
  postgresql:
    image: docker.io/postgres:17
    ports:
      - "5432"
    environment:
      POSTGRES_USER: quarkus
      POSTGRES_PASSWORD: quarkus
      POSTGRES_DB: quarkus
  oracle:
    image: docker.io/gvenzl/oracle-free:23-slim-faststart
    ports:
      - "1521"
    environment:
      ORACLE_PASSWORD: quarkus
      ORACLE_DATABASE: quarkus
      APP_USER: quarkus
      APP_USER_PASSWORD: quarkus
  mssql:
    image: mcr.microsoft.com/mssql/server:2022-latest
    ports:
      - "1433"
    environment:
      ACCEPT_EULA: "Y"
      MSSQL_SA_PASSWORD: Quarkus123
    labels:
      io.quarkus.devservices.compose.jdbc.parameters: trustServerCertificate=true

配置参考

数据库的开发服务支持以下配置选项

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

quarkus.datasource."数据源名称".devservices.enabled

此开发服务是否应在开发模式或测试中随应用程序一起启动。

默认情况下启用 Dev Service,除非显式设置连接配置(例如 JDBC URL 或反应式客户端 URL)。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_ENABLED

显示更多

布尔值

quarkus.datasource."数据源名称".devservices.image-name

基于容器的 Dev Service 提供程序的容器映像名称。

如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_IMAGE_NAME

显示更多

字符串

quarkus.datasource."数据源名称".devservices.container-env."环境变量名"

传递给容器的环境变量。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_CONTAINER_ENV__ENVIRONMENT_VARIABLE_NAME_

显示更多

Map<String,String>

quarkus.datasource."数据源名称".devservices.container-properties."属性键"

传递用于其他容器配置的通用属性。

此处定义的属性是特定于数据库的,并且在每个数据库 dev service 实现中进行专门解释。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_CONTAINER_PROPERTIES__PROPERTY_KEY_

显示更多

Map<String,String>

quarkus.datasource."数据源名称".devservices.properties."属性键"

添加到数据库连接 URL 的通用属性。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_PROPERTIES__PROPERTY_KEY_

显示更多

Map<String,String>

quarkus.datasource."数据源名称".devservices.port

开发服务将侦听的可选固定端口。

如果未定义,将随机选择端口。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_PORT

显示更多

整数

quarkus.datasource."数据源名称".devservices.command

用于基于容器的 Dev Service 提供程序的容器启动命令。

如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_COMMAND

显示更多

字符串

quarkus.datasource."数据源名称".devservices.db-name

如果此 Dev Service 支持覆盖数据库名称,则要使用的数据库名称。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_DB_NAME

显示更多

字符串

quarkus.datasource."数据源名称".devservices.username

如果此 Dev Service 支持覆盖用户名,则要使用的用户名。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_USERNAME

显示更多

字符串

quarkus.datasource."数据源名称".devservices.password

如果此 Dev Service 支持覆盖密码,则要使用的密码。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_PASSWORD

显示更多

字符串

quarkus.datasource."数据源名称".devservices.init-script-path

要从类路径加载并应用于 Dev Service 数据库的 SQL 脚本的路径。

如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_INIT_SCRIPT_PATH

显示更多

字符串列表

quarkus.datasource."数据源名称".devservices.init-privileged-script-path

要从类路径加载并使用 SYS 特权用户应用于开发服务数据库的 SQL 脚本的路径。 并非所有数据库都提供特权用户。 在这些情况下,该属性将被忽略。 如果提供程序不是基于容器的数据库(例如 H2 或 Derby),则无效。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_INIT_PRIVILEGED_SCRIPT_PATH

显示更多

字符串列表

quarkus.datasource."数据源名称".devservices.volumes."主机路径"

要映射到容器的卷。

映射键对应于主机位置;映射值是容器位置。如果主机位置以“classpath:”开头,则映射将以只读权限从类路径加载资源。

使用文件系统位置时,将以读写权限生成卷,这可能会导致文件系统中的数据丢失或修改。

如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_VOLUMES__HOST_PATH_

显示更多

Map<String,String>

quarkus.datasource."数据源名称".devservices.reuse

是否在开发模式会话或测试套件执行之后保持开发服务容器运行,以便在下一个开发模式会话或测试套件执行中重用它们。

在开发模式会话或测试套件执行期间,只要它们的配置(用户名、密码、环境、端口绑定等)没有更改,Quarkus 将始终重用开发服务。 此功能专门用于在 Quarkus 未运行时保持容器运行,以便跨运行重用它们。

需要在 testcontainers.properties 中显式启用此功能,可能需要更改您在开发模式和测试中配置数据初始化的方式,并且可能会使容器无限期地运行,从而迫使您手动停止和删除它们。 有关更多信息,请参见文档的此部分

此配置属性默认设置为 true,因此它主要用于禁用重用,如果您在 testcontainers.properties 中启用了它,但只想将其用于您的某些 Quarkus 应用程序或数据源。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_REUSE

显示更多

布尔值

true

quarkus.datasource."datasource-name".devservices.show-logs

日志是否应由 JBoss 记录器使用。

如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_SHOW_LOGS

显示更多

布尔值

false

相关内容