数据库的 Dev Services
在测试或以开发模式运行时,Quarkus 可以为您提供开箱即用的零配置数据库,这是一项我们称之为开发服务的功能。 根据您的数据库类型,您可能需要安装 Docker 才能使用此功能。 以下数据库支持开发服务
如果您想使用开发服务,您只需包含所需数据库类型的相关扩展(反应式或 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,失败会告诉您正在使用的确切镜像名称,以便您添加到文件中。
以下显示了一个示例文件
ibmcom/db2:11.5.0.0a mcr.microsoft.com/mssql/server:2022-latest
重用开发服务
一般情况
在开发模式会话或测试套件执行期间,只要数据库开发服务的配置(用户名、密码、环境、端口绑定等)没有更改,Quarkus 将始终重用它们。
当任何数据库开发服务的配置更改时,Quarkus 将始终重新启动所有数据库开发服务。
当开发模式会话或测试套件执行结束时,Quarkus 将(默认情况下)停止所有数据库开发服务。
跨运行重用开发服务容器
假设您依赖基于容器的开发服务(与 H2 或 Derby 不同),如果您想在开发模式会话或测试套件执行后保持开发服务容器运行,以便在下一个开发模式会话或测试套件执行中重用它们,这也是可能的。 只需通过在您的一个 TestContainers 配置文件(通常是 ~/.testcontainers.properties
或 C:/Users/myuser/.testcontainers.properties
)中插入此行来启用 TestContainers 重用
testcontainers.reuse.enable=true
即使启用了容器重用,只有当它们的启动命令没有更改时才会重用容器:相同的环境变量(特别是用户名/密码)、相同的端口绑定、相同的卷挂载等。 |
重用容器意味着重用它们的内部状态,包括数据库模式和表的内容。 如果这不是您想要的 —— 并且如果您的测试写入数据库,这可能不是您想要的 —— 请考虑适当配置 Hibernate ORM,或使用 Flyway 或 Liquibase。 |
启用容器重用后,旧容器(尤其是配置已过时的容器)可能会无限期地运行,即使在启动新的 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 主机文件系统上的数据库数据。 配置 此外,在启动应用程序时使用 Flyway 迁移您的模式将修改 Docker 主机的文件系统上的数据库数据。 |
数据库供应商特定配置
所有基于容器的服务都使用 Testcontainers 运行,但 Quarkus 没有使用 Testcontainers JDBC 驱动程序。 因此,即使可以在您的 application.properties
文件中设置额外的 JDBC URL 属性,也不支持 Testcontainers JDBC 驱动程序支持的特定属性,例如 TC_INITSCRIPT
、TC_INITFUNCTION
、TC_DAEMON
、TC_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 |
|
|
默认数据源的 |
Microsoft SQL Server |
|
|
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 | 命名数据源的固定端口。 |
以下是使用 PostgreSQL 的开发服务的示例输出
在标签选项卡中,我们看到 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
配置参考
数据库的开发服务支持以下配置选项
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
||
---|---|---|---|---|
此开发服务是否应在开发模式或测试中随应用程序一起启动。 默认情况下启用 Dev Service,除非显式设置连接配置(例如 JDBC URL 或反应式客户端 URL)。 环境变量: 显示更多 |
布尔值 |
|||
基于容器的 Dev Service 提供程序的容器映像名称。 如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。 环境变量: 显示更多 |
字符串 |
|||
传递给容器的环境变量。 环境变量: 显示更多 |
Map<String,String> |
|||
传递用于其他容器配置的通用属性。 此处定义的属性是特定于数据库的,并且在每个数据库 dev service 实现中进行专门解释。 环境变量: 显示更多 |
Map<String,String> |
|||
添加到数据库连接 URL 的通用属性。 环境变量: 显示更多 |
Map<String,String> |
|||
开发服务将侦听的可选固定端口。 如果未定义,将随机选择端口。 环境变量: 显示更多 |
整数 |
|||
用于基于容器的 Dev Service 提供程序的容器启动命令。 如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。 环境变量: 显示更多 |
字符串 |
|||
如果此 Dev Service 支持覆盖数据库名称,则要使用的数据库名称。 环境变量: 显示更多 |
字符串 |
|||
如果此 Dev Service 支持覆盖用户名,则要使用的用户名。 环境变量: 显示更多 |
字符串 |
|||
如果此 Dev Service 支持覆盖密码,则要使用的密码。 环境变量: 显示更多 |
字符串 |
|||
要从类路径加载并应用于 Dev Service 数据库的 SQL 脚本的路径。 如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。 环境变量: 显示更多 |
字符串列表 |
|||
要从类路径加载并使用 SYS 特权用户应用于开发服务数据库的 SQL 脚本的路径。 并非所有数据库都提供特权用户。 在这些情况下,该属性将被忽略。 如果提供程序不是基于容器的数据库(例如 H2 或 Derby),则无效。 环境变量: 显示更多 |
字符串列表 |
|||
要映射到容器的卷。 映射键对应于主机位置;映射值是容器位置。如果主机位置以“classpath:”开头,则映射将以只读权限从类路径加载资源。 使用文件系统位置时,将以读写权限生成卷,这可能会导致文件系统中的数据丢失或修改。 如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。 环境变量: 显示更多 |
Map<String,String> |
|||
是否在开发模式会话或测试套件执行之后保持开发服务容器运行,以便在下一个开发模式会话或测试套件执行中重用它们。 在开发模式会话或测试套件执行期间,只要它们的配置(用户名、密码、环境、端口绑定等)没有更改,Quarkus 将始终重用开发服务。 此功能专门用于在 Quarkus 未运行时保持容器运行,以便跨运行重用它们。
此配置属性默认设置为 环境变量: 显示更多 |
布尔值 |
|
||
日志是否应由 JBoss 记录器使用。 如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。 环境变量: 显示更多 |
布尔值 |
|