Асинхронный GORM или DataAccess и код синхронизации - PullRequest
0 голосов
/ 25 августа 2018

Как я понимаю, Micronaut выигрывает от неблокирующих операций ввода-вывода.В моем проекте мне нужно использовать MySQL в качестве хранилища данных.

Я бы хотел использовать GORM или аналогичный ORM для облегчения доступа, но они блокируют AFAIK.

Исходя из Vertx, естьexecuteBlocking для выполнения в пуле потоков блоков кода синхронизации, не блокируя основной цикл.

Поэтому у моего вопроса есть два ребра.

Во-первых, какой ORM я мог бы использовать для подключения к MySQL, аналогично GORM, но не блокирует.

И, во-вторых, если есть способ или преимущество, как в Vertx, выполнить код синхронизации, сохраняя большую часть метода асинхронным.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Вы можете попробовать использовать jasync-sql (Отказ от ответственности: я работаю над этим).Это не полноценный ORM, но он дает неблокирующим возможностям асинхронную поддержку.

Используется так:

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

Надеюсь, что поможет, если вам нужна помощь, пожалуйста, откройтевопрос или посмотрите в вики: https://github.com/jasync-sql/jasync-sql/wiki

0 голосов
/ 21 ноября 2018

Я явно планирую вызов db на 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.

0 голосов
/ 28 августа 2018

Мне не известны какие-либо неблокирующие ORM, и я не знаю, возможно ли даже технически реализовать все функции ORM в неблокирующем удалении. Возьмем, к примеру, ленивую загрузку ассоциаций, если вы получаете доступ к ассоциации, такой как book.authors, вам необходимо заблокировать выполнение запроса и загрузить ассоциацию.

Однако существуют неблокирующие драйверы SQL. Вы можете попробовать использовать драйвер Vert.x https://vertx.io/docs/vertx-mysql-postgresql-client/java/ в Micronaut

Что касается выполнения операций блокировки, у Micronaut простая стратегия. Если вы возвращаете реактивный тип, он подписывается на реактивный тип в цикле событий, если вы этого не делаете, он запускает операцию в предварительно сконфигурированном пуле потоков ввода / вывода.

Так что простой возврат List<Book> запустит операцию в пуле потоков ввода-вывода, если вы не аннотируете метод с помощью @NonBlocking

См. https://docs.micronaut.io/latest/guide/index.html#threadPools

...