Возможен ли асинхронный вызов jdbc? - PullRequest
148 голосов
/ 03 ноября 2010

Интересно, есть ли способ сделать асинхронные вызовы в базу данных?

Например, представьте, что у меня большой запрос, который обрабатывается очень долго, я хочу отправить запроси получить уведомление, когда запрос вернет значение (путем передачи Listener / callback или чего-то еще).Я не хочу блокировать ожидание ответа базы данных.

Я не считаю, что использование пула потоков - это решение, потому что оно не масштабируется, в случае тяжелых параллельных запросов это будетпорождает очень большое количество потоков.

Мы сталкиваемся с такого рода проблемами с сетевыми серверами, и мы нашли решения с помощью системного вызова select / poll / epoll, чтобы избежать использования одного потока на соединение.Мне просто интересно, как использовать подобную функцию с запросом к базе данных?

Примечание: я знаю, что использование FixedThreadPool может быть хорошим обходным путем, но я удивлен, что никто не разработал системудействительно асинхронный (без использования дополнительных потоков).

** Обновление **
Из-за отсутствия реальных практических решений я решил сам создать библиотеку (часть finagle): надувать-MySQL .Он в основном декодирует / декодирует запрос / ответ mysql и использует Finagle / Netty под капотом.Он отлично масштабируется даже при огромном количестве соединений.

Ответы [ 17 ]

2 голосов
/ 05 августа 2011

Просто сумасшедшая идея: вы можете использовать шаблон Iteratee над JBDC resultSet, завернутый в некое Future / Promise

Hammersmith делает это для MongoDB .

2 голосов
/ 23 ноября 2017

Вот краткое описание того, как неблокирующий jdbc api может выглядеть из Oracle, представленного на JavaOne: https://static.rainfocus.com/oracle/oow16/sess/1461693351182001EmRq/ppt/CONF1578%2020160916.pdf

Таким образом, кажется, что в конечном итоге действительно асинхронные вызовы JDBC действительно будут возможны.

1 голос
/ 15 июня 2019

Разрабатывается решение для обеспечения возможности реактивного подключения со стандартными реляционными базами данных.

Люди, желающие масштабироваться, сохраняя использование реляционных баз данных отрезаны от реактивного программирования из-за существующих стандартов на основе на блокировку ввода / вывода. R2DBC определяет новый API, который позволяет реактивный код которые эффективно работают с реляционными базами данных.

R2DBC - это спецификация, разработанная с нуля для реактивных программирование с базами данных SQL, определяющими неблокирующий SPI для разработчики драйверов баз данных и авторы клиентских библиотек. Драйверы R2DBC полностью реализовать протокол проводной базы данных поверх неблокирующих Слой ввода / вывода.

Веб-сайт R2DBC

GitHub R2DBC

Функциональная матрица

enter image description here

1 голос
/ 12 апреля 2018

Если вас интересуют API-интерфейсы для асинхронных баз данных для Java, вы должны знать, что появилась новая инициатива по разработке набора стандартных API-интерфейсов на основе CompletableFuture и lambdas.Существует также реализация этих API через JDBC, которую можно использовать для практики этих API: https://github.com/oracle/oracle-db-examples/tree/master/java/AoJ JavaDoc упоминается в README проекта github.

1 голос
/ 03 ноября 2010

Я просто думаю, идеи здесь. Почему вы не можете иметь пул соединений с базой данных, каждый из которых имеет поток. Каждый поток имеет доступ к очереди. Если вы хотите выполнить запрос, который занимает много времени, вы можете поставить его в очередь, и тогда один из потоков подберет его и обработает. У вас никогда не будет слишком много потоков, потому что количество ваших потоков ограничено.

Редактировать: Или еще лучше, просто несколько потоков. Когда поток видит что-то в очереди, он запрашивает соединение из пула и обрабатывает его.

1 голос
/ 23 ноября 2011

Библиотека commons-dbutils поддерживает AsyncQueryRunner, для которого вы предоставляете ExecutorService, и возвращает Future.Стоит проверить, так как он прост в использовании и гарантирует, что вы не потеряете ресурсы.

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

Некоторым простым решением является упаковка ваших вызовов jdbs в CompletableFuture и предоставление настраиваемого пула потоков для этих вызовов

...