You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus运行时动态创建数据库连接的最优实现方案

在Quarkus中实现动态PostgreSQL连接的最优方案

针对你需要在运行时根据传入参数动态连接PostgreSQL数据库、仅执行简单查询的需求,Quarkus提供了两种可行方案,优先推荐基于官方集成的Agroal连接池实现,其次是手动管理原生JDBC连接:

方案一:基于Agroal动态创建数据源(推荐)

Quarkus默认使用Agroal作为连接池,它支持动态创建数据源,相比手动JDBC能更好地复用连接、管控资源。

步骤1:添加依赖

确保pom.xml中包含Agroal和PostgreSQL驱动依赖(如果已有可跳过):

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-agroal</artifactId>
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

步骤2:动态创建数据源并执行查询

注入AgroalDataSourceFactory,根据请求参数构建数据源配置,生成DataSource后获取连接执行SQL:

import io.agroal.api.AgroalDataSource;
import io.agroal.api.configuration.supplier.AgroalDataSourceConfigurationSupplier;
import io.quarkus.agroal.runtime.AgroalDataSourceFactory;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.QueryParam;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

@Path("/dynamic-db")
public class DynamicDbResource {

    @Inject
    AgroalDataSourceFactory dataSourceFactory;

    @GET
    public String queryDynamicDb(@QueryParam("host") String host,
                                 @QueryParam("port") int port,
                                 @QueryParam("dbName") String dbName,
                                 @QueryParam("user") String user,
                                 @QueryParam("password") String password) throws Exception {
        // 构建数据源配置
        AgroalDataSourceConfigurationSupplier config = AgroalDataSourceConfigurationSupplier.newConfiguration()
                .connectionPoolConfiguration(cp -> cp
                        .maxSize(5) // 设置连接池最大连接数
                        .connectionConfiguration(cc -> cc
                                .jdbcUrl(String.format("jdbc:postgresql://%s:%d/%s", host, port, dbName))
                                .principal(user)
                                .credential(password)
                                .driverClassName("org.postgresql.Driver")));

        // 创建数据源
        try (AgroalDataSource dataSource = dataSourceFactory.create(config)) {
            // 获取连接执行查询
            try (Connection conn = dataSource.getConnection();
                 Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT version()")) {
                if (rs.next()) {
                    return "数据库版本:" + rs.getString(1);
                }
                return "查询无结果";
            }
        }
    }
}

注意事项

  • 每次创建的AgroalDataSource要确保用try-with-resources自动关闭,避免资源泄漏
  • 根据实际需求调整连接池参数(如最大连接数、超时时间)
  • 严格校验传入的参数,防止SQL注入或非法连接请求

方案二:手动管理原生JDBC连接

如果不需要连接池,也可以直接使用JDBC原生API创建连接,适合单次查询场景:

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.QueryParam;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

@Path("/raw-jdbc")
public class RawJdbcResource {

    @GET
    public String queryRawJdbc(@QueryParam("host") String host,
                               @QueryParam("port") int port,
                               @QueryParam("dbName") String dbName,
                               @QueryParam("user") String user,
                               @QueryParam("password") String password) throws Exception {
        String jdbcUrl = String.format("jdbc:postgresql://%s:%d/%s", host, port, dbName);
        // 直接创建连接
        try (Connection conn = DriverManager.getConnection(jdbcUrl, user, password);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT version()")) {
            if (rs.next()) {
                return "数据库版本:" + rs.getString(1);
            }
            return "查询无结果";
        }
    }
}

注意事项

  • 这种方式每次请求都会创建新连接,性能开销较大,不适合高并发场景
  • 必须通过try-with-resources确保连接、Statement、ResultSet被正确关闭

内容的提问来源于stack exchange,提问作者Furious Gamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:25:35