1.2.3. 激活或停用数据源


当数据源在构建时配置,且在运行时设置其 URL 时,它默认处于活动状态。当应用程序启动时,quarkus 会启动对应的 JDBC 连接池或被动客户端。

要在运行时取消激活数据源,请执行以下任一操作:

  • 不要设置 quarkus.datasource[.optional name].jdbc.urlquarkus.datasource[.optional name].reactive.url
  • quarkus.datasource[.optional name].active 设置为 false

如果数据源未激活:

  • 数据源不会在应用程序启动期间尝试连接到数据库。
  • 数据源不贡献 健康检查
  • 涉及数据源的静态 CDI 注入点(如 @Inject DataSource ds@Inject Pool pool ),这会导致应用启动失败。
  • 数据源的动态检索(如通过 CDI.getBeanContainer ()Arc.instance () 或注入 Instance<DataSource > )会导致抛出异常。
  • 使用数据源的其他 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,pgquarkus.profile=prod,oracle

%pg.quarkus.hibernate-orm."pg".active=true
%pg.quarkus.datasource."pg".active=true
# Add any PostgreSQL-related runtime configuration here, prefixed with "%pg."

%oracle.quarkus.hibernate-orm."oracle".active=true
%oracle.quarkus.datasource."oracle".active=true
# Add any Oracle-related runtime configuration here, prefixed with "%oracle."

使用这个设置,确保只访问 活跃的 数据源。要做到这一点,注入一个 InjectableInstance<DataSource&gt; 或 InjectableInstance<Pool& gt;,它带有一个 @Any qualifier,并调用 getActive ()

import io.quarkus.arc.InjectableInstance;
@ApplicationScoped
public class MyConsumer {
    @Inject
    @Any
    InjectableInstance<DataSource> dataSource;

    public void doSomething() {
        DataSource activeDataSource = dataSource.getActive();
        // ...
    }
}

或者,您可以为默认 数据源定义 CDI bean 生成者。此 bean 生成者重定向到当前活跃的名为 datasource。这允许直接注入它,如下所示:

public class MyProducer {
    @Inject
    @DataSource("pg")
    InjectableInstance<DataSource> pgDataSourceBean; 
1


    @Inject
    @DataSource("oracle")
    InjectableInstance<DataSource> oracleDataSourceBean;

    @Produces 
2

    @ApplicationScoped
    public DataSource dataSource() {
        if (pgDataSourceBean.getHandle().getBean().isActive()) { 
3

            return pgDataSourceBean.get();
        } else if (oracleDataSourceBean.getHandle().getBean().isActive()) { 
4

            return oracleDataSourceBean.get();
        } else {
            throw new RuntimeException("No active datasource!");
        }
    }
}

@ApplicationScoped
public class MyConsumer {
    @Inject
    DataSource dataSource; 
5


    public void doSomething() {
        // .. just use the injected datasource ...
    }
}
1
不要直接注入 DataSourceAgroalDatasource。注入不活跃的 Bean 会导致启动失败。相反,注入 InjectableInstance<DataSource>InjectableInstance<AgroalDataSource>
2
声明 CDI 生成者方法来定义默认数据源。它根据哪个 PostgreSQL 或 Oracle 选择 PostgreSQL 或 Oracle。
3 4
在检索 bean 前,检查 bean 是否处于活动状态。
5
注入唯一的活动数据源。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

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

让开源更具包容性

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

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部