【问题标题】:Async GORM or DataAccess and Sync code异步 GORM 或数据访问和同步代码
【发布时间】:2018-08-25 13:13:24
【问题描述】:

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

我很想使用 GORM 或类似的 ORM 来轻松访问,但它们阻止了 AFAIK。

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

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

首先,我可以使用哪个 ORM 来连接 MySQL,类似于 GORM,但不阻塞。

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

【问题讨论】:

    标签: micronaut


    【解决方案1】:

    我不知道有任何非阻塞 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

    【讨论】:

    • 感谢您的回答。我正在考虑类似@NonBlocking 的东西(用户指南中缺少),但我想只返回 Single.just(value) 会更容易
    【解决方案2】:

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

    它是这样使用的:

    CompletableFuture<QueryResult> future =             
      connection.sendPreparedStatement("select * from table");
    

    希望对您有所帮助,如果您需要帮助,请打开问题或查看 wiki:https://github.com/jasync-sql/jasync-sql/wiki

    【讨论】:

      【解决方案3】:

      我在 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。

      【讨论】:

        猜你喜欢
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        • 1970-01-01
        • 2015-09-22
        • 1970-01-01
        相关资源
        最近更新 更多