sql >> Base de Datos >  >> RDS >> PostgreSQL

Ejecutando PostgreSQL solo en memoria

(Moviendo mi respuesta de Uso de PostgreSQL en memoria y generalizándola):

No puede ejecutar Pg en proceso, en memoria

No puedo averiguar cómo ejecutar la base de datos Postgres en memoria para realizar pruebas. ¿Es posible?

No, no es posible. PostgreSQL se implementa en C y se compila en el código de la plataforma. A diferencia de H2 o Derby, no puede simplemente cargar el jar y enciéndalo como una base de datos desechable en memoria.

A diferencia de SQLite, que también está escrito en C y compilado en el código de la plataforma, PostgreSQL tampoco se puede cargar en el proceso. Requiere múltiples procesos (uno por conexión) porque es una arquitectura de multiprocesamiento, no de subprocesos múltiples. El requisito de multiprocesamiento significa que debe inicie el postmaster como un proceso independiente.

En su lugar:preconfigurar una conexión

Sugiero simplemente escribir sus pruebas para esperar que funcione un nombre de host/nombre de usuario/contraseña en particular, y hacer que la prueba aproveche CREATE DATABASE una base de datos descartable, luego DROP DATABASE al final de la carrera. Obtenga los detalles de conexión de la base de datos de un archivo de propiedades, cree propiedades de destino, variable de entorno, etc.

Es seguro usar una instancia de PostgreSQL existente en la que ya tiene bases de datos que le interesan, siempre que el usuario que proporcione a sus pruebas unitarias no un superusuario, solo un usuario con CREATEDB derechos. En el peor de los casos, creará problemas de rendimiento en las otras bases de datos. Prefiero ejecutar una instalación de PostgreSQL completamente aislada para realizar pruebas por ese motivo.

En su lugar:inicie una instancia de PostgreSQL descartable para realizar pruebas

Alternativamente, si estás realmente desea que su arnés de prueba localice el initdb y postgres binarios, ejecute initdb para crear una base de datos, modifique pg_hba.conf trust , ejecuta postgres para iniciarlo en un puerto aleatorio, cree un usuario, cree una base de datos y ejecute las pruebas. Incluso podría agrupar los archivos binarios de PostgreSQL para varias arquitecturas en un contenedor y descomprimir los de la arquitectura actual en un directorio temporal antes de ejecutar las pruebas.

Personalmente, creo que es un gran dolor que debe evitarse; es mucho más fácil tener una base de datos de prueba configurada. Sin embargo, se ha vuelto un poco más fácil con la llegada de include_dir soporte en postgresql.conf; ahora solo puede agregar una línea y luego escribir un archivo de configuración generado para el resto.

Pruebas más rápidas con PostgreSQL

Para obtener más información sobre cómo de forma segura mejorar el rendimiento de PostgreSQL con fines de prueba, vea una respuesta detallada que escribí sobre este tema anteriormente:Optimizar PostgreSQL para pruebas rápidas

El dialecto PostgreSQL de H2 no es un verdadero sustituto

En cambio, algunas personas usan la base de datos H2 en el modo de dialecto de PostgreSQL para ejecutar pruebas. Creo que eso es casi tan malo como que la gente de Rails use SQLite para pruebas y PostgreSQL para implementación en producción.

H2 admite algunas extensiones de PostgreSQL y emula el dialecto de PostgreSQL. Sin embargo, es solo eso:una emulación. Encontrará áreas donde H2 acepta una consulta pero PostgreSQL no, donde el comportamiento difiere, etc. También encontrará muchos lugares donde PostgreSQL admite hacer algo que H2 simplemente no puede, como funciones de ventana, en el momento de escribiendo.

Si comprende las limitaciones de este enfoque y su acceso a la base de datos es simple, H2 podría estar bien. Pero en ese caso, probablemente sea un mejor candidato para un ORM que abstraiga la base de datos porque de todos modos no está utilizando sus características interesantes, y en ese caso, ya no tiene que preocuparse tanto por la compatibilidad de la base de datos.

¡Los tablespaces no son la respuesta!

no use un tablespace para crear una base de datos "en memoria". No solo es innecesario, ya que no ayudará significativamente al rendimiento de todos modos, sino que también es una excelente manera de interrumpir el acceso a cualquier otro que le interese en la misma instalación de PostgreSQL. La documentación de 9.4 ahora contiene la siguiente advertencia:

ADVERTENCIA

Aunque se encuentran fuera del directorio de datos principal de PostgreSQL, los espacios de tablas son una parte integral del clúster de la base de datos y no pueden tratarse como una colección autónoma de archivos de datos. Dependen de los metadatos contenidos en el directorio de datos principal y, por lo tanto, no se pueden adjuntar a un clúster de base de datos diferente ni hacer una copia de seguridad de forma individual. para comenzar. Colocar un tablespace en un sistema de archivos temporal como un ramdisk pone en riesgo la confiabilidad de todo el clúster.

porque me di cuenta de que demasiadas personas estaban haciendo esto y se estaban metiendo en problemas.

(Si ha hecho esto, puede mkdir el directorio del tablespace faltante para que PostgreSQL comience de nuevo, luego DROP las bases de datos, tablas, etc. que faltan. Es mejor simplemente no hacerlo).