(Memindahkan jawaban saya dari Menggunakan PostgreSQL dalam memori dan menggeneralisasikannya):
Anda tidak dapat menjalankan Pg dalam proses, dalam memori
Saya tidak tahu cara menjalankan database Postgres dalam memori untuk pengujian. Apa itu mungkin?
Tidak, tidak mungkin. PostgreSQL diimplementasikan dalam C dan dikompilasi ke kode platform. Tidak seperti H2 atau Derby, Anda tidak bisa hanya memuat jar
dan menjalankannya sebagai DB dalam memori sekali pakai.
Tidak seperti SQLite, yang juga ditulis dalam C dan dikompilasi ke kode platform, PostgreSQL juga tidak dapat dimuat dalam proses. Ini membutuhkan banyak proses (satu per koneksi) karena ini adalah arsitektur multiprosesing, bukan multithreading. Persyaratan multiprosesing berarti Anda harus meluncurkan postmaster sebagai proses yang berdiri sendiri.
Sebagai gantinya: prakonfigurasi koneksi
Saya sarankan cukup menulis pengujian Anda untuk mengharapkan nama host / nama pengguna / kata sandi tertentu berfungsi, dan memiliki pengujian memanfaatkan CREATE DATABASE
database sekali pakai, lalu DROP DATABASE
di akhir proses. Dapatkan detail koneksi database dari file properti, buat properti target, variabel lingkungan, dll.
Aman untuk menggunakan instance PostgreSQL yang sudah ada yang sudah memiliki database yang Anda minati, selama pengguna yang Anda masukkan ke pengujian unit bukan superuser, hanya pengguna yang memiliki CREATEDB
hak. Paling buruk Anda akan membuat masalah kinerja di database lain. Saya lebih suka menjalankan instalasi PostgreSQL yang sepenuhnya terisolasi untuk pengujian karena alasan itu.
Sebagai gantinya: Luncurkan instance PostgreSQL sekali pakai untuk pengujian
Bergantian, jika Anda benar - benar ingin Anda dapat meminta harness pengujian Anda menemukan binari initdb
and postgres
, menjalankan initdb
untuk membuat database, memodifikasi pg_hba.conf
ke trust
, menjalankan postgres
untuk memulainya di port acak, membuat pengguna, membuat DB, dan menjalankan pengujian . Anda bahkan dapat memaketkan binari PostgreSQL untuk beberapa arsitektur dalam jar dan mengekstrak yang untuk arsitektur saat ini ke direktori sementara sebelum menjalankan pengujian.
Secara pribadi saya pikir itu adalah rasa sakit besar yang harus dihindari; jauh lebih mudah untuk hanya mengonfigurasi DB pengujian. Namun, ini menjadi sedikit lebih mudah dengan munculnya include_dir
dukungan dalam postgresql.conf
; sekarang Anda bisa menambahkan satu baris, lalu menulis file konfigurasi yang dihasilkan untuk yang lainnya.
Pengujian lebih cepat dengan PostgreSQL
Untuk informasi lebih lanjut tentang cara aman meningkatkan kinerja PostgreSQL untuk tujuan pengujian, lihat jawaban rinci saya menulis tentang topik ini sebelumnya: Optimalkan PostgreSQL untuk pengujian cepat
Dialek PostgreSQL H2 bukanlah pengganti yang sebenarnya
Beberapa orang malah menggunakan database H2 dalam mode dialek PostgreSQL untuk menjalankan tes. Saya pikir itu hampir seburuk orang-orang Rails yang menggunakan SQLite untuk pengujian dan PostgreSQL untuk penerapan produksi.
H2 mendukung beberapa ekstensi PostgreSQL dan mengemulasi dialek PostgreSQL. Namun, itu hanya itu - sebuah persaingan. Anda akan menemukan area di mana H2 menerima kueri tetapi PostgreSQL tidak, di mana perilakunya berbeda, dll . Anda juga akan menemukan banyak tempat di mana PostgreSQL mendukung melakukan sesuatu yang tidak bisa dilakukan H2 - seperti fungsi jendela, pada saat penulisan.
Jika Anda memahami batasan pendekatan ini dan akses database Anda sederhana, H2 mungkin OK. Tetapi dalam hal ini Anda mungkin adalah kandidat yang lebih baik untuk ORM yang mengabstraksi database karena Anda tidak menggunakan fitur-fiturnya yang menarik - dan dalam hal ini, Anda tidak perlu terlalu peduli tentang kompatibilitas database lagi.
Tablespaces bukanlah jawabannya!
Jangan tidak menggunakan tablespace untuk membuat "di memori database". Tidak hanya itu tidak diperlukan karena itu tidak akan membantu kinerja secara signifikan, tetapi juga cara yang bagus untuk mengganggu akses ke orang lain yang mungkin Anda pedulikan dalam instalasi PostgreSQL yang sama. Dokumentasi 9.4 sekarang berisi peringatan berikut :
PERINGATAN
Meskipun terletak di luar direktori data utama PostgreSQL, tablespaces adalah bagian integral dari cluster database dan tidak dapat diperlakukan sebagai kumpulan file data yang otonom. Mereka bergantung pada metadata yang terdapat dalam direktori data utama, dan oleh karena itu tidak dapat dilampirkan ke cluster database yang berbeda atau dicadangkan secara individual. Demikian pula, jika Anda kehilangan tablespace (penghapusan file, kegagalan disk, dll), cluster database mungkin menjadi tidak dapat dibaca atau tidak dapat dimulai. Menempatkan tablespace pada sistem file sementara seperti ramdisk berisiko terhadap keandalan seluruh cluster.
karena saya perhatikan terlalu banyak orang yang melakukan ini dan mengalami masalah.
(Jika Anda telah melakukan ini, Anda dapat mkdir
membuka direktori tablespace yang hilang untuk menjalankan PostgreSQL lagi, lalu DROP
database yang hilang, tabel, dll. Lebih baik tidak melakukannya.)