(Перемещаю свой ответ из раздела Использование PostgreSQL в памяти и обобщаю его):
Вы не можете запустить Pg в процессе, в памяти
Я не могу понять, как запустить базу данных Postgres в памяти для тестирования. Является ли это возможным?
Нет, это невозможно. PostgreSQL реализован на C и скомпилирован в код платформы. В отличие от H2 или Derby, вы не можете просто загрузить jar
и запустить его как одноразовую базу данных в памяти.
В отличие от SQLite, который также написан на C и скомпилирован в код платформы, PostgreSQL также не может быть загружен в процессе. Для этого требуется несколько процессов (по одному на соединение), потому что это многопроцессорная, а не многопоточная архитектура. Требование многопроцессорности означает, что вы должны запускать postmaster как отдельный процесс.
Вместо этого: предварительно настройте соединение
Я предлагаю просто написать ваши тесты, ожидая, что определенное имя хоста / имя пользователя / пароль будет работать, и иметь тестовую привязку CREATE DATABASE
к одноразовой базе данных, а затем DROP DATABASE
в конце запуска. Получите сведения о подключении к базе данных из файла свойств, целевых свойств сборки, переменной среды и т. Д.
Безопасно использовать существующий экземпляр PostgreSQL, который у вас уже есть базы данных, о которых вы заботитесь, если пользователь, который вы указываете для своих модульных тестов, не является суперпользователем, а только пользователем с CREATEDB
правами. В худшем случае вы создадите проблемы с производительностью в других базах данных. По этой причине я предпочитаю запускать полностью изолированную установку PostgreSQL для тестирования.
Вместо этого: запустите одноразовый экземпляр PostgreSQL для тестирования
С другой стороны , если вы действительно острыми вы могли бы иметь свой тест Жгут определить местонахождение initdb
и postgres
бинарных файлов, запускать , initdb
чтобы создать базу данных, изменить , pg_hba.conf
чтобы trust
, запустить , postgres
чтобы запустить его на произвольный порт, создать пользователь, создать базу данных, и запустить тесты . Вы даже можете связать двоичные файлы PostgreSQL для нескольких архитектур в банке и распаковать файлы для текущей архитектуры во временный каталог перед запуском тестов.
Лично я считаю, что этого следует избегать; проще настроить тестовую БД. Однако с появлением 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
недостающие базы данных, таблицы и т. Д. Лучше просто не делать этого.)