¿Alguna forma de mantener viva la conexión en pgAdmin sin configurarla en el servidor?

14

Estoy usando postgres.heroku.com para alojar mis bases de datos. Esto significa que no tengo forma de cambiar la configuración del servidor. Por lo tanto, la respuesta a esta pregunta no me ayuda. Heroku no está dispuesto a cambiar su configuración (me he puesto en contacto con ellos).

Me pregunto cuál sería la mejor manera de hackear PgAdmin III para mantener viva la conexión. Estoy pensando en cosas como crear una macro Autohotkey para automatizar las acciones de la interfaz de usuario mientras PgAdmin está en segundo plano, o tal vez usar algún tipo de herramienta de red para forzar el envío de mensajes de red en nombre de PgAdmins.

También recibí una oferta de 500 $ para que alguien cambie el código de PgAmin III. El desarrollador de PgAdmin, no modificará el código, solo por Heroku.

¿Qué tengo que hacer? PgAdmin es superior en muchos aspectos, solo tiene este inconveniente.

David
fuente
Para su información, Heroku no es el único con este problema. Nos encontramos con este problema en una máquina virtual Linux alojada en Azure y creo que el problema es con el proveedor de servicios que cierra las conexiones TCP inactivas. Sería muy bueno si PgAdmin pudiera exponer la opción de mantener vivo
Jonas Stawski
1
¡He tenido este problema con pgadmin desde 2002! ¿Seguramente pgadmin podría codificarse para reconectarse automáticamente una vez que se agote el tiempo de espera en lugar de hacer que cierre la aplicación, la abra de nuevo y vuelva a abrir todo el árbol?
Matthew Lock

Respuestas:

18

libpq, la biblioteca de cliente de PostgreSQL subyacente, tiene la keepalivesopción de habilitar TCP keepalives .

Parece que PgAdmin-III no le permite especificar parámetros de conexión arbitrarios directamente, pero hay una solución alternativa.

Cuando observa la configuración de conexión en PgAdmin-III, verá una opción de "servicio". Esto se refiere al archivo del servicio de conexión . Para usarlo, crea un ~/.pg_service.confcontenido como:

[myherokudb]
user=myusername
keepalives=1
connect_timeout=20
keepalives_idle=10

y cuando se conecte desde PgAdmin-III, ingrese myherokudben el servicecampo.

Esto hará que PgAdmin-III use los parámetros de conexión especificados en el archivo de servicio, incluida la habilitación de keepalives.

(Si está en Windows, el archivo de servicio puede estar en otra ubicación; consulte la documentación).

No hay una variable de entorno libpqpara controlar keepalives, por lo que no puede configurarlo de esa manera, tendrá que usar un archivo de servicio.

Agregar soporte para parámetros de conexión adicionales a PgAdmin-III, o una casilla de verificación en las opciones de conexión para controlar el parámetro keepalives, debería ser bastante trivial. Me pregunto si Dave entendió lo que estaba pidiendo sobre su oferta para financiar el trabajo.


Actualización : el archivo de servicio se busca en la ubicación especificada en la PGSYSCONFDIRvariable de entorno. Si no está configurado, el valor predeterminado es una ubicación específica de la plataforma, que no parece estar documentada correctamente para Windows. Enviaré un parche de documentación. La documentación de.pgpass muestra su camino como %APPDATA%\postgresql\pgpass.confsi así ~/.pg_service.conffuera, %APPDATA%\postgresql\pg_service.confpero debería ser ... pero no parece serlo.

De hecho, la ruta correcta es:

%APPDATA%\postgresql\.pg_service.conf

Entonces:

  • Inicio-> Ejecutar
  • `% APPDATA%
  • crear el directorio "postgresql" si no existe
  • cree el archivo ".pg_service.conf" como un archivo de texto con los contenidos proporcionados anteriormente (vea la nota a continuación sobre el nombre del archivo)
  • En PgAdmin-III, ingrese "localhost" en el nombre del Host y el nombre del servicio en el campo de servicio.

Lo probé en Windows y descubrí que no puede dejar el hostcampo en PgAdmin-III en blanco en Windows. PgAdmin-III parece anular cualquier host especificado en el archivo de servicio con lo que se especifica en el diálogo de conexión. Por lo tanto, no debe incluir una hostclave en el archivo de servicio. (Informaré un error).

Hacer que "ocultar extensiones de archivo para tipos de archivo conocidos" esté desactivado en Windows, para que no lo llame accidentalmente .pg_service.conf.txt. Si no está seguro de si se llama correctamente o no, marque la columna "Tipo" en el Explorador de Windows en la vista de lista; leerá "Documento de texto" si se nombra incorrectamente .pg_service.conf.txty CONF Filesi se nombra correctamente .pg_service.conf. Si tiene problemas para renombrarlo, desactive "ocultar extensiones de archivo para tipos de archivo conocidos", o use un editor de texto sensible como notepad ++ que le permitirá crear archivos con el nombre que desee.

Tenga en cuenta el punto inicial (punto) en el nombre del archivo. Sí, eso es diferente pgpass.confy sí, eso es molesto, rayando en un error.

Craig Ringer
fuente
¡Muchas gracias por esto! Ahora he pasado 45 minutos probando esto en mi computadora con Windows 7. Lo primero es que no puedo dejar el campo "host" vacío. Deshabilitará el botón "Aceptar" en ese cuadro de diálogo. Intenté utilizar "-" como host, lo que me llevó al segundo problema. No sé dónde colocar el archivo pg_service.conf. Intenté hacer prueba y error y lo coloqué en todos los subdirectorios relacionados con PgAdmin III y también en C: \ Users \ pc \ AppData \ Roaming \ postgresql. Siempre recibí el error: "Definición de servicio" myherokudb "no encontrada.
David
1
También intenté leer sobre pg_service.conf, pero parece que solo encuentro documentación que hace referencia a él en un contexto del lado del servidor.
David
No sé de dónde sacaste el "contexto del lado del servidor" dado que la documentación a la que me vinculé se refiere al cliente. A menos que asuma que "unix / linux" significa "servidor", lo que no significa. Como originalmente no te molestaste en mencionar en qué sistema operativo estabas, no podría ser más específico. Ahora he actualizado la respuesta con información específica de Windows (y, francamente, es justo que te hayas confundido). Además, en Windows, PgAdmin-III parece anular el host especificado en el archivo de servicio con el especificado en la interfaz de usuario, así que déjelo hosten blanco en el archivo de servicio.
Craig Ringer
¡Muchas gracias por tu ayuda! ¡Tu solución simplemente funciona! Fue el punto principal en el nombre del archivo lo que me confundió, pensé que era algo de Linux. ¡Gracias de nuevo!
David
2
En realidad, esta solución no funciona después de todo. Me llevó mucho tiempo llegar a esa conclusión, pensando que fue causada por la inestabilidad de mi red, etc., pero la conexión aún se agota. Estoy seguro de que he seguido tu descripción. Podría ser un caso, donde heroku ha implementado algo para evitar tener miles de conexiones a sus servidores de prueba gratuitos que alojan cientos de bases de datos gratuitas.
David