PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Menjalankan PostgreSQL hanya di memori

(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. Apakah mungkin?

Tidak, itu tidak mungkin. PostgreSQL diimplementasikan dalam C dan dikompilasi ke kode platform. Tidak seperti H2 atau Derby Anda tidak bisa hanya memuat jar dan jalankan 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 multiprosesor, bukan multithreading. Persyaratan multiprosesing berarti Anda harus luncurkan postmaster sebagai proses mandiri.

Sebaliknya:konfigurasikan koneksi terlebih dahulu

Saya sarankan hanya menulis tes Anda untuk mengharapkan nama host/nama pengguna/kata sandi tertentu berfungsi, dan memiliki test harness CREATE DATABASE database sekali pakai, lalu DROP DATABASE di akhir lari. Dapatkan detail koneksi database dari file properti, bangun properti target, variabel lingkungan, dll.

Aman untuk menggunakan instance PostgreSQL yang sudah ada, Anda sudah memiliki database yang penting bagi Anda, selama pengguna yang Anda berikan untuk pengujian unit Anda tidak pengguna super, hanya pengguna dengan 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.

Sebaliknya:Luncurkan instance PostgreSQL sekali pakai untuk pengujian

Atau, jika Anda benar-benar tertarik Anda dapat meminta harness uji Anda menemukan initdb dan postgres binari, jalankan initdb untuk membuat database, modifikasi pg_hba.conf untuk trust , jalankan postgres untuk memulainya di port acak, buat pengguna, buat DB, dan jalankan tes. Anda bahkan dapat menggabungkan biner PostgreSQL untuk beberapa arsitektur dalam toples dan membongkar yang untuk arsitektur saat ini ke direktori sementara sebelum menjalankan pengujian.

Secara pribadi saya pikir itu adalah rasa sakit utama yang harus dihindari; jauh lebih mudah untuk hanya memiliki DB uji yang dikonfigurasi. Namun, ini menjadi sedikit lebih mudah dengan munculnya include_dir dukungan di postgresql.conf; sekarang Anda cukup menambahkan satu baris, lalu menulis file konfigurasi yang dihasilkan untuk sisanya.

Pengujian lebih cepat dengan PostgreSQL

Untuk informasi lebih lanjut tentang cara aman meningkatkan kinerja PostgreSQL untuk tujuan pengujian, lihat jawaban terperinci yang saya tulis 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 sama buruknya dengan orang-orang Rails yang menggunakan SQLite untuk pengujian dan PostgreSQL untuk penyebaran produksi.

H2 mendukung beberapa ekstensi PostgreSQL dan mengemulasi dialek PostgreSQL. Namun, hanya itu - sebuah emulasi. Anda akan menemukan area di mana H2 menerima kueri tetapi PostgreSQL tidak, di mana perilaku berbeda, dll. Anda juga akan menemukan banyak tempat di mana PostgreSQL mendukung melakukan sesuatu yang tidak bisa dilakukan H2 - seperti fungsi jendela, pada saat menulis.

Jika Anda memahami keterbatasan pendekatan ini dan akses database Anda sederhana, H2 mungkin baik-baik saja. Tetapi dalam hal ini Anda mungkin kandidat yang lebih baik untuk ORM yang mengabstraksi basis data karena Anda tidak menggunakan fitur-fiturnya yang menarik - dan dalam hal ini, Anda tidak perlu terlalu peduli dengan kompatibilitas basis data lagi.

Ruang tabel bukanlah jawabannya!

Jangan jangan gunakan tablespace untuk membuat database "dalam memori". Tidak hanya itu tidak perlu karena tidak akan membantu kinerja secara signifikan, tetapi juga cara yang bagus untuk mengganggu akses ke yang lain yang mungkin Anda pedulikan di instalasi PostgreSQL yang sama. Dokumentasi 9.4 sekarang berisi peringatan berikut:

PERINGATAN

Meskipun terletak di luar direktori data PostgreSQL utama, tablespace merupakan bagian integral dari cluster database dan tidak dapat diperlakukan sebagai kumpulan file data yang otonom. Mereka bergantung pada metadata yang terkandung dalam direktori data utama, dan oleh karena itu tidak dapat dilampirkan ke cluster database yang berbeda atau dicadangkan satu per satu. Demikian pula, jika Anda kehilangan tablespace (penghapusan file, kegagalan disk, dll), cluster database mungkin menjadi tidak terbaca atau tidak dapat untuk memulai.Menempatkan tablespace pada sistem file sementara seperti ramdisk berisiko terhadap keandalan seluruh cluster.

karena saya melihat terlalu banyak orang yang melakukan ini dan mengalami masalah.

(Jika Anda telah melakukannya, Anda dapat mkdir direktori tablespace yang hilang untuk membuat PostgreSQL memulai lagi, lalu DROP database yang hilang, tabel dll. Lebih baik tidak melakukannya.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 9.6 Turnamen Patch Paling Menakutkan

  2. PostgreSQL:Paralelisme Kueri dalam Tindakan

  3. PostgreSQL:Nonaktifkan koneksi untuk sementara

  4. Postgres UUID JDBC tidak berfungsi

  5. Tuple tidak dimasukkan secara berurutan dalam tabel database?