Задний план

Это серия из трех частей

  1. Часть первая - нажмите на ссылку
  2. Часть вторая - эта страница
  3. Часть третья - обновление от начала 2021 года

В первой части мы рассмотрели неблокирующие звонки и системы на основе событий.

Разделы на этой странице

  1. Мы постараемся понять Java NIO на высоком уровне
  2. Мы объясним важность курсоров / соединений в базе данных.
  3. Мы сделаем аргумент в пользу неблокирования JDBC

Java IO NIO и NIO2

Ключевые аспекты

  1. У Java IO был поток на соединение для каждой модели соединения, не очень масштабируемый
  2. Java NIO появился в Java 4. Он представил концепцию селекторов и буферов, которая изменила модель на один поток, способный обрабатывать множество соединений. Более масштабируемый, чем Java IO, с меньшим количеством потоков
  3. Java NIO2 появилась в Java 7. Теперь у нас есть такие аспекты, как «Обработчики завершения», которые являются хорошим способом выполнять асинхронные неблокирующие операции.

Вывод

Java давно думала об асинхронных неблокирующих операциях (начиная с Java4)

Однако в отношении JDBC долгое время существовал миф.

«Поскольку JDBC - это ACID, у нас не может быть асинхронного неблокирующего JDBC»

Дальнейшее чтение

См. Приложение-1 для Java IO и Java NIO.

См. Приложение-2 для Java NIO2 с обработчиками завершения.

См. Приложение-3 для ACID.

Курсоры базы данных / Подключения

Подключения и пулы JDBC

Когда в Java появился стандарт JDBC, мы быстро поняли, как создавать соединения JDBC и закрывать их, поскольку каждая операция была дорогостоящей и отнимала много времени.

Так появилась концепция пулов соединений JDBC. Большинство серверов Java теперь поставляются с пулами соединений JDBC в качестве стандартной установки.

См. Приложение-4, чтобы узнать больше об этом.

Ресурсы на стороне сервера базы данных на подключение

Каждое соединение представляет определенные процессы, память и другие ресурсы на стороне базы данных.

Я имею в виду, что соединение JDBC стоит некоторых ресурсов (денег) на стороне сервера.

В базе данных Oracle они называются курсорами. Прочтите об этом в Приложении-5.

Это не бесконечные ресурсы, и у нас могут закончиться курсоры. Прочтите об этом в Приложении-6.

Кошмар администратора базы данных

Гипотетический сценарий

У нас есть разработчики, которые пишут приложение JDBC. Все отлично работает в разработке.

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

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

См. Приложение-7 для красивой симуляции теста производительности в реальном мире.

Похожая проблема с блокировкой ввода-вывода?

Так есть ли аналогичная проблема с блокировкой ввода-вывода? Мы создали NIO и NIO2, чтобы не блокировать потоки и, следовательно, уменьшить количество используемых ресурсов? Да, были, и некоторые из них были еще в Java 4.

Неблокирующий JDBC

Усилия сообщества

Дэвид Мортен (см. Приложение-8) - один из тех, кто работает над проектом, размещенным на Github, где он активно работает над неблокирующими пулами соединений JDBC.

Я цитирую проекты на странице Github (см. Приложение-8), как показано ниже:

«Блокировка потока - это проблема ресурсов, поскольку каждый заблокированный поток занимает ~ 0,5 МБ стека и может вызвать переключение контекста и задержки доступа к памяти (увеличивает задержку обработки потока) при переключении на. Например, 100 заблокированных потоков занимают ~ 50 МБ памяти (за пределами кучи java) ».

Инициативы Oracle

Oracle, компания, владеющая брендами Oracle Database и Java, также работает над решением для асинхронного JDBC. Это пакет с именем «java.sql2».

См. Подробности в Приложении-9.

Я взглянул на последнюю версию JDK 11, но пока не нашел пакет «java .sql2». Думаю, у нас еще нет фиксированной даты выпуска.

Приложения

Приложение 1 - Java IO против Java NIO



Приложение 2 - Java NIO2 с обработчиками завершения





Приложение 3 - базы данных ACID



Приложение 4 - Пулы подключений JDBC







Приложение 5 - Курсоры



Приложение 6 - Превышено максимальное количество курсоров



Node-oracledb: предотвращение« ORA-01000: превышено максимальное количество открытых курсоров
Подключение к базе данных Oracle с использованием таких языков, как Node.js, Python и PHP блоги .oracle.com »



Приложение 7. Производительность снижается по мере увеличения количества подключений

Приложение 8 - Неблокирующие пулы соединений JDBC





Приложение 9 - Неблокирующий JDBC Oracle