gpt4 book ai didi

java - 如何以编程方式定义数据源?

转载 作者:行者123 更新时间:2023-12-04 07:15:03 27 4
gpt4 key购买 nike

我正在尝试使用 OpenTelemetry 收集数据源指标。根据the OpenTelemetry documentation , DataSource 实例必须像这样包装到 OpenTelemetryDataSource 数据源中:

new OpenTelemetryDataSource(dataSource);

我经历了the Quarkus documentation并且还没有找到以编程方式覆盖数据源的方法。

如何在 Quarkus 中以编程方式覆盖数据源?或者通常如何将 OpenTelemetry 连接到 Quarkus 中的数据源?

更新:当我使用配置属性 (quarkus.datasource.jdbc.url=jdbc:otel:postgresql://localhost:5432/my_db) 设置 JDBC URL 时,应用程序在启动时失败并出现 NPE:

ERROR: Failed to start application (with profile dev)
java.lang.NullPointerException
at io.quarkus.opentelemetry.runtime.QuarkusContextStorage.getVertxContext(QuarkusContextStorage.java:62)
at io.quarkus.opentelemetry.runtime.QuarkusContextStorage.current(QuarkusContextStorage.java:54)
at io.opentelemetry.context.Context.current(Context.java:86)
at io.opentelemetry.instrumentation.jdbc.internal.OpenTelemetryStatement.wrapCall(OpenTelemetryStatement.java:277)
at io.opentelemetry.instrumentation.jdbc.internal.OpenTelemetryPreparedStatement.executeQuery(OpenTelemetryPreparedStatement.java:53)
at io.agroal.pool.wrapper.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:78)
at org.flywaydb.core.internal.database.base.BaseDatabaseType.getSelectVersionOutput(BaseDatabaseType.java:195)
at org.flywaydb.core.internal.database.cockroachdb.CockroachDBDatabaseType.handlesDatabaseProductNameAndVersion(CockroachDBDatabaseType.java:81)
at org.flywaydb.core.internal.database.DatabaseTypeRegister.getDatabaseTypeForConnection(DatabaseTypeRegister.java:136)
at org.flywaydb.core.internal.jdbc.JdbcConnectionFactory.<init>(JdbcConnectionFactory.java:69)
at org.flywaydb.core.Flyway.execute(Flyway.java:510)
at org.flywaydb.core.Flyway.migrate(Flyway.java:170)
at io.quarkus.flyway.runtime.FlywayRecorder.doStartActions(FlywayRecorder.java:75)
at io.quarkus.deployment.steps.FlywayProcessor$createBeansAndStartActions-1520831253.deploy_0(FlywayProcessor$createBeansAndStartActions-1520831253.zig:84)
at io.quarkus.deployment.steps.FlywayProcessor$createBeansAndStartActions-1520831253.deploy(FlywayProcessor$createBeansAndStartActions-1520831253.zig:40)
at io.quarkus.runner.ApplicationImpl.doStart(ApplicationImpl.zig:754)
at io.quarkus.runtime.Application.start(Application.java:101)
at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:101)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:66)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:42)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:119)
at io.quarkus.runner.GeneratedMain.main(GeneratedMain.zig:29)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:98)
at java.base/java.lang.Thread.run(Thread.java:829)

最佳答案

this open issue 中似乎提出了一些解决方法,但以编程方式配置 Quarkus 数据源仍然是一个功能请求。

这个其他issue ,虽然与 OpenTracing 而不是 OpenTelemetry 相关,但似乎证实了这一点。

可能最好的方法是尝试使用配置属性来配置此集成。

根据Quarkus documentation并以 OpenTracing 为例,请尝试以下配置:

quarkus.datasource.db-kind=postgresql
quarkus.datasource.jdbc.driver=io.opentelemetry.instrumentation.jdbc.OpenTelemetryDriver
quarkus.datasource.jdbc.url=jdbc:otel:postgresql://localhost:5432/hibernate_orm_test
# other configuration properties ...

请注意 URL 中的前缀。该示例是针对 PostgreSql 的,但对于其他数据库应该非常相似。

该配置的灵感来自 OpenTelemetry documentation .

根据您的意见,此配置与Quarkus在初始化时执行的Flyway数据库迁移过程冲突。

为了解决这个问题,您可以在启动时禁用 Quarkus Flyway 迁移并以编程方式执行迁移。

Quarkus documentation 中所述, 您可以通过首先设置配置属性 quarkus.flyway.migrate-at-start 来实现此行为为 false(默认为 true)。

然后,以编程方式运行迁移:

@ApplicationScoped
public class MigrationService {
// You can Inject the object if you want to use it manually
@Inject
Flyway flyway;

public void checkMigration() {
flyway.clean();
flyway.migrate();
}
}

关于java - 如何以编程方式定义数据源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68817155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com