Задний план
Это серия из трех частей
- Часть первая - нажмите на ссылку
- Часть вторая - эта страница
- Часть третья - обновление от начала 2021 года
В первой части мы рассмотрели неблокирующие звонки и системы на основе событий.
Разделы на этой странице
- Мы постараемся понять Java NIO на высоком уровне
- Мы объясним важность курсоров / соединений в базе данных.
- Мы сделаем аргумент в пользу неблокирования JDBC
Java IO NIO и NIO2
Ключевые аспекты
- У Java IO был поток на соединение для каждой модели соединения, не очень масштабируемый
- Java NIO появился в Java 4. Он представил концепцию селекторов и буферов, которая изменила модель на один поток, способный обрабатывать множество соединений. Более масштабируемый, чем Java IO, с меньшим количеством потоков
- 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