( 메모리 내 PostgreSQL 사용에서 내 대답을 이동 하고 일반화) :
Pg in-process, in-memory를 실행할 수 없습니다.
테스트를 위해 메모리 내 Postgres 데이터베이스를 실행하는 방법을 알 수 없습니다. 가능할까요?
아니요, 불가능합니다. PostgreSQL은 C로 구현되고 플랫폼 코드로 컴파일됩니다. H2 또는 Derby와는 달리 jar
일회용 인 메모리 DB로 로드하고 실행할 수 없습니다 .
C로 작성되고 플랫폼 코드로 컴파일되는 SQLite와 달리 PostgreSQL은 프로세스 내에서도로드 할 수 없습니다. 멀티 스레딩 아키텍처가 아닌 멀티 프로세싱이기 때문에 여러 프로세스 (연결 당 하나)가 필요합니다. 다중 처리 요구 사항 은 포스트 마스터를 독립 실행 형 프로세스로 시작 해야 함을 의미합니다 .
대신 : 연결 사전 구성
특정 호스트 이름 / 사용자 이름 / 암호가 작동 할 것으로 예상하는 테스트를 작성 하고 실행이 끝날 때 테스트 CREATE DATABASE
가 일회용 데이터베이스 DROP DATABASE
를 사용하도록하는 것이 좋습니다. 속성 파일, 빌드 대상 속성, 환경 변수 등에서 데이터베이스 연결 세부 정보를 가져옵니다.
그것은 당신이 이미 당신이 걱정하는 데이터베이스가 기존의 PostgreSQL 인스턴스를 사용하는 것이 안전 너무 오래 당신이 당신의 단위 테스트에 제공 한 사용자가 같이 하지 슈퍼 유저와 사용자 만 CREATEDB
권한. 최악의 경우 다른 데이터베이스에서 성능 문제가 발생합니다. 이러한 이유로 테스트를 위해 완전히 격리 된 PostgreSQL 설치를 실행하는 것을 선호합니다.
대신 : 테스트를 위해 일회용 PostgreSQL 인스턴스 시작
또는 정말 열심이라면 테스트 하네스가 initdb
및 postgres
바이너리를 찾고, initdb
데이터베이스를 생성하기 위해 실행 하고,로 수정 pg_hba.conf
하고 trust
, postgres
임의의 포트에서 시작하기 위해 실행 하고, 사용자를 생성하고, DB를 생성하고, 테스트를 실행할 수 있습니다. 여러 아키텍처에 대한 PostgreSQL 바이너리를 jar에 번들로 묶고 테스트를 실행하기 전에 현재 아키텍처에 대한 바이너리를 임시 디렉토리에 압축 해제 할 수도 있습니다.
개인적으로 그것은 피해야 할 큰 고통이라고 생각합니다. 테스트 DB를 구성하는 것이 더 쉽습니다. 그러나에서 include_dir
지원 의 출현으로 조금 더 쉬워 졌습니다 postgresql.conf
. 이제 한 줄만 추가 한 다음 나머지 모든 구성 파일을 작성할 수 있습니다.
PostgreSQL로 더 빠른 테스트
테스트 목적으로 PostgreSQL의 성능 을 안전하게 개선하는 방법에 대한 자세한 내용은 이전에이 주제에 대해 작성한 자세한 답변 : 빠른 테스트를 위해 PostgreSQL 최적화를 참조하십시오.
H2의 PostgreSQL 언어는 진정한 대체물이 아닙니다.
일부 사람들은 대신 PostgreSQL 언어 모드에서 H2 데이터베이스를 사용하여 테스트를 실행합니다. 그것은 테스트에 SQLite를 사용하고 프로덕션 배포에 PostgreSQL을 사용하는 Rails 사람들만큼이나 나쁘다고 생각합니다.
H2는 일부 PostgreSQL 확장을 지원하고 PostgreSQL 언어를 에뮬레이트합니다. 그러나 그것은 단지 에뮬레이션입니다.H2는 쿼리를 받아들이지 만 PostgreSQL은 받아들이지 않는 영역, 동작이 다른 영역 등을 찾을 수 있습니다 . 또한 PostgreSQL이 H2가 할 수없는 작업을 지원하는 곳도 많이 있습니다. 창 함수처럼 글을 쓰는 시점에서 말입니다.
이 접근 방식의 한계를 이해하고 데이터베이스 액세스가 간단하다면 H2는 괜찮을 수 있습니다. 그러나이 경우 흥미로운 기능을 사용하지 않기 때문에 데이터베이스를 추상화하는 ORM에 대한 더 나은 후보가 될 수 있습니다.이 경우 더 이상 데이터베이스 호환성에 대해 신경 쓸 필요가 없습니다.
테이블 스페이스는 답이 아닙니다!
마 하지 에 "메모리"데이터베이스를 만들 테이블 스페이스를 사용합니다. 어쨌든 성능에 크게 도움이되지 않기 때문에 불필요 할뿐만 아니라 동일한 PostgreSQL 설치에서 관심을 가질만한 다른 액세스를 방해하는 좋은 방법이기도합니다. 9.4 문서에는 이제 다음 경고가 포함됩니다 .
경고
기본 PostgreSQL 데이터 디렉토리 외부에 있더라도 테이블 스페이스는 데이터베이스 클러스터의 필수 부분이며 데이터 파일의 자율 컬렉션으로 취급 될 수 없습니다. 기본 데이터 디렉토리에 포함 된 메타 데이터에 종속되므로 다른 데이터베이스 클러스터에 연결하거나 개별적으로 백업 할 수 없습니다. 마찬가지로 테이블 스페이스가 손실되면 (파일 삭제, 디스크 오류 등) 데이터베이스 클러스터를 읽을 수 없거나 시작할 수 없게됩니다. 램 디스크와 같은 임시 파일 시스템에 테이블 스페이스를 배치하면 전체 클러스터의 안정성이 위험합니다.
너무 많은 사람들이이 일을하면서 문제가 발생하는 것을 알아 차렸 기 때문입니다.
(이 작업을 수행 한 경우 mkdir
누락 된 테이블 스페이스 디렉터리를 사용하여 PostgreSQL을 다시 시작 DROP
하고 누락 된 데이터베이스, 테이블 등 을 시작할 수 있습니다. 그렇게하지 않는 것이 좋습니다.)