Рубрики
Без рубрики

9 Советов по повышению производительности при использовании PostgreSQL с JPA и гибернацией

Если вы боретесь с проблемами производительности доступа к данным, вам обязательно следует ознакомиться с этими советами по настройке производительности PostgreSQL.

Автор оригинала: Vlad Mihalcea.

Вступление

Чтобы получить максимальную отдачу от используемой реляционной базы данных, вам необходимо убедиться, что уровень доступа к данным соответствует базовой системе баз данных.

В этой статье мы рассмотрим, что вы можете сделать для повышения производительности при использовании PostgreSQL с JPA и Hibernate.

Как работает MVCC (Управление многовариантным параллелизмом)

Первое, что вам нужно принять во внимание, – это то, как PostgreSQL работает за кулисами. Знание его внутренней работы может сделать разницу между приложением, которое едва ползает, и приложением, которое работает со скоростью деформации.

За кулисами PostgreSQL использует MVCC (Управление параллелизмом нескольких версий) для управления параллельным доступом к строкам и индексам таблиц. Например, операция ОБНОВЛЕНИЯ состоит из мягкого удаления предыдущей записи и вставки новой, как показано на следующей диаграмме:

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

Благодаря MVCC читатели не блокируют авторов, а писатели не блокируют читателей. Для получения более подробной информации ознакомьтесь с этой статьей .

Общие буферы и кэш ОС

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

Традиционно системы баз данных используют два журнала для обозначения изменений транзакций:

  • журнал отмены используется для восстановления незафиксированных изменений в случае отката. В Oracle и MySQL в журнале отмены сохраняется разница между последним незафиксированным кортежем и предыдущим состоянием. Однако, поскольку PostgreSQL хранит несколько версий одной и той же записи в структуре таблицы, ему не требуется то, что другие СУБД определяют как журнал отмены .
  • redo_log называется WAL (Журнал предварительной записи) и обеспечивает долговечность транзакций. WAL хранит все изменения транзакций, так как изменения в памяти сбрасываются только периодически во время контрольных точек.

Как для таблиц, так и для индексов PostgreSQL загружает данные на страницах объемом 8 КБ, что является минимальной единицей чтения и записи данных. PostgreSQL использует shared_buffer для кэширования таблиц и индексирования страниц, которые считываются и изменяются. Во время контрольной точки грязные страницы, найденные в shared_buffer , сбрасываются на диск.

Помимо использования shared_buffer , предназначенного для хранения рабочего набора данных, PostgreSQL использует кэш ОС для ускорения чтения и записи страниц, которые не хранятся в shared_buffer .

Почему вам обязательно следует изучить оконные функции SQL

PostgreSQL обладает множеством расширенных функций, и вам обязательно следует ими воспользоваться. Просто потому, что вы используете JPA и спящий режим, это не означает, что вы должны ограничивать все свои взаимодействия с базой данных запросами JPQL или API критериев.

В противном случае, как вы думаете, почему EntityManager позволяет вам запускать собственные SQL-запросы ?

Для получения более подробной информации о оконных функциях ознакомьтесь с этой статьей.

Как вызывать функции PostgreSQL (хранимые процедуры) с помощью JPA и Hibernate

Использование JPA и Hibernate для записи данных очень удобно, особенно для типичных операций OLTP. Однако гораздо практичнее обрабатывать большие объемы данных в базе данных.

По этой причине использование хранимых процедур (или функций, как их называет PostgreSQL) позволяет избежать перемещения больших объемов данных из базы данных только для их обработки на уровне доступа к данным. Для получения более подробной информации об использовании хранимых процедур с JPA и Hibernate ознакомьтесь с этой статьей .

Ускорение интеграционных тестов

Если вы используете PostgreSQL в рабочей среде, и весь ваш код JPA и Hibernate тестируется в базе данных в памяти, такой как H2 или HSQLDB, то вы все делаете неправильно. Во-первых, вы не сможете тестировать функции окон или другие функции, специфичные для PostgreSQL. Во-вторых, только потому, что все тесты выполняются в БД в памяти, это не гарантирует, что один и тот же код будет работать нормально в БД PostgreSQL, которую вы запускаете в рабочей среде.

Единственной причиной, по которой разработчики выбирают базу данных в памяти для выполнения интеграционных тестов, является связанная с этим скорость, позволяющая избежать доступа к диску. Однако вы можете запускать интеграционные тесты в PostgreSQL почти так же быстро, как и в базе данных в памяти. Все, что вам нужно сделать, это сопоставить папку с данными в tmpfs . Для получения более подробной информации ознакомьтесь с этой статьей .

Тип JSON

В реляционной базе данных лучше всего хранить данные в соответствии с принципами реляционной модели.

Однако может оказаться, что вам также потребуется хранить данные без схемы (неструктурированные журналы). Структуры EAV (Сущность-Атрибут-значение), в этом случае столбец JSON может помочь вам справиться с такими требованиями.

Таким образом, только потому, что вы используете СУБД, это не означает, что вы не можете воспользоваться преимуществами гибкого хранения данных, когда этого требуют требования приложения.

Для получения более подробной информации о том, как использовать JSON с JPA и гибернацией, ознакомьтесь с этой статьей .

Последовательный столбец PostgreSQL и генератор идентификаторов гибернации

При использовании PostgreSQL возникает соблазн использовать тип столбца SERIAL или BIGSERIAL для автоматического увеличения первичных ключей. Однако для JPA и Hibernate это не рекомендуется.

Для получения более подробной информации ознакомьтесь с этой статьей .

Пакетирование JDBC

Для записи данных пакетирование JDBC может помочь вам сократить время отклика на транзакции. При использовании режима гибернации включение пакетной обработки-это всего лишь вопрос настройки одного свойства конфигурации .

Более того, PostgreSQL предлагает свойство конфигурации драйвера JDBC с пакетными вставками перезаписи , которое может помочь вам еще больше снизить затраты на выполнение.

Консультативные блокировки PostgreSQL

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

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

Вывод

Как вы можете видеть, есть много вещей, которые следует иметь в виду при использовании PostgreSQL с JPA и Hibernate. Поскольку PostgreSQL является одной из самых передовых СУБД с открытым исходным кодом, очень полезно знать все эти советы и настроить уровень доступа к данным, чтобы извлечь из этого максимальную пользу.