异步 GORM 或数据访问和同步代码
Async GORM or DataAccess and Sync code
据我了解,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/
至于 运行ning 阻塞操作,Micronaut 有一个简单的策略。如果您 return 反应类型订阅了事件循环中的反应类型,如果您不这样做,则 运行 将在预配置的 I/O 线程池上进行操作。
所以简单地 returning List<Book>
将 运行 对 I/O 线程池的操作,除非你用 @NonBlocking
注释方法
见https://docs.micronaut.io/latest/guide/index.html#threadPools
你可以尝试使用jasync-sql(免责声明:我正在努力)。它不是一个成熟的 ORM,但它提供了非阻塞功能并具有异步支持。
它是这样使用的:
CompletableFuture<QueryResult> future =
connection.sendPreparedStatement("select * from table");
希望对您有所帮助,如果您需要帮助,请提出问题或查看 wiki:https://github.com/jasync-sql/jasync-sql/wiki
我明确安排了 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。
据我了解,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/至于 运行ning 阻塞操作,Micronaut 有一个简单的策略。如果您 return 反应类型订阅了事件循环中的反应类型,如果您不这样做,则 运行 将在预配置的 I/O 线程池上进行操作。
所以简单地 returning List<Book>
将 运行 对 I/O 线程池的操作,除非你用 @NonBlocking
见https://docs.micronaut.io/latest/guide/index.html#threadPools
你可以尝试使用jasync-sql(免责声明:我正在努力)。它不是一个成熟的 ORM,但它提供了非阻塞功能并具有异步支持。
它是这样使用的:
CompletableFuture<QueryResult> future =
connection.sendPreparedStatement("select * from table");
希望对您有所帮助,如果您需要帮助,请提出问题或查看 wiki:https://github.com/jasync-sql/jasync-sql/wiki
我明确安排了 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。