1.2.3. 激活或停用数据源
当数据源在构建时配置,且在运行时设置其 URL 时,它默认处于活动状态。当应用程序启动时,quarkus 会启动对应的 JDBC 连接池或被动客户端。
要在运行时取消激活数据源,请执行以下任一操作:
-
不要设置
quarkus.datasource[.optional name].jdbc.url或quarkus.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,pg 或 quarkus.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> 或 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;
@Inject
@DataSource("oracle")
InjectableInstance<DataSource> oracleDataSourceBean;
@Produces
@ApplicationScoped
public DataSource dataSource() {
if (pgDataSourceBean.getHandle().getBean().isActive()) {
return pgDataSourceBean.get();
} else if (oracleDataSourceBean.getHandle().getBean().isActive()) {
return oracleDataSourceBean.get();
} else {
throw new RuntimeException("No active datasource!");
}
}
}
@ApplicationScoped
public class MyConsumer {
@Inject
DataSource dataSource;
public void doSomething() {
// .. just use the injected datasource ...
}
}