据我了解,Micronaut受益于非阻塞I / O。在我的项目中,我需要使用MySQL作为数据存储。
我很想使用GORM或类似的ORM来简化访问,但是它们阻止了AFAIK。
来自Vertx,在同步代码的线程池块中有executeBlocking
要执行,而不会阻塞主循环。
所以我的问题有两个方面。
首先,我可以使用哪个ORM连接到MySQL,类似于GORM,但不阻塞。
第二,如果有一种方法或类似Vertx的好处,可以执行同步代码,使大部分方法保持异步。
答案 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。