9.13. 配置多个数据源


Red Hat build of Keycloak 允许您指定额外的数据源,以防需要从扩展访问另一个数据库。这在使用红帽构建的 Keycloak 数据源是存储自定义数据的可行选项(如用户)时很有用。

您可以在 {developerguide_userstoragespi_name} 文档中找到有关如何连接到您自己的用户数据库的更多详细信息。

定义多个数据源的工作方式类似于定义单个数据源,一个重要的更改 - 您必须为每个数据源指定一个名称作为配置选项名称的一部分。

9.13.1. 所需的配置

要启用额外的数据源,您需要设置 2 个内容 - JPA persistence.xml 文件和红帽构建的 Keycloak 配置。persistence.xml 文件充当 Jakarta Persistence API 标准的一部分,需要正确配置到 Hibernate ORM 框架。使用 persistence.xml 文件完成部分后,您需要相应地设置红帽构建的 Keycloak 配置。

额外的数据源属性可以通过标准配置源(如 CLI、keycloak.conf 或环境变量)指定。

额外的数据源可以像主数据源一样配置。这可以通过对配置选项使用类名称来实现,这还包括附加数据源的名称。例如,当主数据源使用 db-username 时,另一个是 db- username-<datasource>。有关相关选项的完整列表,请参见相关选项章节。

9.13.1.1. 1.JPA persistence.xml 文件

persistence.xml 为 Jakarta Persistence API (langpack)提供配置,如它应管理哪些实体、数据源名称、JDBC 设置、JPA/Hibernate 自定义设置等。该文件需要放在自定义红帽构建 Keycloak 扩展的 META-INF/persistence.xml 文件夹中。

注意

请注意,Quarkus 提供了通过 Hibernate ORM 属性设置 JPA Persistence 单元,而不使用 persistence.xml 文件。但是,红帽构建的 Keycloak 支持的方法是使用 persistence.xml 文件,如果存在该文件,则忽略 Quarkus 属性。

在 Red Hat build of Keycloak 中,大多数配置都是自动的,您只需要提供基本配置详情 - 数据源名称和事务类型。

红帽构建的 Keycloak 需要将额外数据源的事务类型设置为 JTA。您可以为这个最小 persistence.xml 文件设置事务类型和数据源名称:

<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
                         version="3.0">
    <persistence-unit name="user-store-pu" transaction-type="JTA">
        <class>org.your.extension.UserEntity</class>
        <properties>
            <property name="jakarta.persistence.jtaDataSource" value="user-store" />
        </properties>
    </persistence-unit>
</persistence>
注意

要正确设置数据源名称,您应该设置 jakarta.persistence.jtaDataSource 属性。如果没有设置,持久性单元名称将用作数据源名称(在这种情况下,user-store-pu )。在上例中,生成的数据源名称为 user-store。数据源名称可以与持久性单元名称相同。

要使用您自己的 JPA 实体,您需要提供 < class&gt; 属性来标记由此持久性单元管理的 JPA 实体,并定向到特定的数据源。在上例中,org.your.extension.UserEntity JPA 实体将由 persistence 单元 user-store-pu 进行管理,并定向到 user-store 数据源。

9.13.1.2. 2.必要属性

设置 persistence.xml 后,红帽构建的 Keycloak 端的最小配置是指定数据源的 DB kind/vendor 设置。您需要指定构建时间选项 db-kind-<name& gt;,其中 & lt;name> 是数据源的名称,且必须与 persistence.xml 文件中指定的 相同

因此,您可以启用额外的数据源 user-store (例如postgres ):

bin/kc.[sh|bat] start --db-kind-user-store=postgres

为数据源指定 db-kind 后,会自动应用所有特定于 database-kind 的默认值(如驱动程序和 dialect)的默认值,就像主数据源一样。

9.13.2. 通过环境变量配置

如果您不想通过 CLI 或 keycloak.conf 属性配置数据源,您可以使用环境变量。

您可以通过环境变量(用于 user-store 数据源)设置 DB kind,如下所示:

export KC_DB_KIND_USER_STORE=postgres
export KC_DB_USERNAME_USER_STORE=my-username

由于环境变量的默认映射,它映射到 db - kind-user-storedb-username-user-store 红帽构建的 Keycloak 属性。但有时候,数据源的名称可能包含一些特殊字符,如 _$

要通过红帽构建的 Keycloak 环境变量正确配置它,您需要明确指出数据源的密钥应是什么样子。您可以使用一对唯一红帽构建的 Keycloak 环境变量,以及 KCKEY_ 的特殊案例。

例如,对于名为 user_store$ marketing 的数据源,您可以按如下方式设置环境变量:

export KC_USER_STORE_DB_KIND=mariadb
export KCKEY_USER_STORE_DB_KIND=db-kind-user_store$marketing

您可以参阅 Configuring Red Hat build of Keycloak, in 子小节中 用于带有特殊字符 的环境变量键的内容

9.13.3. quarkus.properties的向后兼容性

在过去,我们指示用户使用原始 Quarkus 属性在某些位置配置额外的数据源。但是,如在 conf/quarkus.properties 文件中使用 Quarkus 属性被视为 不受支持,强烈建议您使用专用的附加数据源选项,如上面所述。

在能够迁移到专用选项前,您仍然可以通过 Quarkus 属性指定数据源设置,如下所示:

quarkus.datasource.user-store.db-kind=h2
quarkus.datasource.user-store.username=sa
quarkus.datasource.user-store.jdbc.url=jdbc:h2:mem:user-store;DB_CLOSE_DELAY=-1
quarkus.datasource.user-store.jdbc.transactions=xa
警告

对数据源名称使用 Quarkus 属性,作为带引号的数据源名称 clash 的属性,带有新的数据源选项映射。因此,使用 quarkus.datasource.user-store.db-kind=h2,而不是 quarkus.datasource."user-store".db-kind=h2 来防止任何问题。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部