vertx 和传统的 jdbc 客户端可以在 quarkus 中一起工作吗?

时间:2021-04-01 09:23:48

标签: 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是阻塞的,所以我想问的是,在quarkus中vert.x可以和传统的jdbc一起使用吗

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

1 个答案:

答案 0 :(得分:0)

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"));
}

GitHub 上提供了完整的 quickstarts for Quarkus 列表。 查找带有 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>

回答您的问题:

<块引用>

quarkus 框架是一个异步的、非阻塞的框架吗?它与 vert.x 有什么关系?

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

<块引用>

quarkus框架添加vert.x依赖时,整个项目是否需要非阻塞?

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