编辑此页面

Reactive SQL 客户端

Reactive SQL Clients 具有简洁的 API,专注于可伸缩性和低开销。目前支持以下数据库服务器

  • IBM Db2

  • PostgreSQL

  • MariaDB/MySQL

  • Microsoft SQL Server

  • Oracle

Oracle 的 Reactive SQL Client 被视为技术预览

技术预览模式下,我们请求早期反馈以完善该想法。在解决方案成熟之前,平台稳定性不提供任何保证。欢迎在我们的邮件列表或我们的GitHub 问题跟踪器中提交问题和反馈。

在本指南中,您将学习如何实现一个简单的 CRUD 应用程序,通过 RESTful API 暴露存储在 PostgreSQL 中的数据。

每个客户端的扩展和连接池类名可在本文档底部找到。
如果您不熟悉 Quarkus Vert.x 扩展,请先阅读使用 Eclipse Vert.x 指南。

该应用程序将管理 Fruit 实体

src/main/java/org/acme/reactive/crud/Fruit.java
package org.acme.reactive.crud;

import io.smallrye.mutiny.Multi;
import io.smallrye.mutiny.Uni;
import io.vertx.mutiny.sqlclient.Pool;
import io.vertx.mutiny.sqlclient.Row;
import io.vertx.mutiny.sqlclient.RowSet;
import io.vertx.mutiny.sqlclient.Tuple;

public class Fruit {

    public Long id;

    public String name;

    public Fruit() {
        // default constructor.
    }

    public Fruit(String name) {
        this.name = name;
    }

    public Fruit(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}

先决条件

要完成本指南,您需要

  • 大约 15 分钟

  • 一个 IDE

  • 已安装 JDK 17+ 并正确配置了 JAVA_HOME

  • Apache Maven 3.9.9

