(Verschieben meiner Antwort von der Verwendung von PostgreSQL im Speicher und Verallgemeinern):
Sie können Pg nicht im Prozess oder im Speicher ausführen
Ich kann nicht herausfinden, wie die Postgres-Datenbank im Speicher zum Testen ausgeführt wird. Ist es möglich?
Nein, das ist nicht möglich. PostgreSQL ist in C implementiert und zu Plattformcode kompiliert. Im Gegensatz zu H2 oder Derby können Sie die nicht einfach laden jar
und als wegwerfbare In-Memory-Datenbank starten.
Im Gegensatz zu SQLite, das ebenfalls in C geschrieben und zu Plattformcode kompiliert ist, kann PostgreSQL auch nicht in Bearbeitung geladen werden. Es sind mehrere Prozesse erforderlich (einer pro Verbindung), da es sich um eine Multiprozessor- und keine Multithreading-Architektur handelt. Die Multiprozessor-Anforderung bedeutet, dass Sie den Postmaster als eigenständigen Prozess starten müssen .
Stattdessen: Konfigurieren Sie eine Verbindung vor
Ich schlage vor, einfach Ihre Tests zu schreiben, um zu erwarten, dass ein bestimmter Hostname / Benutzername / Passwort funktioniert, und den Test am Ende des Laufs CREATE DATABASE
eine Wegwerfdatenbank zu verwenden DROP DATABASE
. Rufen Sie die Datenbankverbindungsdetails aus einer Eigenschaftendatei ab, erstellen Sie Zieleigenschaften, Umgebungsvariablen usw.
Es ist sicher, eine vorhandene PostgreSQL-Instanz zu verwenden, in der Sie bereits Datenbanken haben, die Sie interessieren, solange der Benutzer, den Sie für Ihre Komponententests angeben, kein Superuser ist, sondern nur ein Benutzer mit CREATEDB
Rechten. Im schlimmsten Fall verursachen Sie Leistungsprobleme in den anderen Datenbanken. Aus diesem Grund bevorzuge ich eine vollständig isolierte PostgreSQL-Installation zum Testen.
Stattdessen: Starten Sie eine wegwerfbare PostgreSQL-Instanz zum Testen
Alternativ , wenn Sie wirklich keen könnten Sie Ihre Testumgebung haben suchen Sie die initdb
und postgres
Binärdateien, führen Sie initdb
eine Datenbank zu erstellen, ändern , pg_hba.conf
um trust
, führen postgres
sie an einem zufälligen Port zu starten, einen Benutzer erstellen, erstellen Sie eine DB, und die Tests ausführen . Sie können sogar die PostgreSQL-Binärdateien für mehrere Architekturen in einem JAR bündeln und die für die aktuelle Architektur in ein temporäres Verzeichnis entpacken, bevor Sie die Tests ausführen.
Persönlich denke ich, dass dies ein großer Schmerz ist, der vermieden werden sollte; Es ist viel einfacher, nur eine Test-DB zu konfigurieren. Mit dem Aufkommen der include_dir
Unterstützung in wird es jedoch ein wenig einfacher postgresql.conf
. Jetzt können Sie nur noch eine Zeile anhängen und für den Rest eine generierte Konfigurationsdatei schreiben.
Schnelleres Testen mit PostgreSQL
Weitere Informationen dazu, wie Sie die Leistung von PostgreSQL zu Testzwecken sicher verbessern können, finden Sie in einer ausführlichen Antwort, die ich zuvor zu diesem Thema geschrieben habe: Optimieren Sie PostgreSQL für schnelle Tests
Der PostgreSQL-Dialekt von H2 ist kein echter Ersatz
Einige Benutzer verwenden stattdessen die H2-Datenbank im PostgreSQL-Dialektmodus, um Tests auszuführen. Ich denke, das ist fast so schlimm wie die Rails-Leute, die SQLite zum Testen und PostgreSQL für die Produktionsbereitstellung verwenden.
H2 unterstützt einige PostgreSQL-Erweiterungen und emuliert den PostgreSQL-Dialekt. Es ist jedoch nur das - eine Emulation. Sie werden Bereiche , wo H2 eine Abfrage übernimmt aber PostgreSQL nicht der Fall, wo das Verhalten unterscheidet, etc . Es gibt auch viele Stellen, an denen PostgreSQL etwas unterstützt, was H2 zum Zeitpunkt des Schreibens einfach nicht kann - wie Fensterfunktionen.
Wenn Sie die Einschränkungen dieses Ansatzes verstehen und Ihr Datenbankzugriff einfach ist, ist H2 möglicherweise in Ordnung. Aber in diesem Fall sind Sie wahrscheinlich ein besserer Kandidat für ein ORM, das die Datenbank abstrahiert, weil Sie die interessanten Funktionen sowieso nicht nutzen - und in diesem Fall müssen Sie sich nicht mehr so sehr um die Datenbankkompatibilität kümmern.
Tablespaces sind nicht die Antwort!
Sie nicht einen Tabellen verwenden , um eine „in-memory“ Datenbank zu erstellen. Dies ist nicht nur unnötig, da es die Leistung ohnehin nicht wesentlich verbessert, sondern auch eine großartige Möglichkeit, den Zugriff auf andere zu stören, die Sie in derselben PostgreSQL-Installation interessieren könnten. Die 9.4-Dokumentation enthält jetzt die folgende Warnung :
WARNUNG
Obwohl sich Tablespaces außerhalb des PostgreSQL-Hauptdatenverzeichnisses befinden, sind sie ein integraler Bestandteil des Datenbankclusters und können nicht als autonome Sammlung von Datendateien behandelt werden. Sie hängen von den im Hauptdatenverzeichnis enthaltenen Metadaten ab und können daher nicht an einen anderen Datenbankcluster angehängt oder einzeln gesichert werden. Wenn Sie einen Tabellenbereich verlieren (Löschen von Dateien, Festplattenfehler usw.), ist der Datenbankcluster möglicherweise nicht mehr lesbar oder kann nicht mehr gestartet werden. Das Platzieren eines Tablespace in einem temporären Dateisystem wie einer Ramdisk gefährdet die Zuverlässigkeit des gesamten Clusters.
weil ich bemerkte, dass zu viele Leute dies taten und in Schwierigkeiten gerieten.
(Wenn Sie dies getan haben, können Sie mkdir
das fehlende Tablespace-Verzeichnis verwenden, um PostgreSQL erneut zu starten, dann DROP
die fehlenden Datenbanken, Tabellen usw. Es ist besser, es einfach nicht zu tun.)