1.2. 配置数据源
以下章节描述了单个或多个数据源的配置。为了简单起见,我们将引用单个数据源作为默认数据源(未命名)数据源。
1.2.1. 配置单个数据源
数据源可以是 JDBC 数据源、被动或两者。这取决于配置和选择项目扩展。
使用以下配置属性定义数据源,其中
db-kind
定义要连接到哪个数据库平台,例如h2
:quarkus.datasource.db-kind=h2
Quarkus 会从
db-kind
数据库平台属性的指定的值减少需要使用的 JDBC 驱动程序类。注意只有在应用程序依赖于多个数据库驱动程序时,才需要执行此步骤。如果应用程序使用单个驱动程序运行,则会自动检测到此驱动程序。
Quarkus 当前包括以下内置数据库类型:
-
DB2:
db2
-
Derby:
derby
-
H2:
h2
-
mariadb:
mariadb
-
Microsoft SQL Server:
mssql
-
MySQL:
mysql
-
Oracle:
oracle
-
postgresql:
postgresql
,pgsql
或pg
要使用不是内置的数据库类型,请使用
other
并明确定义 JDBC 驱动程序注意您可以在 JVM 模式中使用 Quarkus 应用程序中的任何 JDBC 驱动程序,如 使用其他数据库 中所述。但是,当将应用程序编译到原生可执行文件时,使用非内置数据库类型不太可能可以正常工作。
对于原生可执行构建,建议使用可用的 JDBC Quarkus 扩展,或为您的特定驱动程序提供自定义扩展。
-
DB2:
配置以下属性以定义凭证:
quarkus.datasource.username=<your username> quarkus.datasource.password=<your password>
您还可以使用数据源 的凭证供应商 从 Vault 检索密码。
到目前为止,无论您使用的是 JDBC 还是被动驱动程序,配置都相同。当您定义了数据库类型和凭证时,其余则取决于您所使用的驱动程序类型。可以同时使用 JDBC 和被动驱动程序。
1.2.1.1. JDBC 数据源
JDBC 是最常见的数据库连接模式,通常与非主动 Hibernate ORM 一起使用时需要。
要使用 JDBC 数据源,请从添加所需的依赖项开始:
对于内置 JDBC 驱动程序,请从下面的列表中选择并添加相关数据库驱动程序的 Quarkus 扩展:
-
Derby -
quarkus-jdbc-derby
H2 -
quarkus-jdbc-h2
注意H2 和 Derby 数据库可以配置为以"embedded 模式"运行,但 Derby 扩展不支持将嵌入式数据库引擎编译到原生可执行文件中。
使用内存数据库读取测试,以了解与集成测试相关的建议。
-
DB2 -
quarkus-jdbc-db2
-
MariaDB -
quarkus-jdbc-mariadb
-
Microsoft SQL Server -
quarkus-jdbc-mssql
-
MySQL -
quarkus-jdbc-mysql
-
Oracle -
quarkus-jdbc-oracle
-
PostgreSQL -
quarkus-jdbc-postgresql
其他 JDBC 扩展(如 SQLite 及其 文档 )可在 Quarkiverse 中找到。
例如,添加 PostgreSQL 驱动程序依赖项:
./mvnw quarkus:add-extension -Dextensions="jdbc-postgresql"
注意使用内置 JDBC 驱动程序扩展会自动包含 Agroal 扩展,该扩展是适用于自定义和内置 JDBC 驱动程序的 JDBC 连接池实施。但是,对于自定义驱动程序,需要明确添加 Agroal。
-
Derby -
对于自定义 JDBC 驱动程序,请将
quarkus-agroal
依赖项添加到项目中,以及您的相关数据库驱动程序的扩展:./mvnw quarkus:add-extension -Dextensions="agroal"
要将 JDBC 驱动程序用于其他 数据库,请使用没有内置扩展或具有不同驱动程序 的数据库。
通过定义 JDBC URL 属性来配置 JDBC 连接:
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/hibernate_orm_test
注意注意属性名称中的
jdbc
前缀。特定于 JDBC 的所有配置属性都具有jdbc
前缀。对于被动数据源,前缀是被动
。
有关配置 JDBC 的更多信息,请参阅 JDBC URL 格式参考 和 Quarkus 扩展和数据库驱动程序参考。
1.2.1.1.1. 自定义数据库和驱动程序
如果您需要连接到 Quarkus 没有提供 JDBC 驱动程序的扩展数据库,您可以使用自定义驱动程序。例如,如果您在项目中使用 OpenTracing JDBC 驱动程序。
如果没有扩展,驱动程序将在 JVM 模式下运行的任何 Quarkus 应用程序中正常工作。但是,当将应用程序编译到原生可执行文件时,驱动程序不太可能工作。如果您计划生成原生可执行文件,请使用现有的 JDBC Quarkus 扩展,或为您的驱动程序贡献一个。
OpenTracing 已被弃用,而被 OpenTelemetry 替代。如需追踪信息,请检查有关 数据源追踪的相关部分,bellow。
带有旧 OpenTracing 驱动程序的自定义驱动程序定义示例:
quarkus.datasource.jdbc.driver=io.opentracing.contrib.jdbc.TracingDriver
定义在 JVM 模式中不支持内置支持的数据库的访问示例:
quarkus.datasource.db-kind=other quarkus.datasource.jdbc.driver=oracle.jdbc.driver.OracleDriver quarkus.datasource.jdbc.url=jdbc:oracle:thin:@192.168.1.12:1521/ORCL_SVC quarkus.datasource.username=scott quarkus.datasource.password=tiger
有关 JDBC 配置选项和配置其他方面的所有详细信息,如连接池大小,请参阅 JDBC 配置参考部分。
1.2.1.1.2. 消耗数据源
使用 Hibernate ORM 时,Hibernate 层会自动获取数据源并使用它。
对于对数据源的 in-code 访问,请作为任何其他 bean 获取,如下所示:
@Inject AgroalDataSource defaultDataSource;
在上例中,type 是 AgroalDataSource
,一个 javax.sql.DataSource
子类型。因此,您也可以使用 javax.sql.DataSource
作为注入的类型。
1.2.1.2. 主动数据源
Quarkus 提供多个被动客户端,用于被动数据源。
在应用程序中添加对应的扩展:
-
DB2:
quarkus-reactive-db2-client
-
mariadb/MySQL:
quarkus-reactive-mysql-client
-
Microsoft SQL Server:
quarkus-reactive-mssql-client
-
Oracle:
quarkus-reactive-oracle-client
postgresql:
quarkus-reactive-pg-client
安装的扩展必须与您在数据源配置中定义的
quarkus.datasource.db-kind
一致。
-
DB2:
添加驱动程序后,配置连接 URL,并为您的连接池定义正确的大小。
quarkus.datasource.reactive.url=postgresql:///your_database quarkus.datasource.reactive.max-size=20
1.2.1.2.1. 重新调整连接池大小
为了保护您的数据库在负载高峰期间被过载,请适当调整池的大小,以节流数据库负载。正确的大小总是取决于许多因素,如并行应用程序用户的数量或工作负载的性质。
请注意,设置池大小太大可能会导致一些请求在等待连接时超时。
有关池大小调整属性的更多信息,请参阅 主动数据源配置参考部分。
1.2.1.3. JDBC 和被动数据源同时
当 JDBC 扩展 - 以及 Agroal - 以及处理给定数据库类型的被动数据源扩展时,将默认创建这两个数据库。
明确禁用 JDBC 数据源:
quarkus.datasource.jdbc=false
明确禁用被动数据源:
quarkus.datasource.reactive=false
提示在大多数情况下,上述配置将作为 JDBC 驱动程序或被动数据源扩展是可选的,而不是同时存在。
1.2.2. 配置多个数据源
Hibernate ORM 扩展支持使用配置属性定义 持久性单元。对于每个持久性单元,指向您选择的数据源。
定义多个数据源的工作方式类似于定义一个数据源,具有一个重要更改 - 您必须为每个数据源指定一个名称(配置属性)。
以下示例提供三个不同的数据源:
- 默认 1
-
名为
users
的数据源 -
名为
inventory
的数据源
每个配置都有其配置:
quarkus.datasource.db-kind=h2 quarkus.datasource.username=username-default quarkus.datasource.jdbc.url=jdbc:h2:mem:default quarkus.datasource.jdbc.max-size=13 quarkus.datasource.users.db-kind=h2 quarkus.datasource.users.username=username1 quarkus.datasource.users.jdbc.url=jdbc:h2:mem:users quarkus.datasource.users.jdbc.max-size=11 quarkus.datasource.inventory.db-kind=h2 quarkus.datasource.inventory.username=username2 quarkus.datasource.inventory.jdbc.url=jdbc:h2:mem:inventory quarkus.datasource.inventory.jdbc.max-size=12
请注意,配置属性中有一个额外的部分。语法如下: quarkus.datasource.[optional name.][datasource property]
.
即使只安装了一个数据库扩展,命名的数据库还需要指定一个 build-time 属性,以便 Quarkus 能够检测它们。通常,这是 db-kind
属性,但您也可以指定 Dev Services 属性,以根据 Dev Services for Databases 指南创建名为 datasources。
1.2.2.1. 命名数据源注入
使用多个数据源时,每个 DataSource
也具有 io.quarkus.agroal.DataSource
限定符,其名称为数据源的名称。
通过使用上一节中提到的属性来配置三个不同的数据源,请按如下所示注入每个数据源:
@Inject AgroalDataSource defaultDataSource; @Inject @DataSource("users") AgroalDataSource usersDataSource; @Inject @DataSource("inventory") AgroalDataSource inventoryDataSource;
1.2.3. 激活/停用数据源
如果在构建时配置了数据源,默认情况下,它在运行时处于活跃状态,即 Quarkus 将在应用启动时启动对应的 JDBC 连接池或重新主动客户端。
要在运行时取消激活数据源,请将 quarkus.datasource[.optional name].active
设置为 false
。然后 Quarkus 不会在应用启动时启动对应的 JDBC 连接池或被动客户端。在运行时使用对应的数据源的任何尝试都会失败,并显示清晰的错误消息。
当您希望应用程序在运行时使用预先确定的数据源集合时,这特别有用。
如果另一个 Quarkus 扩展依赖于不活跃的数据源,则该扩展可能无法启动。
在这种情况下,您还需要取消激活其他扩展。例如,请参见此处的 Hibernate ORM。
例如,使用以下配置:
quarkus.datasource."pg".db-kind=postgres quarkus.datasource."pg".active=false quarkus.datasource."pg".jdbc.url=jdbc:postgresql:///your_database quarkus.datasource."oracle".db-kind=oracle quarkus.datasource."oracle".active=false quarkus.datasource."oracle".jdbc.url=jdbc:oracle:///your_database
在运行时设置 quarkus.datasource."pg".active=true
将使 PostgreSQL 数据源可用,并在运行时 设置 quarkus.datasource."oracle".active=true
将使 Oracle 数据源可用。
自定义配置文件 可帮助简化此类设置。通过将以下特定于配置集的配置附加到以上内容,只需通过 设置 quarkus.profile
: quarkus.profile
=prod,pg 或 quarkus.profile=prod,oracle
即可在运行时选择持久性单元/数据源。
%pg.quarkus.hibernate-orm."pg".active=true %pg.quarkus.datasource."pg".active=true # Add any pg-related runtime configuration here, prefixed with "%pg." %oracle.quarkus.hibernate-orm."oracle".active=true %oracle.quarkus.datasource."oracle".active=true # Add any pg-related runtime configuration here, prefixed with "%pg."
它也可用于定义 CDI bean 生成者 重定向到当前活跃的数据源,如下所示:
public class MyProducer { @Inject DataSourceSupport dataSourceSupport; @Inject @DataSource("pg") AgroalDataSource pgDataSourceBean; @Inject @DataSource("oracle") AgroalDataSource oracleDataSourceBean; @Produces @ApplicationScoped public AgroalDataSource dataSource() { if (dataSourceSupport.getInactiveNames().contains("pg")) { return oracleDataSourceBean; } else { return pgDataSourceBean; } } }
1.2.4. 在单个事务中使用多个数据源
默认情况下,数据源上的 XA 支持被禁用,因此事务最多可能包括一个数据源。在同一个事务中尝试访问多个非 XA datasources 是不安全的,将导致警告。
在 Quarkus 3.10+ 中,这会导致错误。
要安全地允许在同一事务中使用多个 JDBC 数据源:
- 确保您的 JDBC 驱动程序支持 XA。所有支持的 JDBC 驱动程序都执行,但其他 JDBC 驱动程序 可能不。
- 确保您的数据库服务器已配置为启用 XA。
-
通过将
quarkus.datasource[.optional name].transactions
设置为xa
,为每个相关数据源启用 XA 支持。
使用 XA 时,一个数据源的回滚将在事务中注册的每个其他数据源中触发回滚。
目前不支持被动数据源上的 XA 事务。
如果您的事务涉及其他非数据源资源,请记住 这些资源 可能不支持 XA 事务,或者可能需要额外的配置。
如果无法为您的其中一个数据源启用 XA :
- 请注意,仍然通过 Last Resource Commit Optimization (LRCO)支持为所有数据源启用 XA,但仍然通过 Last Resource Commit Optimization (LRCO) 支持。
-
如果您不需要一个数据源的回滚来为其他数据源触发回滚,请考虑将您的代码拆分为多个事务。为此,请使用
QuarkusTransaction.requiringNew ()
/@Transactional (REQUIRES_NEW)
或UserTransaction
(用于更复杂的用例)。
如果要确保无法访问同一事务中的多个非 XA 数据源,您可以将 quarkus.transaction-manager.unsafe-multiple-last-resources
设置为 fail
。这个值是 Quarkus 3.10+ 的默认值。
对于与 fail
不同的任何值,事务回滚可能只应用于一些非 XA 数据源,其他非 XA datasources 已提交更改,从而使您的整个系统处于不一致的状态。
默认情况下,在 Quarkus 3.8 中,出于兼容性的原因,系统会在第一次出现时发出警告(警告优先
)。您可以通过将 quarkus.transaction-manager.unsafe-multiple-last-resources
设置为 允许
,在多个非 XA datasources 之间完全允许不安全的事务处理。
或者,您可以允许相同的不安全行为,但通过将属性设置为 warn-each
,在每个 异常事务上记录警告。
我们不推荐使用此配置属性,我们计划在以后删除它,因此您应该计划相应地修复应用程序。如果您认为这个功能的用例有效,且应该保留这个选项,请在 Quarkus tracker 中创建一个问题,解释原因的原因。