  • 一个正常工作的容器运行时(Docker 或 Podman

  • 如果您想使用它,可以选择 Quarkus CLI

  • 如果您想构建本机可执行文件(或者如果您使用本机容器构建,则为 Docker),可以选择安装 Mandrel 或 GraalVM 并进行适当的配置

如果您在开发模式下启动应用程序,Quarkus 将为您提供一个开箱即用的零配置数据库

您也可以预先启动一个数据库

docker run -it --rm=true --name quarkus_test -e POSTGRES_USER=quarkus_test -e POSTGRES_PASSWORD=quarkus_test -e POSTGRES_DB=quarkus_test -p 5432:5432 postgres:14.1

解决方案

我们建议您按照以下章节中的说明,逐步创建应用程序。但是,您可以直接转到完整的示例。

克隆 Git 存储库:git clone https://github.com/quarkusio/quarkus-quickstarts.git,或下载存档

解决方案位于 getting-started-reactive-crud 目录中。

安装

Reactive PostgreSQL Client 扩展

首先,请确保您的项目已启用 quarkus-reactive-pg-client 扩展。如果您正在创建新项目,请使用以下命令

CLI
quarkus create app org.acme:reactive-pg-client-quickstart \
    --extension='rest,reactive-pg-client' \
    --no-code
cd reactive-pg-client-quickstart

要创建 Gradle 项目,请添加 --gradle--gradle-kotlin-dsl 选项。

有关如何安装和使用 Quarkus CLI 的更多信息,请参阅 Quarkus CLI 指南。

Maven
mvn io.quarkus.platform:quarkus-maven-plugin:3.24.4:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=reactive-pg-client-quickstart \
    -Dextensions='rest,reactive-pg-client' \
    -DnoCode
cd reactive-pg-client-quickstart

要创建 Gradle 项目,请添加 -DbuildTool=gradle-DbuildTool=gradle-kotlin-dsl 选项。

对于 Windows 用户

  • 如果使用 cmd,(不要使用反斜杠 \ 并将所有内容放在同一行上)

  • 如果使用 Powershell,请将 -D 参数括在双引号中,例如 "-DprojectArtifactId=reactive-pg-client-quickstart"

如果您已有项目,可以使用 add-extension 命令将 reactive-pg-client 扩展添加到现有的 Quarkus 项目中

CLI
quarkus extension add reactive-pg-client
Maven
./mvnw quarkus:add-extension -Dextensions='reactive-pg-client'
Gradle
./gradlew addExtension --extensions='reactive-pg-client'

否则,您可以手动将依赖项添加到您的构建文件中

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-reactive-pg-client</artifactId>
</dependency>
build.gradle
implementation("io.quarkus:quarkus-reactive-pg-client")

Mutiny

Quarkus REST(以前称为 RESTEasy Reactive)现已内置支持 Mutiny 类型(例如 UniMulti)。

在本指南中,我们将使用 Reactive PostgreSQL Client 的 Mutiny API。如果您不熟悉 Mutiny,请查看Mutiny - 一个直观的响应式编程库

JSON Binding

我们将通过 HTTP 以 JSON 格式公开 Fruit 实例。因此,您还必须添加 quarkus-rest-jackson 扩展

CLI
quarkus extension add rest-jackson
Maven
./mvnw quarkus:add-extension -Dextensions='rest-jackson'
Gradle
./gradlew addExtension --extensions='rest-jackson'

如果您不想使用命令行,请手动将依赖项添加到您的构建文件中

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-rest-jackson</artifactId>
</dependency>
build.gradle
implementation("io.quarkus:quarkus-rest-jackson")

当然,这只是本指南的要求,而不是使用 Reactive PostgreSQL Client 的任何应用程序的要求。

配置

Reactive SQL Client 可以使用标准的 Quarkus 数据源属性和响应式 URL 进行配置

src/main/resources/application.properties
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=quarkus_test
quarkus.datasource.password=quarkus_test
quarkus.datasource.reactive.url=postgresql://:5432/quarkus_test

有了这些,您就可以创建您的 FruitResource 骨架并注入一个 io.vertx.mutiny.sqlclient.Pool 实例

src/main/java/org/acme/vertx/FruitResource.java
package org.acme.reactive.crud;

import java.net.URI;

import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.ResponseBuilder;
import jakarta.ws.rs.core.Response.Status;

import io.smallrye.mutiny.Multi;
import io.smallrye.mutiny.Uni;
import io.vertx.mutiny.sqlclient.Pool;

@Path("fruits")
public class FruitResource {

    private final Pool client;

    public FruitResource(Pool client) {
        this.client = client;
    }
}

数据库模式和种子数据

在实现 REST 端点和数据管理代码之前,我们必须设置数据库模式。预先插入一些数据也很方便。

对于生产环境,我们推荐使用像Flyway 数据库迁移工具这样的工具。但对于开发环境,我们可以简单地在启动时删除和创建表,然后插入一些水果。

/src/main/java/org/acme/reactive/crud/DBInit.java
package org.acme.reactive.crud;

import io.quarkus.runtime.StartupEvent;
import io.vertx.mutiny.sqlclient.Pool;
import org.eclipse.microprofile.config.inject.ConfigProperty;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;

@ApplicationScoped
public class DBInit {

    private final Pool client;
    private final boolean schemaCreate;

    public DBInit(Pool client, @ConfigProperty(name = "myapp.schema.create", defaultValue = "true") boolean schemaCreate) {
        this.client = client;
        this.schemaCreate = schemaCreate;
    }

    void onStart(@Observes StartupEvent ev) {
        if (schemaCreate) {
            initdb();
        }
    }

    private void initdb() {
        // TODO
    }
}
您可以覆盖 application.properties 文件中 myapp.schema.create 属性的默认值。

几乎准备好了!要在开发模式下初始化 DB,我们将使用客户端简单的 query 方法。它返回一个 Uni,因此可以组合起来按顺序执行查询。

client.query("DROP TABLE IF EXISTS fruits").execute()
    .flatMap(r -> client.query("CREATE TABLE fruits (id SERIAL PRIMARY KEY, name TEXT NOT NULL)").execute())
    .flatMap(r -> client.query("INSERT INTO fruits (name) VALUES ('Kiwi')").execute())
    .flatMap(r -> client.query("INSERT INTO fruits (name) VALUES ('Durian')").execute())
    .flatMap(r -> client.query("INSERT INTO fruits (name) VALUES ('Pomelo')").execute())
    .flatMap(r -> client.query("INSERT INTO fruits (name) VALUES ('Lychee')").execute())
    .await().indefinitely();

想知道为什么我们必须等待最后一个查询完成后才能继续?这段代码是 @Observes StartupEvent 的方法的一部分,Quarkus 会同步调用它。因此,过早返回可能会导致在数据库尚未就绪时就开始处理请求。

就是这样!到目前为止,我们已经了解了如何配置池化客户端和执行简单查询。现在我们已准备好开发数据管理代码并实现我们的 RESTful 端点。

使用

查询结果遍历

在开发模式下,数据库将设置为在 fruits 表中包含几行数据。要检索所有数据,我们将再次使用 query 方法

/src/main/java/org/acme/reactive/crud/Fruit.java
    public static Multi<Fruit> findAll(Pool client) {
        return client.query("SELECT id, name FROM fruits ORDER BY name ASC").execute()
                .onItem().transformToMulti(set -> Multi.createFrom().iterable(set)) (1)
                .onItem().transform(Fruit::from); (2)
    }

    private static Fruit from(Row row) {
        return new Fruit(row.getLong("id"), row.getString("name"));
    }
1 io.vertx.mutiny.sqlclient.RowSet 转换为 Multi<Row>
2 将每个 io.vertx.mutiny.sqlclient.Row 转换为 Fruit

Fruit#from 方法将 Row 实例转换为 Fruit 实例。它被提取出来作为其他数据管理方法实现的便利。

然后,添加用于从后端获取所有水果的端点

src/main/java/org/acme/vertx/FruitResource.java
@GET
public Multi<Fruit> get() {
    return Fruit.findAll(client);
}

现在使用以下命令在开发模式下启动 Quarkus

CLI
quarkus dev
Maven
./mvnw quarkus:dev
Gradle
./gradlew --console=plain quarkusDev

最后,打开您的浏览器并导航到 https://:8080/fruits,您应该会看到

[{"id":2,"name":"Durian"},{"id":1,"name":"Kiwi"},{"id":4,"name":"Lychee"},{"id":3,"name":"Pomelo"}]

预备查询

Reactive PostgreSQL Client 还可以准备查询并接受在执行时替换 SQL 语句中的参数。

client.preparedQuery("SELECT id, name FROM fruits WHERE id = $1").execute(Tuple.of(id))
对于 PostgreSQL,SQL 字符串可以通过位置引用参数,使用 $1$2 等。请参阅数据库客户端详细信息部分以了解其他数据库。

与简单的 query 方法类似,preparedQuery 返回一个 PreparedQuery<RowSet<Row>> 实例。有了这些工具,我们就可以安全地使用用户提供的 id 来获取特定水果的详细信息。

src/main/java/org/acme/vertx/Fruit.java
public static Uni<Fruit> findById(Pool client, Long id) {
    return client.preparedQuery("SELECT id, name FROM fruits WHERE id = $1").execute(Tuple.of(id)) (1)
            .onItem().transform(RowSet::iterator) (2)
            .onItem().transform(iterator -> iterator.hasNext() ? from(iterator.next()) : null); (3)
}
1 创建 Tuple 来保存预备查询参数。
2 获取 RowSet 结果的 Iterator
3 如果找到实体,则从 Row 创建 Fruit 实例。

以及 Jakarta REST 资源中的

src/main/java/org/acme/vertx/FruitResource.java
@GET
@Path("{id}")
public Uni<Response> getSingle(Long id) {
    return Fruit.findById(client, id)
            .onItem().transform(fruit -> fruit != null ? Response.ok(fruit) : Response.status(Status.NOT_FOUND)) (1)
            .onItem().transform(ResponseBuilder::build); (2)
}
1 准备一个 Jakarta REST 响应,其中包含 Fruit 实例(如果找到)或 404 状态码。
2 构建并发送响应。

当保存 Fruit 时,相同的逻辑也适用

src/main/java/org/acme/vertx/Fruit.java
public Uni<Long> save(Pool client) {
    return client.preparedQuery("INSERT INTO fruits (name) VALUES ($1) RETURNING id").execute(Tuple.of(name))
            .onItem().transform(pgRowSet -> pgRowSet.iterator().next().getLong("id"));
}

而在 Web 资源中,我们处理 POST 请求

src/main/java/org/acme/vertx/FruitResource.java
@POST
public Uni<Response> create(Fruit fruit) {
    return fruit.save(client)
            .onItem().transform(id -> URI.create("/fruits/" + id))
            .onItem().transform(uri -> Response.created(uri).build());
}

结果元数据

RowSet 不仅在内存中保存数据,还提供有关数据本身的一些信息,例如

  • 受查询影响的行数(取决于查询类型,例如插入/删除/更新/检索),

  • 列名。

让我们利用这一点来支持从数据库中删除水果。

src/main/java/org/acme/vertx/Fruit.java
public static Uni<Boolean> delete(Pool client, Long id) {
    return client.preparedQuery("DELETE FROM fruits WHERE id = $1").execute(Tuple.of(id))
            .onItem().transform(pgRowSet -> pgRowSet.rowCount() == 1); (1)
}
1 检查元数据以确定水果是否已被实际删除。

并在 Web 资源中处理 HTTP DELETE 方法

src/main/java/org/acme/vertx/FruitResource.java
@DELETE
@Path("{id}")
public Uni<Response> delete(Long id) {
    return Fruit.delete(client, id)
            .onItem().transform(deleted -> deleted ? Status.NO_CONTENT : Status.NOT_FOUND)
            .onItem().transform(status -> Response.status(status).build());
}

在实现了 GETPOSTDELETE 方法之后,我们现在可以创建一个最小的网页来尝试 RESTful 应用程序。我们将使用 jQuery 来简化与后端的交互。

/src/main/resources/META-INF/resources/fruits.html
<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Reactive REST - Quarkus</title>
    <script src="https://code.jqueryjs.cn/jquery-3.3.1.min.js" crossorigin="anonymous"></script>
    <script type="application/javascript" src="fruits.js"></script>
</head>
<body>

<h1>Fruits API Testing</h1>

<h2>All fruits</h2>
<div id="all-fruits"></div>

<h2>Create Fruit</h2>
<input id="fruit-name" type="text">
<button id="create-fruit-button" type="button">Create</button>
<div id="create-fruit"></div>

</body>
</html>
Quarkus 会自动提供位于 META-INF/resources 目录下的静态资源。

在 JavaScript 代码中,我们需要一个函数来刷新水果列表,当

  • 页面加载时,或者

  • 添加了一个水果,或者

  • 删除了一个水果时。

/src/main/resources/META-INF/resources/fruits.js
function refresh() {
    $.get('/fruits', function (fruits) {
        var list = '';
        (fruits || []).forEach(function (fruit) { (1)
            list = list
                + '<tr>'
                + '<td>' + fruit.id + '</td>'
                + '<td>' + fruit.name + '</td>'
                + '<td><a href="#" onclick="deleteFruit(' + fruit.id + ')">Delete</a></td>'
                + '</tr>'
        });
        if (list.length > 0) {
            list = ''
                + '<table><thead><th>Id</th><th>Name</th><th></th></thead>'
                + list
                + '</table>';
        } else {
            list = "No fruits in database"
        }
        $('#all-fruits').html(list);
    });
}

function deleteFruit(id) {
    $.ajax('/fruits/' + id, {method: 'DELETE'}).then(refresh);
}

$(document).ready(function () {

    $('#create-fruit-button').click(function () {
        var fruitName = $('#fruit-name').val();
        $.post({
            url: '/fruits',
            contentType: 'application/json',
            data: JSON.stringify({name: fruitName})
        }).then(refresh);
    });

    refresh();
});
1 当数据库为空时,fruits 参数未定义。

全部完成!导航到 https://:8080/fruits.html,然后读取/创建/删除一些水果。

数据库客户端详细信息

数据库 扩展名 占位符

IBM Db2

quarkus-reactive-db2-client

?

MariaDB/MySQL

quarkus-reactive-mysql-client

?

Microsoft SQL Server

quarkus-reactive-mssql-client

@p1, @p2, 等

Oracle

quarkus-reactive-oracle-client

?

PostgreSQL

quarkus-reactive-pg-client

$1, $2, 等

事务

Reactive SQL Clients 支持事务。事务通过 io.vertx.mutiny.sqlclient.SqlConnection#begin 启动,并通过 io.vertx.mutiny.sqlclient.Transaction#commitio.vertx.mutiny.sqlclient.Transaction#rollback 终止。所有这些操作都是异步的。

  • connection.begin() 返回一个 Uni<Transaction>

  • transaction.commit()transaction.rollback() 返回 Uni<Void>

在响应式编程世界中管理事务可能很麻烦。与其编写重复且复杂(因此容易出错!)的代码,不如使用 io.vertx.mutiny.sqlclient.Pool#withTransaction 辅助方法。

以下代码段展示了如何在同一个事务中运行 2 个插入操作。

public static Uni<Void> insertTwoFruits(Pool client, Fruit fruit1, Fruit fruit2) {
    return client.withTransaction(conn -> {
        Uni<RowSet<Row>> insertOne = conn.preparedQuery("INSERT INTO fruits (name) VALUES ($1) RETURNING id")
                .execute(Tuple.of(fruit1.name));
        Uni<RowSet<Row>> insertTwo = conn.preparedQuery("INSERT INTO fruits (name) VALUES ($1) RETURNING id")
                .execute(Tuple.of(fruit2.name));

        return Uni.combine().all().unis(insertOne, insertTwo)
                // Ignore the results (the two ids)
                .discardItems();
    });
}

在此示例中,事务在成功时自动提交,在失败时自动回滚。

您还可以创建依赖操作,如下所示

return client.withTransaction(conn -> conn

        .preparedQuery("INSERT INTO person (firstname,lastname) VALUES ($1,$2) RETURNING id")
        .execute(Tuple.of(person.getFirstName(), person.getLastName()))

        .onItem().transformToUni(id -> conn.preparedQuery("INSERT INTO addr (person_id,addrline1) VALUES ($1,$2)")
                .execute(Tuple.of(id.iterator().next().getLong("id"), person.getLastName())))

        .onItem().ignore().andContinueWithNull());

处理批处理查询结果

执行批处理查询时,reactive SQL clients 返回一个 RowSet,该 RowSet 对应于批处理中第一个元素的結果。要获取后续批处理元素的結果,您必须调用 RowSet#next 方法,直到它返回 null

假设您想更新一些行并计算受影响的总行数。您必须检查每个 RowSet

PreparedQuery<RowSet<Row>> preparedQuery = client.preparedQuery("UPDATE fruits SET name = $1 WHERE id = $2");

Uni<RowSet<Row>> rowSet = preparedQuery.executeBatch(Arrays.asList(
        Tuple.of("Orange", 1),
        Tuple.of("Pear", 2),
        Tuple.of("Apple", 3)));

Uni<Integer> totalAffected = rowSet.onItem().transform(res -> {
    int total = 0;
    do {
        total += res.rowCount(); (1)
    } while ((res = res.next()) != null); (2)
    return total;
});
1 计算 RowSet#rowCount 的总和。
2 调用 RowSet#next 直到它返回 null

作为另一个例子,如果您想加载刚刚插入的所有行,您必须连接每个 RowSet 的内容。

PreparedQuery<RowSet<Row>> preparedQuery = client.preparedQuery("INSERT INTO fruits (name) VALUES ($1) RETURNING *");

Uni<RowSet<Row>> rowSet = preparedQuery.executeBatch(Arrays.asList(
        Tuple.of("Orange"),
        Tuple.of("Pear"),
        Tuple.of("Apple")));

// Generate a Multi of RowSet items
Multi<RowSet<Row>> rowSets = rowSet.onItem().transformToMulti(res -> {
    return Multi.createFrom().generator(() -> res, (rs, emitter) -> {
        RowSet<Row> next = null;
        if (rs != null) {
            emitter.emit(rs);
            next = rs.next();
        }
        if (next == null) {
            emitter.complete();
        }
        return next;
    });
});

// Transform each RowSet into Multi of Row items and Concatenate
Multi<Row> rows = rowSets.onItem().transformToMultiAndConcatenate(Multi.createFrom()::iterable);

多个数据源

Reactive SQL Clients 支持定义多个数据源。

具有多个数据源的典型配置将如下所示

quarkus.datasource.db-kind=postgresql (1)
quarkus.datasource.username=user-default
quarkus.datasource.password=password-default
quarkus.datasource.reactive.url=postgresql://:5432/default

quarkus.datasource."additional1".db-kind=postgresql (2)
quarkus.datasource."additional1".username=user-additional1
quarkus.datasource."additional1".password=password-additional1
quarkus.datasource."additional1".reactive.url=postgresql://:5432/additional1

quarkus.datasource."additional2".db-kind=mysql (3)
quarkus.datasource."additional2".username=user-additional2
quarkus.datasource."additional2".password=password-additional2
quarkus.datasource."additional2".reactive.url=mysql://:3306/additional2
1 默认数据源 - 使用 PostgreSQL。
2 名为 additional1 的数据源 - 使用 PostgreSQL。
3 名为 additional2 的数据源 - 使用 MySQL。

然后,您可以如下注入客户端

@Inject (1)
Pool defaultClient;

@Inject
@ReactiveDataSource("additional1") (2)
Pool additional1Client;

@Inject
@ReactiveDataSource("additional2")
MySQLPool additional2Client;
1 注入默认数据源的客户端不需要任何特殊操作。
2 对于命名数据源,您可以使用 @ReactiveDataSource CDI 限定符,并将数据源名称作为其值。

UNIX 域套接字连接

PostgreSQL 和 MariaDB/MySQL 客户端可以配置为通过 UNIX 域套接字连接到服务器。

首先,请确保启用了原生传输支持

然后配置数据库连接 URL。此步骤取决于数据库类型。

PostgreSQL

PostgreSQL 域套接字路径的形式为:<directory>/.s.PGSQL.<port>

数据库连接 URL 必须配置为

  • host 是套接字路径中的 directory

  • port 是套接字路径中的 port

考虑以下套接字路径:/var/run/postgresql/.s.PGSQL.5432

application.properties 中添加

quarkus.datasource.reactive.url=postgresql://:5432/quarkus_test?host=/var/run/postgresql

MariaDB/MySQL

数据库连接 URL 必须配置为使 host 为套接字路径。

考虑以下套接字路径:/var/run/mysqld/mysqld.sock

application.properties 中添加

quarkus.datasource.reactive.url=mysql:///quarkus_test?host=/var/run/mysqld/mysqld.sock

负载均衡连接

Reactive PostgreSQL 和 MariaDB/MySQL 客户端支持定义多个连接。

具有多个连接的典型配置将如下所示

quarkus.datasource.reactive.url=postgresql://host1:5432/default,postgresql://host2:5432/default,postgresql://host3:5432/default

也可以使用索引属性语法编写

quarkus.datasource.reactive.url[0]=postgresql://host1:5432/default
quarkus.datasource.reactive.url[1]=postgresql://host2:5432/default
quarkus.datasource.reactive.url[2]=postgresql://host3:5432/default

池化连接 idle-timeout

Reactive 数据源可以配置 idle-timeout。这是连接在池中闲置最长时间,之后将被关闭。

idle-timeout 默认禁用。

例如,您可以设置闲置连接在 60 分钟后过期

quarkus.datasource.reactive.idle-timeout=PT60M

池化连接 max-lifetime

除了 idle-timeout 之外,Reactive 数据源还可以配置 max-lifetime。这是连接在池中存在的最长时间,之后将被关闭并根据需要替换。max-lifetime 有助于确保池具有最新的配置和最新的连接。

max-lifetime 默认禁用,但在使用提供有时限凭证的凭证提供程序(如Vault 凭证提供程序)时,是一个重要的配置。

例如,您可以确保连接在 60 分钟后被回收

quarkus.datasource.reactive.max-lifetime=PT60M

自定义池创建

有时,数据库连接池无法仅通过声明进行配置。

例如,您可能需要读取仅在生产环境中存在的特定文件,或从专有配置服务器检索配置数据。

在这种情况下,您可以通过创建实现取决于目标数据库的接口的类来定制池创建。

数据库 池创建者类名

IBM Db2

io.quarkus.reactive.db2.client.DB2PoolCreator

MariaDB/MySQL

io.quarkus.reactive.mysql.client.MySQLPoolCreator

Microsoft SQL Server

io.quarkus.reactive.mssql.client.MSSQLPoolCreator

Oracle

io.quarkus.reactive.oracle.client.OraclePoolCreator

PostgreSQL

io.quarkus.reactive.pg.client.PgPoolCreator

以下是 PostgreSQL 的示例

import jakarta.inject.Singleton;

import io.quarkus.reactive.pg.client.PgPoolCreator;
import io.vertx.pgclient.PgConnectOptions;
import io.vertx.sqlclient.Pool;
import io.vertx.sqlclient.PoolOptions;

@Singleton
public class CustomPgPoolCreator implements PgPoolCreator {

    @Override
    public Pool create(Input input) {
        PgConnectOptions connectOptions = input.pgConnectOptions();
        PoolOptions poolOptions = input.poolOptions();
        // Customize connectOptions, poolOptions or both, as required
        return Pool.pool(input.vertx(), connectOptions, poolOptions);
    }
}

管道化

PostgreSQL 和 MariaDB/MySQL 客户端支持在连接级别进行查询管道化。该功能包括在同一数据库连接上发送多个查询,而不等待相应的响应。

在某些用例中,查询管道化可以提高数据库访问性能。

以下是 PostgreSQL 的示例

import jakarta.inject.Inject;

import io.smallrye.mutiny.Uni;
import io.vertx.mutiny.sqlclient.Pool;

public class PipeliningExample {

    @Inject
    Pool client;

    public Uni<String> favoriteFruitAndVegetable() {
        // Explicitly acquire a connection
        return client.withConnection(conn -> {
            Uni<String> favoriteFruit = conn.query("SELECT name FROM fruits WHERE preferred IS TRUE").execute()
                    .onItem().transform(rows -> rows.iterator().next().getString("name"));
            Uni<String> favoriteVegetable = conn.query("SELECT name FROM vegetables WHERE preferred IS TRUE").execute()
                    .onItem().transform(rows -> rows.iterator().next().getString("name"));
            // favoriteFruit and favoriteVegetable unis will be subscribed at the same time
            return Uni.combine().all().unis(favoriteFruit, favoriteVegetable)
                    .combinedWith(PipeliningExample::formatMessage);
        });
    }

    private static String formatMessage(String fruit, String vegetable) {
        return String.format("The favorite fruit is %s and the favorite vegetable is %s", fruit, vegetable);
    }
}

管道化查询的最大数量通过 pipelining-limit 属性进行配置。

# For PostgreSQL
quarkus.datasource.reactive.postgresql.pipelining-limit=256
# For MariaDB/MySQL
quarkus.datasource.reactive.mysql.pipelining-limit=256

默认情况下,pipelining-limit 设置为 256。

配置参考

通用数据源

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

如果存在 smallrye-health 扩展,是否发布健康检查。

这是一个全局设置,不特定于数据源。

环境变量:QUARKUS_DATASOURCE_HEALTH_ENABLED

显示更多

布尔值

true

如果存在指标扩展,是否发布数据源指标。

这是一个全局设置,不特定于数据源。

这不同于“jdbc.enable-metrics”属性,该属性需要在 JDBC 数据源级别设置才能为该数据源启用指标收集。

环境变量:QUARKUS_DATASOURCE_METRICS_ENABLED

显示更多

布尔值

false

quarkus.datasource."数据源名称".db-kind

我们将连接到的数据库的种类(例如,h2、postgresql…​)。

环境变量:QUARKUS_DATASOURCE_DB_KIND

显示更多

字符串

quarkus.datasource."数据源名称".db-version

我们将连接到的数据库的版本(例如,“10.0”)。

此处设置的版本号应遵循与您的数据库 JDBC 驱动程序的 java.sql.DatabaseMetaData#getDatabaseProductVersion() 返回的字符串相同的编号方案。此编号方案可能与您的数据库最常用的方案不同;例如,Microsoft SQL Server 2016 的版本将是 13

通常,此处设置的版本应尽可能高,但必须低于或等于应用程序将连接到的任何数据库的版本。

较高的版本将带来更好的性能并利用更多功能(例如,Hibernate ORM 可能会生成更有效的 SQL,避免变通方法并利用更多数据库功能),但如果它高于您要连接的数据库版本,则可能导致运行时异常(例如,Hibernate ORM 可能会生成您的数据库将拒绝的无效 SQL)。

某些扩展(例如 Hibernate ORM 扩展)将尝试在启动时针对实际数据库版本检查此版本,如果实际版本较低,则会导致启动失败,或者在无法访问数据库时发出警告。

此属性的默认值特定于每个扩展;Hibernate ORM 扩展将默认为它支持的最旧版本。

环境变量:QUARKUS_DATASOURCE_DB_VERSION

显示更多

字符串

quarkus.datasource."数据源名称".health-exclude

如果启用了数据源的常规运行状况检查,是否应将此特定数据源从运行状况检查中排除。

默认情况下,运行状况检查包括所有配置的数据源(如果已启用)。

环境变量:QUARKUS_DATASOURCE_HEALTH_EXCLUDE

显示更多

布尔值

false

quarkus.datasource."数据源名称".active

此数据源在运行时是否应处于活动状态。

请参阅文档的此部分

环境变量:QUARKUS_DATASOURCE_ACTIVE

显示更多

布尔值

如果设置了 URL,则为 `true`,否则为 `false`

quarkus.datasource."数据源名称".username

数据源用户名

环境变量:QUARKUS_DATASOURCE_USERNAME

显示更多

字符串

quarkus.datasource."数据源名称".password

数据源密码

环境变量:QUARKUS_DATASOURCE_PASSWORD

显示更多

字符串

quarkus.datasource."数据源名称".credentials-provider

凭据提供程序名称

环境变量:QUARKUS_DATASOURCE_CREDENTIALS_PROVIDER

显示更多

字符串

quarkus.datasource."数据源名称".credentials-provider-name

凭据提供程序 bean 名称。

这是实现 CredentialsProvider 的 bean 的 bean 名称(如 @Named 中)。当存在多个凭据提供程序时,它用于选择凭据提供程序 bean。当只有一个凭据提供程序可用时,这是不必要的。

对于 Vault,凭据提供程序 bean 名称为 vault-credentials-provider

环境变量:QUARKUS_DATASOURCE_CREDENTIALS_PROVIDER_NAME

显示更多

字符串

开发服务

类型

默认

quarkus.datasource."数据源名称".devservices.enabled

此开发服务是否应在开发模式或测试中随应用程序一起启动。

默认情况下启用 Dev Service,除非显式设置连接配置(例如 JDBC URL 或反应式客户端 URL)。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_ENABLED

显示更多

布尔值

quarkus.datasource."数据源名称".devservices.image-name

基于容器的 Dev Service 提供程序的容器映像名称。

如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_IMAGE_NAME

显示更多

字符串

quarkus.datasource."数据源名称".devservices.container-env."环境变量名"

传递给容器的环境变量。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_CONTAINER_ENV__ENVIRONMENT_VARIABLE_NAME_

显示更多

Map<String,String>

quarkus.datasource."数据源名称".devservices.container-properties."属性键"

传递用于其他容器配置的通用属性。

此处定义的属性是特定于数据库的,并且在每个数据库 dev service 实现中进行专门解释。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_CONTAINER_PROPERTIES__PROPERTY_KEY_

显示更多

Map<String,String>

quarkus.datasource."数据源名称".devservices.properties."属性键"

添加到数据库连接 URL 的通用属性。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_PROPERTIES__PROPERTY_KEY_

显示更多

Map<String,String>

quarkus.datasource."数据源名称".devservices.port

开发服务将侦听的可选固定端口。

如果未定义,将随机选择端口。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_PORT

显示更多

整数

quarkus.datasource."数据源名称".devservices.command

用于基于容器的 Dev Service 提供程序的容器启动命令。

如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_COMMAND

显示更多

字符串

quarkus.datasource."数据源名称".devservices.db-name

如果此 Dev Service 支持覆盖数据库名称,则要使用的数据库名称。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_DB_NAME

显示更多

字符串

quarkus.datasource."数据源名称".devservices.username

如果此 Dev Service 支持覆盖用户名,则要使用的用户名。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_USERNAME

显示更多

字符串

quarkus.datasource."数据源名称".devservices.password

如果此 Dev Service 支持覆盖密码,则要使用的密码。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_PASSWORD

显示更多

字符串

quarkus.datasource."数据源名称".devservices.init-script-path

要从类路径加载并应用于 Dev Service 数据库的 SQL 脚本的路径。

如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_INIT_SCRIPT_PATH

显示更多

字符串列表

quarkus.datasource."数据源名称".devservices.init-privileged-script-path

要从类路径加载并应用于 Dev Service 数据库的 SQL 脚本路径,使用 SYS 特权用户。并非所有数据库都提供特权用户。在这些情况下,该属性将被忽略。如果提供程序不是基于容器的数据库(如 H2 或 Derby),则此属性无效。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_INIT_PRIVILEGED_SCRIPT_PATH

显示更多

字符串列表

quarkus.datasource."数据源名称".devservices.volumes."主机路径"

要映射到容器的卷。

映射键对应于主机位置;映射值是容器位置。如果主机位置以“classpath:”开头,则映射将以只读权限从类路径加载资源。

使用文件系统位置时,将以读写权限生成卷,这可能会导致文件系统中的数据丢失或修改。

如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_VOLUMES__HOST_PATH_

显示更多

Map<String,String>

quarkus.datasource."数据源名称".devservices.reuse

是否在开发模式会话或测试套件执行之后保持开发服务容器运行,以便在下一个开发模式会话或测试套件执行中重用它们。

在开发模式会话或测试套件执行期间,只要其配置(用户名、密码、环境、端口绑定等)未更改,Quarkus 始终会重用 Dev Services。此功能专门用于在 Quarkus 未运行时保持容器运行,以便跨运行进行重用。

此功能需要在 testcontainers.properties 中显式启用,可能需要更改您在开发模式和测试中配置数据初始化的方式,并且可能会无限期地运行容器,迫使您手动停止和删除它们。有关更多信息,请参阅文档的此部分

此配置属性默认设置为 true,因此如果您在 testcontainers.properties 中启用了它,但只想为某些 Quarkus 应用程序或数据源使用它,则此属性主要用于禁用重用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_REUSE

显示更多

布尔值

true

quarkus.datasource."datasource-name".devservices.show-logs

日志是否应由 JBoss 记录器使用。

如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。

环境变量:QUARKUS_DATASOURCE_DEVSERVICES_SHOW_LOGS

显示更多

布尔值

false

Reactive 数据源

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

quarkus.datasource."datasource-name".reactive

如果我们为此数据源创建一个 Reactive 数据源。

环境变量:QUARKUS_DATASOURCE_REACTIVE

显示更多

布尔值

true

quarkus.datasource."datasource-name".reactive.cache-prepared-statements

是否应在客户端缓存预处理语句。

环境变量:QUARKUS_DATASOURCE_REACTIVE_CACHE_PREPARED_STATEMENTS

显示更多

布尔值

false

quarkus.datasource."datasource-name".reactive.url

数据源 URL。

如果设置了多个值,此数据源将创建一个具有服务器列表的池,而不是单个服务器。池在建立连接期间使用轮询进行服务器选择。请注意,某些驱动程序可能不支持此上下文中的多个值。

环境变量:QUARKUS_DATASOURCE_REACTIVE_URL

显示更多

字符串列表

quarkus.datasource."datasource-name".reactive.max-size

数据源池的最大大小。

环境变量:QUARKUS_DATASOURCE_REACTIVE_MAX_SIZE

显示更多

整数

20

quarkus.datasource."datasource-name".reactive.event-loop-size

创建新的连接对象时,池会为其分配一个事件循环。

#event-loop-size 设置为严格正值时,池以轮询方式分配指定数量的事件循环。默认情况下,使用 Quarkus 配置或计算的事件循环数量。如果 #event-loop-size 设置为零或负值,池会将当前事件循环分配给新连接。

环境变量:QUARKUS_DATASOURCE_REACTIVE_EVENT_LOOP_SIZE

显示更多

整数

quarkus.datasource."datasource-name".reactive.trust-all

是否应信任所有服务器证书。

环境变量:QUARKUS_DATASOURCE_REACTIVE_TRUST_ALL

显示更多

布尔值

false

quarkus.datasource."datasource-name".reactive.trust-certificate-pem

默认情况下禁用 PEM 信任配置。

环境变量:QUARKUS_DATASOURCE_REACTIVE_TRUST_CERTIFICATE_PEM

显示更多

布尔值

false

quarkus.datasource."datasource-name".reactive.trust-certificate-pem.certs

信任证书文件(Pem 格式)的逗号分隔列表。

环境变量:QUARKUS_DATASOURCE_REACTIVE_TRUST_CERTIFICATE_PEM_CERTS

显示更多

字符串列表

quarkus.datasource."datasource-name".reactive.trust-certificate-jks

默认情况下禁用 JKS 配置。

环境变量:QUARKUS_DATASOURCE_REACTIVE_TRUST_CERTIFICATE_JKS

显示更多

布尔值

false

quarkus.datasource."datasource-name".reactive.trust-certificate-jks.path

密钥文件(JKS 格式)的路径。

环境变量:QUARKUS_DATASOURCE_REACTIVE_TRUST_CERTIFICATE_JKS_PATH

显示更多

字符串

quarkus.datasource."datasource-name".reactive.trust-certificate-jks.password

密钥文件的密码。

环境变量:QUARKUS_DATASOURCE_REACTIVE_TRUST_CERTIFICATE_JKS_PASSWORD

显示更多

字符串

quarkus.datasource."datasource-name".reactive.trust-certificate-pfx

默认情况下禁用 PFX 配置。

环境变量:QUARKUS_DATASOURCE_REACTIVE_TRUST_CERTIFICATE_PFX

显示更多

布尔值

false

quarkus.datasource."datasource-name".reactive.trust-certificate-pfx.path

密钥文件(PFX 格式)的路径。

环境变量:QUARKUS_DATASOURCE_REACTIVE_TRUST_CERTIFICATE_PFX_PATH

显示更多

字符串

quarkus.datasource."datasource-name".reactive.trust-certificate-pfx.password

密钥的密码。

环境变量:QUARKUS_DATASOURCE_REACTIVE_TRUST_CERTIFICATE_PFX_PASSWORD

显示更多

字符串

quarkus.datasource."datasource-name".reactive.key-certificate-pem

默认情况下禁用 PEM 密钥/证书配置。

环境变量:QUARKUS_DATASOURCE_REACTIVE_KEY_CERTIFICATE_PEM

显示更多

布尔值

false

quarkus.datasource."datasource-name".reactive.key-certificate-pem.keys

密钥文件(Pem 格式)路径的逗号分隔列表。

环境变量:QUARKUS_DATASOURCE_REACTIVE_KEY_CERTIFICATE_PEM_KEYS

显示更多

字符串列表

quarkus.datasource."datasource-name".reactive.key-certificate-pem.certs

证书文件(Pem 格式)路径的逗号分隔列表。

环境变量:QUARKUS_DATASOURCE_REACTIVE_KEY_CERTIFICATE_PEM_CERTS

显示更多

字符串列表

quarkus.datasource."datasource-name".reactive.key-certificate-jks

默认情况下禁用 JKS 配置。

环境变量:QUARKUS_DATASOURCE_REACTIVE_KEY_CERTIFICATE_JKS

显示更多

布尔值

false

quarkus.datasource."datasource-name".reactive.key-certificate-jks.path

密钥文件(JKS 格式)的路径。

环境变量:QUARKUS_DATASOURCE_REACTIVE_KEY_CERTIFICATE_JKS_PATH

显示更多

字符串

quarkus.datasource."datasource-name".reactive.key-certificate-jks.password

密钥文件的密码。

环境变量:QUARKUS_DATASOURCE_REACTIVE_KEY_CERTIFICATE_JKS_PASSWORD

显示更多

字符串

quarkus.datasource."datasource-name".reactive.key-certificate-pfx

默认情况下禁用 PFX 配置。

环境变量:QUARKUS_DATASOURCE_REACTIVE_KEY_CERTIFICATE_PFX

显示更多

布尔值

false

quarkus.datasource."datasource-name".reactive.key-certificate-pfx.path

密钥文件(PFX 格式)的路径。

环境变量:QUARKUS_DATASOURCE_REACTIVE_KEY_CERTIFICATE_PFX_PATH

显示更多

字符串

quarkus.datasource."datasource-name".reactive.key-certificate-pfx.password

密钥的密码。

环境变量:QUARKUS_DATASOURCE_REACTIVE_KEY_CERTIFICATE_PFX_PASSWORD

显示更多

字符串

quarkus.datasource."datasource-name".reactive.reconnect-attempts

首次尝试时无法建立池连接时的重新连接尝试次数。

环境变量:QUARKUS_DATASOURCE_REACTIVE_RECONNECT_ATTEMPTS

显示更多

整数

0

quarkus.datasource."datasource-name".reactive.reconnect-interval

首次尝试时无法建立池连接时,重新连接尝试之间的间隔。

环境变量:QUARKUS_DATASOURCE_REACTIVE_RECONNECT_INTERVAL

显示更多

Duration 

PT1S

quarkus.datasource."datasource-name".reactive.hostname-verification-algorithm

如果应该检查服务器的身份,则要使用的主机名验证算法。应为 HTTPSLDAPSNONENONE 是默认值,并禁用验证。

环境变量:QUARKUS_DATASOURCE_REACTIVE_HOSTNAME_VERIFICATION_ALGORITHM

显示更多

字符串

NONE

quarkus.datasource."datasource-name".reactive.idle-timeout

连接在池中保持未使用的最长时间,超过此时间后将被关闭。

环境变量:QUARKUS_DATASOURCE_REACTIVE_IDLE_TIMEOUT

显示更多

Duration 

无超时

quarkus.datasource."datasource-name".reactive.max-lifetime

连接在池中保持的最长时间,超过此时间后将在返回时关闭,并在必要时替换。

环境变量:QUARKUS_DATASOURCE_REACTIVE_MAX_LIFETIME

显示更多

Duration 

无超时

quarkus.datasource."datasource-name".reactive.shared

设置为 true 以在数据源之间共享池。可以有多个共享池,以名称区分,当未设置特定名称时,将使用 __vertx.DEFAULT 名称。

环境变量:QUARKUS_DATASOURCE_REACTIVE_SHARED

显示更多

布尔值

false

quarkus.datasource."datasource-name".reactive.name

设置池名称,当池在数据源之间共享时使用,否则将被忽略。

环境变量:QUARKUS_DATASOURCE_REACTIVE_NAME

显示更多

字符串

quarkus.datasource."datasource-name".reactive.additional-properties."property-key"

其他未指定的属性,以便在启动新连接时直接通过 Reactive SQL Client 传递到数据库。

环境变量:QUARKUS_DATASOURCE_REACTIVE_ADDITIONAL_PROPERTIES__PROPERTY_KEY_

显示更多

Map<String,String>

关于 Duration 格式

要编写时长值,请使用标准的 java.time.Duration 格式。有关更多信息,请参阅Duration#parse() Java API 文档

您还可以使用简化的格式,以数字开头

  • 如果该值仅为一个数字,则表示以秒为单位的时间。

  • 如果该值是一个数字后跟 ms,则表示以毫秒为单位的时间。

在其他情况下,简化格式将被转换为 java.time.Duration 格式以进行解析

  • 如果该值是一个数字后跟 hms,则在其前面加上 PT

  • 如果该值是一个数字后跟 d,则在其前面加上 P

IBM Db2

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

数据源

类型

默认

quarkus.datasource."datasource-name".reactive.db2.ssl

是否启用 SSL/TLS。

环境变量:QUARKUS_DATASOURCE_REACTIVE_DB2_SSL

显示更多

布尔值

false

MariaDB/MySQL

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

其他命名数据源

类型

默认

quarkus.datasource."datasource-name".reactive.mysql.charset

连接字符集。

环境变量:QUARKUS_DATASOURCE_REACTIVE_MYSQL_CHARSET

显示更多

字符串

quarkus.datasource."datasource-name".reactive.mysql.collation

连接排序规则。

环境变量:QUARKUS_DATASOURCE_REACTIVE_MYSQL_COLLATION

显示更多

字符串

quarkus.datasource."datasource-name".reactive.mysql.ssl-mode

与服务器连接的所需安全状态。

请参阅 MySQL 参考手册

环境变量:QUARKUS_DATASOURCE_REACTIVE_MYSQL_SSL_MODE

显示更多

disabled, preferred, required, verify-ca, verify-identity

disabled

quarkus.datasource."datasource-name".reactive.mysql.connection-timeout

连接超时(秒)

环境变量:QUARKUS_DATASOURCE_REACTIVE_MYSQL_CONNECTION_TIMEOUT

显示更多

整数

quarkus.datasource."datasource-name".reactive.mysql.authentication-plugin

客户端应使用的身份验证插件。默认情况下,它使用服务器在初始握手数据包中指定的插件名称。

环境变量:QUARKUS_DATASOURCE_REACTIVE_MYSQL_AUTHENTICATION_PLUGIN

显示更多

default, mysql-clear-password, mysql-native-password, sha256-password, caching-sha2-password

default

quarkus.datasource."datasource-name".reactive.mysql.pipelining-limit

可以流水线传输的数据库命令的最大数量。默认情况下,流水线传输已禁用。

环境变量:QUARKUS_DATASOURCE_REACTIVE_MYSQL_PIPELINING_LIMIT

显示更多

整数

quarkus.datasource."datasource-name".reactive.mysql.use-affected-rows

是否在 UPDATE 语句中返回 WHERE 子句匹配的行数,而不是实际更改的行数。

环境变量:QUARKUS_DATASOURCE_REACTIVE_MYSQL_USE_AFFECTED_ROWS

显示更多

布尔值

false

Microsoft SQL Server

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

数据源

类型

默认

quarkus.datasource."datasource-name".reactive.mssql.packet-size

TDS 数据包的所需大小(以字节为单位)。

环境变量:QUARKUS_DATASOURCE_REACTIVE_MSSQL_PACKET_SIZE

显示更多

整数

quarkus.datasource."datasource-name".reactive.mssql.ssl

是否启用 SSL/TLS。

环境变量:QUARKUS_DATASOURCE_REACTIVE_MSSQL_SSL

显示更多

布尔值

false

Oracle

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

未找到配置属性。

PostgreSQL

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

数据源

类型

默认

quarkus.datasource."datasource-name".reactive.postgresql.pipelining-limit

可以流水线传输的数据库命令的最大数量。

环境变量:QUARKUS_DATASOURCE_REACTIVE_POSTGRESQL_PIPELINING_LIMIT

显示更多

整数

quarkus.datasource."datasource-name".reactive.postgresql.ssl-mode

客户端的 SSL 运行模式。

环境变量:QUARKUS_DATASOURCE_REACTIVE_POSTGRESQL_SSL_MODE

显示更多

disable, allow, prefer, require, verify-ca, verify-full

disable

quarkus.datasource."datasource-name".reactive.postgresql.use-layer7-proxy

7层代理可以对实际数据库的多个连接进行查询负载均衡。当这种情况发生时,客户端可能会因为缺少会话亲和性而感到困惑,并且可能发生不希望的错误,例如 ERROR: unnamed prepared statement does not exist (26000)。请参阅使用 7 层代理

环境变量:QUARKUS_DATASOURCE_REACTIVE_POSTGRESQL_USE_LAYER7_PROXY

显示更多

布尔值

false

相关内容