异步GORM或DataAccess和同步代码

时间:2018-08-25 13:13:25

标签: micronaut

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

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

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

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

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

第二,如果有一种方法或类似Vertx的好处,可以执行同步代码,使大部分方法保持异步。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

它的用法如下:

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

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

答案 2 :(得分:0)

我正在明确安排在Schedulers.io()上的数据库调用,该调用效果很好:

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。