sql >> Database >  >> RDS >> PostgreSQL

Alleen PostgreSQL in het geheugen uitvoeren

(Mijn antwoord verplaatsen van PostgreSQL in het geheugen gebruiken en het generaliseren):

Je kunt Pg in-process, in-memory niet uitvoeren

Ik kan er niet achter komen hoe ik de Postgres-database in het geheugen moet uitvoeren om te testen. Is het mogelijk?

Nee, het is niet mogelijk. PostgreSQL is geïmplementeerd in C en gecompileerd naar platformcode. In tegenstelling tot H2 of Derby kun je niet zomaar de jar . laden en start het op als een wegwerpbare in-memory DB.

In tegenstelling tot SQLite, dat ook in C is geschreven en naar platformcode is gecompileerd, kan PostgreSQL ook niet tijdens het proces worden geladen. Het vereist meerdere processen (één per verbinding) omdat het een multiprocessing, geen multithreading, architectuur is. De vereiste voor meerdere verwerkingen betekent dat u moet start de postmaster als een op zichzelf staand proces.

In plaats daarvan:configureer vooraf een verbinding

Ik raad aan om simpelweg je tests te schrijven om te verwachten dat een bepaalde hostnaam/gebruikersnaam/wachtwoord werkt, en het testharnas CREATE DATABASE te hebben. een wegwerpdatabase en vervolgens DROP DATABASE aan het einde van de rit. Haal de gegevens van de databaseverbinding op uit een eigenschappenbestand, bouw doeleigenschappen, omgevingsvariabele, enz.

Het is veilig om een ​​bestaande PostgreSQL-instantie te gebruiken waarin u al databases heeft waar u om geeft, zolang de gebruiker die u aan uw unit-tests geeft niet is een superuser, alleen een gebruiker met CREATEDB rechten. In het slechtste geval creëer je prestatieproblemen in de andere databases. Om die reden geef ik er de voorkeur aan om een ​​volledig geïsoleerde PostgreSQL-installatie uit te voeren om te testen.

In plaats daarvan:start een wegwerpbare PostgreSQL-instantie om te testen

Als alternatief, als je echt bent graag zou je je testharnas de initdb kunnen laten lokaliseren en postgres binaries, voer initdb uit om een ​​database te maken, wijzigt u pg_hba.conf te trust , voer postgres uit om het op een willekeurige poort te starten, maak een gebruiker, maak een DB en voer de tests uit. Je zou zelfs de PostgreSQL-binaire bestanden voor meerdere architecturen in een pot kunnen bundelen en die voor de huidige architectuur uitpakken in een tijdelijke map voordat je de tests uitvoert.

Persoonlijk denk ik dat dat een grote pijn is die vermeden moet worden; het is veel gemakkelijker om gewoon een test-DB te configureren. Het is echter een beetje eenvoudiger geworden met de komst van include_dir ondersteuning in postgresql.conf; nu kun je slechts één regel toevoegen en dan een gegenereerd configuratiebestand voor de rest schrijven.

Sneller testen met PostgreSQL

Voor meer informatie over hoe u veilig verbeter de prestaties van PostgreSQL voor testdoeleinden, zie een gedetailleerd antwoord dat ik eerder over dit onderwerp schreef:PostgreSQL optimaliseren voor snel testen

H2's PostgreSQL-dialect is geen echte vervanging

Sommige mensen gebruiken in plaats daarvan de H2-database in PostgreSQL-dialectmodus om tests uit te voeren. Ik denk dat dat bijna net zo erg is als de mensen van Rails die SQLite gebruiken voor testen en PostgreSQL voor productie-implementatie.

H2 ondersteunt sommige PostgreSQL-extensies en emuleert het PostgreSQL-dialect. Het is echter niet meer dan dat:een emulatie. Je zult gebieden vinden waar H2 een zoekopdracht accepteert maar PostgreSQL niet, waar het gedrag verschilt, enz. Je zult ook tal van plaatsen vinden waar PostgreSQL iets ondersteunt dat H2 gewoon niet kan - zoals vensterfuncties, op het moment van schrijven.

Als u de beperkingen van deze aanpak begrijpt en uw databasetoegang eenvoudig is, is H2 mogelijk in orde. Maar in dat geval ben je waarschijnlijk een betere kandidaat voor een ORM die de database abstraheert omdat je de interessante functies toch niet gebruikt - en in dat geval hoef je je niet meer zo druk te maken over databasecompatibiliteit.

Tablespaces zijn niet het antwoord!

Doe niet gebruik een tabelruimte om een ​​"in-memory" database te maken. Het is niet alleen onnodig omdat het de prestaties sowieso niet veel ten goede zal komen, maar het is ook een geweldige manier om de toegang tot alle anderen die u belangrijk vindt in dezelfde PostgreSQL-installatie te verstoren. De 9.4 documentatie bevat nu de volgende waarschuwing:

WAARSCHUWING

Hoewel ze zich buiten de hoofdmap van PostgreSQL-gegevens bevinden, vormen tabelruimten een integraal onderdeel van het databasecluster en kunnen ze niet worden behandeld als een autonome verzameling gegevensbestanden. Ze zijn afhankelijk van de metagegevens in de hoofdgegevensdirectory en kunnen daarom niet aan een ander databasecluster worden gekoppeld of afzonderlijk worden geback-upt. Het plaatsen van een tabelruimte op een tijdelijk bestandssysteem zoals een ramdisk brengt de betrouwbaarheid van het hele cluster in gevaar.

omdat ik merkte dat te veel mensen dit deden en in de problemen kwamen.

(Als je dit hebt gedaan, kun je mkdir de ontbrekende tablespace-map om PostgreSQL opnieuw te laten starten, en vervolgens DROP de ontbrekende databases, tabellen enz. Het is beter om het gewoon niet te doen.)



  1. SQL Server-fout - HRESULT E_FAIL is geretourneerd door een aanroep naar een COM-onderdeel

  2. Datum ophalen in sql-server, CURRENT_TIMESTAMP vs GetDate()

  3. Gebruik XEvent Profiler om query's vast te leggen in SQL Server

  4. Kan niet decoderen met pgcrypto van AES-256-CBC, maar AES-128-CBC is OK