(Перемещение моего ответа из Использование PostgreSQL в памяти и обобщение его):
Вы не можете запустить Pg в процессе, в памяти
Я не могу понять, как запустить базу данных Postgres в памяти для тестирования. Возможно ли это?
Нет, это невозможно. PostgreSQL реализован на C и скомпилирован в код платформы. В отличие от H2 или Derby, вы не можете просто загрузить jar
и запустить его как одноразовую БД в памяти.
В отличие от SQLite, который также написан на C и скомпилирован в код платформы, PostgreSQL также не может быть загружен в процессе. Требуется несколько процессов (по одному на соединение), потому что это многопроцессорная, а не многопоточная архитектура. Требование многопроцессорности означает, что вы должны запустить почтмейстер как самостоятельный процесс.
Вместо этого: предварительно настроить соединение
Я предлагаю просто написать свои тесты, чтобы ожидать, что определенное имя хоста / имя пользователя / пароль сработает, и иметь тестовую привязку CREATE DATABASE
одноразовой базы данных, затем DROP DATABASE
в конце цикла. Получить сведения о соединении с базой данных из файла свойств, целевых свойств сборки, переменной среды и т. Д.
Безопасно использовать существующий экземпляр PostgreSQL, в котором у вас уже есть базы данных, в которых вы заинтересованы, при условии, что пользователь, которого вы предоставляете для своих модульных тестов, является , а не суперпользователем, только пользователь с правами CREATEDB
, В худшем случае вы создадите проблемы с производительностью в других базах данных. По этой причине я предпочитаю запускать полностью изолированную установку PostgreSQL для тестирования.
Вместо этого: Запустите бесплатный экземпляр PostgreSQL для тестирования
В качестве альтернативы, если вы действительно заинтересованы, вы можете попросить, чтобы ваш тестовый жгут обнаружил файлы initdb
и postgres
, запустить initdb
, чтобы создать базу данных, изменить pg_hba.conf
на trust
, запустите postgres
, чтобы запустить его на произвольном порту, создать пользователя, создать БД и запустить тесты . Вы даже можете связать двоичные файлы PostgreSQL для нескольких архитектур в jar и распаковать их для текущей архитектуры во временный каталог перед запуском тестов.
Лично я думаю, что это большая боль, которую следует избегать; гораздо проще просто настроить тестовую БД. Однако с появлением поддержки include_dir
в postgresql.conf
стало немного легче; теперь вы можете просто добавить одну строку, а затем написать сгенерированный файл конфигурации для всех остальных.
Ускоренное тестирование с PostgreSQL
Для получения дополнительной информации о том, как безопасно улучшить производительность PostgreSQL для целей тестирования, см. Подробный ответ, который я написал по этой теме ранее: Оптимизация PostgreSQL для быстрого тестирования
диалект PostgreSQL от H2 не является верной заменой
Некоторые люди вместо этого используют базу данных H2 в режиме диалекта PostgreSQL для запуска тестов. Я думаю, что это почти так же плохо, как люди из Rails, использующие SQLite для тестирования и PostgreSQL для производственного развертывания.
H2 поддерживает некоторые расширения PostgreSQL и эмулирует диалект PostgreSQL. Однако это всего лишь эмуляция. Вы найдете области, где H2 принимает запрос, а PostgreSQL нет, где поведение отличается и т. Д. . Вы также найдете множество мест, где PostgreSQL поддерживает то, что H2 просто не может сделать - например, оконные функции на момент написания.
Если вы понимаете ограничения этого подхода и ваш доступ к базе данных прост, H2 может быть в порядке. Но в этом случае вы, вероятно, лучший кандидат на ORM, который абстрагирует базу данных, потому что вы все равно не используете ее интересные функции - и в этом случае вам больше не нужно заботиться о совместимости базы данных.
Табличные пространства не являются ответом!
Не не использовать табличное пространство для создания базы данных "в памяти". Это не только не нужно, так как в любом случае это существенно не повлияет на производительность, но также является отличным способом нарушить доступ к любому другому, что может вас заинтересовать в той же установке PostgreSQL. Документация 9.4 теперь содержит следующее предупреждение :
ПРЕДУПРЕЖДЕНИЕ
Несмотря на то, что он расположен вне основного каталога данных PostgreSQL,
Табличные пространства являются неотъемлемой частью кластера базы данных и не могут быть
рассматривается как автономный набор файлов данных. Они зависимы
на метаданные, содержащиеся в главном каталоге данных, и, следовательно, не может
быть прикрепленным к другому кластеру базы данных или резервным копированием по отдельности.
Точно так же, если вы потеряете табличное пространство (удаление файла, сбой диска,
и т. д.), кластер базы данных может стать нечитаемым или не сможет запуститься.
Размещение табличного пространства во временной файловой системе, как риск виртуального диска
Надежность всего кластера.
потому что я заметил, что слишком много людей делают это и сталкиваются с проблемами.
(Если вы сделали это, вы можете mkdir
отсутствующий каталог табличного пространства, чтобы PostgreSQL мог снова запуститься, затем DROP
отсутствующие базы данных, таблицы и т. Д. Лучше просто не делать этого.)