3

据我了解,Micronaut 受益于非阻塞 i/o。在我的项目中,我需要使用 MySQL 作为数据存储。

我很想使用 GORM 或类似的 ORM 来轻松访问,但它们阻止了 AFAIK。

来自 Vertx,executeBlocking在线程池中执行同步代码块,同时不阻塞主循环。

所以我的问题有两个方面。

首先,我可以使用哪个 ORM 来连接 MySQL,类似于 GORM,但不是阻塞的。

其次,如果有一种方法,或者像 Vertx 那样的好处,可以执行同步代码,使大部分方法保持异步。

4

3 回答 3

2

我不知道有任何非阻塞 ORM,我也不知道在非阻塞的情况下实现 ORM 的所有功能在技术上是否可行。以延迟加载关联为例,如果您访问关联,就像book.authors您必须阻止执行查询并加载关联一样。

然而,有非阻塞 SQL 驱动程序。您可以尝试在 Micronaut 中使用 Vert.x 驱动程序https://vertx.io/docs/vertx-mysql-postgresql-client/java/

至于运行阻塞操作,Micronaut 有一个简单的策略。如果您返回反应类型,则订阅事件循环上的反应类型,如果您不这样做,它将在预配置的 I/O 线程池上运行操作。

所以简单地返回List<Book>将在 I/O 线程池上运行操作,除非你用注释方法@NonBlocking

请参阅https://docs.micronaut.io/latest/guide/index.html#threadPools

于 2018-08-28T07:03:15.040 回答
0

我明确安排了Schedulers.io()运行良好的 db 调用:

Maybe<User> get(String id) {
    return Maybe.fromCallable(() -> 
        query().select("*").where().eq("id", id)
            .findOne()
            .map(userDto -> User.from(userDto));
    })
    .subscribeOn(Schedulers.io());
}

我使用 Ebean ORM。

于 2018-11-21T08:42:18.490 回答
0

您可以尝试使用jasync-sql(免责声明:我正在研究它)。它不是一个成熟的 ORM,但它为非阻塞功能提供了异步支持。

它是这样使用的:

CompletableFuture<QueryResult> future =             
  connection.sendPreparedStatement("select * from table");

希望对您有所帮助,如果您需要帮助,请打开问题或查看 wiki:https ://github.com/jasync-sql/jasync-sql/wiki

于 2018-10-10T20:43:16.980 回答