据我了解,Micronaut 受益于非阻塞 i/o。在我的项目中,我需要使用 MySQL 作为数据存储。
我很想使用 GORM 或类似的 ORM 来轻松访问,但它们阻止了 AFAIK。
来自 Vertx,executeBlocking
在线程池中执行同步代码块,同时不阻塞主循环。
所以我的问题有两个方面。
首先,我可以使用哪个 ORM 来连接 MySQL,类似于 GORM,但不是阻塞的。
其次,如果有一种方法,或者像 Vertx 那样的好处,可以执行同步代码,使大部分方法保持异步。
据我了解,Micronaut 受益于非阻塞 i/o。在我的项目中,我需要使用 MySQL 作为数据存储。
我很想使用 GORM 或类似的 ORM 来轻松访问,但它们阻止了 AFAIK。
来自 Vertx,executeBlocking
在线程池中执行同步代码块,同时不阻塞主循环。
所以我的问题有两个方面。
首先,我可以使用哪个 ORM 来连接 MySQL,类似于 GORM,但不是阻塞的。
其次,如果有一种方法,或者像 Vertx 那样的好处,可以执行同步代码,使大部分方法保持异步。
我不知道有任何非阻塞 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
我明确安排了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。
您可以尝试使用jasync-sql(免责声明:我正在研究它)。它不是一个成熟的 ORM,但它为非阻塞功能提供了异步支持。
它是这样使用的:
CompletableFuture<QueryResult> future =
connection.sendPreparedStatement("select * from table");
希望对您有所帮助,如果您需要帮助,请打开问题或查看 wiki:https ://github.com/jasync-sql/jasync-sql/wiki