vertx 和传统 jdbc 客户端可以在 quarkus 中协同工作吗?

Can vertx and traditional jdbc clients work together in quarkus?

在我的quarkus项目中,我添加了以下依赖来创建一个非阻塞的异步项目

    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-vertx</artifactId>
    </dependency>
    <dependency>
        <groupId>io.smallrye.reactive</groupId>
        <artifactId>smallrye-mutiny-vertx-web-client</artifactId>
    </dependency>

但是现在想往mysql数据库写入数据,所以想在项目中添加如下依赖

         <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-orm-panache</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-jdbc-mysql</artifactId>
        </dependency>

但是好像这个数据库驱动和orm是阻塞的,所以我想问的是,does vert.x work with traditional jdbc in quarkus?

另外一个问题是,quarkus 框架是异步非阻塞框架吗?它与vert.x有什么关系? qurakus框架添加vert.x依赖时,整个项目是否需要非阻塞

Quarkus 可以是反应式的也可以是非反应式的,这取决于您选择使用哪个扩展。

Hibernate ORM Panache 适用于您希望使用 Hibernate ORM 和 Panache 以非反应性方式访问数据库的情况。 JDBC 也是如此,它不是反应式的,所以如果你想让你的整个应用程序都是反应式的,你必须使用其他东西。

在这种情况下,您可能想尝试这两个扩展:

在 Quarkus 网站上,还有一个 intro on reactive for Quarkus

指南中 how to use the Vert.x SQL client 的示例:

@Path("fruits")
public class FruitResource {

    @Inject
    io.vertx.mutiny.mysqlclient.MySQLPool client;
}

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 ('Orange')").execute())
    .flatMap(r -> client.query("INSERT INTO fruits (name) VALUES ('Pear')").execute())
    .flatMap(r -> client.query("INSERT INTO fruits (name) VALUES ('Apple')").execute())
    .await().indefinitely();

使用 Hibernate Reactive 和 Panache 的示例 from the quickstart

@Entity
public class Fruit extends PanacheEntity {

    @Column(length = 40, unique = true)
    public String name;

    public Fruit() {
    }

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

@GET
public Uni<List<Fruit>> get() {
    return Fruit.listAll(Sort.by("name"));
}

quickstarts for Quarkus 的完整列表可在 GitHub 上找到。 寻找带有单词 reactive 的那些,您将有几个具有不同扩展名的示例。

总而言之,一种方法是用以下内容替换 Hibernate ORM 和 JDBC 扩展:

         <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-reactive-panache</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-reactive-mysql-client</artifactId>
        </dependency>

回答您的问题:

is the quarkus framework an asynchronous, non-blocking framework? What is its relationship to vert.x?

Quarkus 旨在与流行的 Java 标准、框架和库一起使用。因此,它是否具有反应性取决于您选择的扩展以及您如何设计应用程序。 Vert.x 是您可以使用的工具之一(参见 What's Quakrkus?

When the quarkus framework Added vert.x dependency, did the whole project require non-blocking?

没有。例如,您可以在类路径上同时拥有 JDBC 驱动程序和 Vert.x SQL 客户端扩展,并在需要使用它们时通过注入获取其中之一。