首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步GORM或DataAccess和同步代码

异步GORM或DataAccess和同步代码
EN

Stack Overflow用户
提问于 2018-08-25 21:13:25
回答 3查看 834关注 0票数 3

据我所知,Micronaut受益于非阻塞i/o。在我的项目中,我需要使用MySQL作为数据存储。

我很乐意使用GORM或类似的ORM来简化访问,但他们阻止了AFAIK。

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

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

首先,我可以使用哪种对象关系映射来连接到MySQL,类似于GORM,但不阻塞。

其次,如果有一种方法,或者像Vertx一样的好处,可以执行同步代码,保持方法的大部分异步。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

票数 2
EN

Stack Overflow用户

发布于 2018-10-11 04:43:17

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

它的用法如下:

代码语言:javascript
运行
复制
CompletableFuture<QueryResult> future =             
  connection.sendPreparedStatement("select * from table");

希望这对你有所帮助,如果你需要帮助,请打开一个问题或看看维基:https://github.com/jasync-sql/jasync-sql/wiki

票数 0
EN

Stack Overflow用户

发布于 2018-11-21 16:42:18

我显式地在Schedulers.io()上调度db调用,它工作得很好:

代码语言:javascript
运行
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52017682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档