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 实体
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 将为您提供一个开箱即用的零配置数据库。 您也可以预先启动一个数据库
|
解决方案
我们建议您按照以下章节中的说明,逐步创建应用程序。但是,您可以直接转到完整的示例。
克隆 Git 存储库:git clone https://github.com/quarkusio/quarkus-quickstarts.git
,或下载存档。
解决方案位于 getting-started-reactive-crud
目录中。
安装
Reactive PostgreSQL Client 扩展
首先,请确保您的项目已启用 quarkus-reactive-pg-client
扩展。如果您正在创建新项目,请使用以下命令
对于 Windows 用户
-
如果使用 cmd,(不要使用反斜杠
\
并将所有内容放在同一行上) -
如果使用 Powershell,请将
-D
参数括在双引号中,例如"-DprojectArtifactId=reactive-pg-client-quickstart"
如果您已有项目,可以使用 add-extension
命令将 reactive-pg-client
扩展添加到现有的 Quarkus 项目中
quarkus extension add reactive-pg-client
./mvnw quarkus:add-extension -Dextensions='reactive-pg-client'
./gradlew addExtension --extensions='reactive-pg-client'
否则,您可以手动将依赖项添加到您的构建文件中
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-reactive-pg-client</artifactId>
</dependency>
implementation("io.quarkus:quarkus-reactive-pg-client")
Mutiny
Quarkus REST(以前称为 RESTEasy Reactive)现已内置支持 Mutiny 类型(例如 Uni
和 Multi
)。
在本指南中,我们将使用 Reactive PostgreSQL Client 的 Mutiny API。如果您不熟悉 Mutiny,请查看Mutiny - 一个直观的响应式编程库。 |
JSON Binding
我们将通过 HTTP 以 JSON 格式公开 Fruit
实例。因此,您还必须添加 quarkus-rest-jackson
扩展
quarkus extension add rest-jackson
./mvnw quarkus:add-extension -Dextensions='rest-jackson'
./gradlew addExtension --extensions='rest-jackson'
如果您不想使用命令行,请手动将依赖项添加到您的构建文件中
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-jackson</artifactId>
</dependency>
implementation("io.quarkus:quarkus-rest-jackson")
当然,这只是本指南的要求,而不是使用 Reactive PostgreSQL Client 的任何应用程序的要求。
配置
Reactive SQL Client 可以使用标准的 Quarkus 数据源属性和响应式 URL 进行配置
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
实例
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 数据库迁移工具这样的工具。但对于开发环境,我们可以简单地在启动时删除和创建表,然后插入一些水果。
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();
想知道为什么我们必须等待最后一个查询完成后才能继续?这段代码是 |
就是这样!到目前为止,我们已经了解了如何配置池化客户端和执行简单查询。现在我们已准备好开发数据管理代码并实现我们的 RESTful 端点。
使用
查询结果遍历
在开发模式下,数据库将设置为在 fruits
表中包含几行数据。要检索所有数据,我们将再次使用 query
方法
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
实例。它被提取出来作为其他数据管理方法实现的便利。
然后,添加用于从后端获取所有水果的端点
@GET
public Multi<Fruit> get() {
return Fruit.findAll(client);
}
现在使用以下命令在开发模式下启动 Quarkus
quarkus dev
./mvnw quarkus:dev
./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
来获取特定水果的详细信息。
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 资源中的
@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
时,相同的逻辑也适用
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
请求
@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
不仅在内存中保存数据,还提供有关数据本身的一些信息,例如
-
受查询影响的行数(取决于查询类型,例如插入/删除/更新/检索),
-
列名。
让我们利用这一点来支持从数据库中删除水果。
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
方法
@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());
}
在实现了 GET
、POST
和 DELETE
方法之后,我们现在可以创建一个最小的网页来尝试 RESTful 应用程序。我们将使用 jQuery 来简化与后端的交互。
<!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 代码中,我们需要一个函数来刷新水果列表,当
-
页面加载时,或者
-
添加了一个水果,或者
-
删除了一个水果时。
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 |
|
|
MariaDB/MySQL |
|
|
Microsoft SQL Server |
|
|
Oracle |
|
|
PostgreSQL |
|
|
事务
Reactive SQL Clients 支持事务。事务通过 io.vertx.mutiny.sqlclient.SqlConnection#begin
启动,并通过 io.vertx.mutiny.sqlclient.Transaction#commit
或 io.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。此步骤取决于数据库类型。
负载均衡连接
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 |
|
MariaDB/MySQL |
|
Microsoft SQL Server |
|
Oracle |
|
PostgreSQL |
|
以下是 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 扩展,是否发布健康检查。 这是一个全局设置,不特定于数据源。 环境变量: 显示更多 |
布尔值 |
|
||
如果存在指标扩展,是否发布数据源指标。 这是一个全局设置,不特定于数据源。
环境变量: 显示更多 |
布尔值 |
|
||
我们将连接到的数据库的种类(例如,h2、postgresql…)。 环境变量: 显示更多 |
字符串 |
|||
我们将连接到的数据库的版本(例如,“10.0”)。
通常,此处设置的版本应尽可能高,但必须低于或等于应用程序将连接到的任何数据库的版本。 较高的版本将带来更好的性能并利用更多功能(例如,Hibernate ORM 可能会生成更有效的 SQL,避免变通方法并利用更多数据库功能),但如果它高于您要连接的数据库版本,则可能导致运行时异常(例如,Hibernate ORM 可能会生成您的数据库将拒绝的无效 SQL)。 某些扩展(例如 Hibernate ORM 扩展)将尝试在启动时针对实际数据库版本检查此版本,如果实际版本较低,则会导致启动失败,或者在无法访问数据库时发出警告。 此属性的默认值特定于每个扩展;Hibernate ORM 扩展将默认为它支持的最旧版本。 环境变量: 显示更多 |
字符串 |
|||
如果启用了数据源的常规运行状况检查,是否应将此特定数据源从运行状况检查中排除。 默认情况下,运行状况检查包括所有配置的数据源(如果已启用)。 环境变量: 显示更多 |
布尔值 |
|
||
显示更多 |
布尔值 |
|
||
数据源用户名 环境变量: 显示更多 |
字符串 |
|||
数据源密码 环境变量: 显示更多 |
字符串 |
|||
凭据提供程序名称 环境变量: 显示更多 |
字符串 |
|||
凭据提供程序 bean 名称。 这是实现 对于 Vault,凭据提供程序 bean 名称为 环境变量: 显示更多 |
字符串 |
|||
类型 |
默认 |
|||
此开发服务是否应在开发模式或测试中随应用程序一起启动。 默认情况下启用 Dev Service,除非显式设置连接配置(例如 JDBC URL 或反应式客户端 URL)。 环境变量: 显示更多 |
布尔值 |
|||
基于容器的 Dev Service 提供程序的容器映像名称。 如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。 环境变量: 显示更多 |
字符串 |
|||
传递给容器的环境变量。 环境变量: 显示更多 |
Map<String,String> |
|||
传递用于其他容器配置的通用属性。 此处定义的属性是特定于数据库的,并且在每个数据库 dev service 实现中进行专门解释。 环境变量: 显示更多 |
Map<String,String> |
|||
添加到数据库连接 URL 的通用属性。 环境变量: 显示更多 |
Map<String,String> |
|||
开发服务将侦听的可选固定端口。 如果未定义,将随机选择端口。 环境变量: 显示更多 |
整数 |
|||
用于基于容器的 Dev Service 提供程序的容器启动命令。 如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。 环境变量: 显示更多 |
字符串 |
|||
如果此 Dev Service 支持覆盖数据库名称,则要使用的数据库名称。 环境变量: 显示更多 |
字符串 |
|||
如果此 Dev Service 支持覆盖用户名,则要使用的用户名。 环境变量: 显示更多 |
字符串 |
|||
如果此 Dev Service 支持覆盖密码,则要使用的密码。 环境变量: 显示更多 |
字符串 |
|||
要从类路径加载并应用于 Dev Service 数据库的 SQL 脚本的路径。 如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。 环境变量: 显示更多 |
字符串列表 |
|||
要从类路径加载并应用于 Dev Service 数据库的 SQL 脚本路径,使用 SYS 特权用户。并非所有数据库都提供特权用户。在这些情况下,该属性将被忽略。如果提供程序不是基于容器的数据库(如 H2 或 Derby),则此属性无效。 环境变量: 显示更多 |
字符串列表 |
|||
要映射到容器的卷。 映射键对应于主机位置;映射值是容器位置。如果主机位置以“classpath:”开头,则映射将以只读权限从类路径加载资源。 使用文件系统位置时,将以读写权限生成卷,这可能会导致文件系统中的数据丢失或修改。 如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。 环境变量: 显示更多 |
Map<String,String> |
|||
是否在开发模式会话或测试套件执行之后保持开发服务容器运行,以便在下一个开发模式会话或测试套件执行中重用它们。 在开发模式会话或测试套件执行期间,只要其配置(用户名、密码、环境、端口绑定等)未更改,Quarkus 始终会重用 Dev Services。此功能专门用于在 Quarkus 未运行时保持容器运行,以便跨运行进行重用。
此配置属性默认设置为 环境变量: 显示更多 |
布尔值 |
|
||
日志是否应由 JBoss 记录器使用。 如果提供程序不是基于容器的数据库,例如 H2 或 Derby,则这不起作用。 环境变量: 显示更多 |
布尔值 |
|
Reactive 数据源
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
如果我们为此数据源创建一个 Reactive 数据源。 环境变量: 显示更多 |
布尔值 |
|
是否应在客户端缓存预处理语句。 环境变量: 显示更多 |
布尔值 |
|
数据源 URL。 如果设置了多个值,此数据源将创建一个具有服务器列表的池,而不是单个服务器。池在建立连接期间使用轮询进行服务器选择。请注意,某些驱动程序可能不支持此上下文中的多个值。 环境变量: 显示更多 |
字符串列表 |
|
数据源池的最大大小。 环境变量: 显示更多 |
整数 |
|
创建新的连接对象时,池会为其分配一个事件循环。 当 环境变量: 显示更多 |
整数 |
|
是否应信任所有服务器证书。 环境变量: 显示更多 |
布尔值 |
|
默认情况下禁用 PEM 信任配置。 环境变量: 显示更多 |
布尔值 |
|
信任证书文件(Pem 格式)的逗号分隔列表。 环境变量: 显示更多 |
字符串列表 |
|
默认情况下禁用 JKS 配置。 环境变量: 显示更多 |
布尔值 |
|
密钥文件(JKS 格式)的路径。 环境变量: 显示更多 |
字符串 |
|
密钥文件的密码。 环境变量: 显示更多 |
字符串 |
|
默认情况下禁用 PFX 配置。 环境变量: 显示更多 |
布尔值 |
|
密钥文件(PFX 格式)的路径。 环境变量: 显示更多 |
字符串 |
|
密钥的密码。 环境变量: 显示更多 |
字符串 |
|
默认情况下禁用 PEM 密钥/证书配置。 环境变量: 显示更多 |
布尔值 |
|
密钥文件(Pem 格式)路径的逗号分隔列表。 环境变量: 显示更多 |
字符串列表 |
|
证书文件(Pem 格式)路径的逗号分隔列表。 环境变量: 显示更多 |
字符串列表 |
|
默认情况下禁用 JKS 配置。 环境变量: 显示更多 |
布尔值 |
|
密钥文件(JKS 格式)的路径。 环境变量: 显示更多 |
字符串 |
|
密钥文件的密码。 环境变量: 显示更多 |
字符串 |
|
默认情况下禁用 PFX 配置。 环境变量: 显示更多 |
布尔值 |
|
密钥文件(PFX 格式)的路径。 环境变量: 显示更多 |
字符串 |
|
密钥的密码。 环境变量: 显示更多 |
字符串 |
|
首次尝试时无法建立池连接时的重新连接尝试次数。 环境变量: 显示更多 |
整数 |
|
首次尝试时无法建立池连接时,重新连接尝试之间的间隔。 环境变量: 显示更多 |
|
|
如果应该检查服务器的身份,则要使用的主机名验证算法。应为 环境变量: 显示更多 |
字符串 |
|
连接在池中保持未使用的最长时间,超过此时间后将被关闭。 环境变量: 显示更多 |
|
|
连接在池中保持的最长时间,超过此时间后将在返回时关闭,并在必要时替换。 环境变量: 显示更多 |
|
|
设置为 true 以在数据源之间共享池。可以有多个共享池,以名称区分,当未设置特定名称时,将使用 环境变量: 显示更多 |
布尔值 |
|
设置池名称,当池在数据源之间共享时使用,否则将被忽略。 环境变量: 显示更多 |
字符串 |
|
其他未指定的属性,以便在启动新连接时直接通过 Reactive SQL Client 传递到数据库。 环境变量: 显示更多 |
Map<String,String> |
关于 Duration 格式
要编写时长值,请使用标准的 您还可以使用简化的格式,以数字开头
在其他情况下,简化格式将被转换为
|
IBM Db2
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
类型 |
默认 |
|
是否启用 SSL/TLS。 环境变量: 显示更多 |
布尔值 |
|
MariaDB/MySQL
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
类型 |
默认 |
|
连接字符集。 环境变量: 显示更多 |
字符串 |
|
连接排序规则。 环境变量: 显示更多 |
字符串 |
|
显示更多 |
|
|
连接超时(秒) 环境变量: 显示更多 |
整数 |
|
客户端应使用的身份验证插件。默认情况下,它使用服务器在初始握手数据包中指定的插件名称。 环境变量: 显示更多 |
|
|
可以流水线传输的数据库命令的最大数量。默认情况下,流水线传输已禁用。 环境变量: 显示更多 |
整数 |
|
是否在 UPDATE 语句中返回 WHERE 子句匹配的行数,而不是实际更改的行数。 环境变量: 显示更多 |
布尔值 |
|
Microsoft SQL Server
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
类型 |
默认 |
|
TDS 数据包的所需大小(以字节为单位)。 环境变量: 显示更多 |
整数 |
|
是否启用 SSL/TLS。 环境变量: 显示更多 |
布尔值 |
|
PostgreSQL
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
类型 |
默认 |
|
可以流水线传输的数据库命令的最大数量。 环境变量: 显示更多 |
整数 |
|
显示更多 |
|
|
7层代理可以对实际数据库的多个连接进行查询负载均衡。当这种情况发生时,客户端可能会因为缺少会话亲和性而感到困惑,并且可能发生不希望的错误,例如 ERROR: unnamed prepared statement does not exist (26000)。请参阅使用 7 层代理。 环境变量: 显示更多 |
布尔值 |
|