据我所知,Micronaut受益于非阻塞i/o。在我的项目中,我需要使用MySQL作为数据存储。
我很乐意使用GORM或类似的ORM来简化访问,但他们阻止了AFAIK。
来自Vertx的executeBlocking
可以在线程池中执行同步代码块,而不会阻塞主循环。
所以我的问题有两个方面。
首先,我可以使用哪种对象关系映射来连接到MySQL,类似于GORM,但不阻塞。
其次,如果有一种方法,或者像Vertx一样的好处,可以执行同步代码,保持方法的大部分异步。
发布于 2018-08-28 15:03:15
我不知道是否有任何非阻塞ORM,我甚至不知道在非阻塞的情况下实现ORM的所有特性在技术上是否可行。以延迟加载关联为例,如果您访问像book.authors
这样的关联,则必须阻塞以执行查询并加载关联。
但是,也有非阻塞的SQL驱动程序。您可以尝试在Micronaut中使用Vert.x驱动程序https://vertx.io/docs/vertx-mysql-postgresql-client/java/
至于运行阻塞操作,Micronaut有一个简单的策略。如果你返回一个反应类型是订阅事件循环上的反应类型,如果你不这样做,它会在一个预先配置的I/O线程池上运行操作。
因此,除非使用@NonBlocking
注释方法,否则只需返回List<Book>
就会在I/O线程池上运行该操作
请参阅https://docs.micronaut.io/latest/guide/index.html#threadPools
发布于 2018-10-11 04:43:17
您可以尝试使用jasync-sql (免责声明:我正在处理它)。它不是一个成熟的ORM,但它为非阻塞功能提供了异步支持。
它的用法如下:
CompletableFuture<QueryResult> future =
connection.sendPreparedStatement("select * from table");
希望这对你有所帮助,如果你需要帮助,请打开一个问题或看看维基:https://github.com/jasync-sql/jasync-sql/wiki
发布于 2018-11-21 16:42:18
我显式地在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。
https://stackoverflow.com/questions/52017682
复制相似问题