Alguma maneira de manter a conexão ativa no pgAdmin sem configurá-la no servidor?

14

Estou usando o postgres.heroku.com para hospedar meus bancos de dados. Isso significa que não tenho como alterar as configurações do servidor. Portanto, a resposta a esta pergunta não me ajuda. Heroku não está disposto a alterar suas configurações (eu entrei em contato com eles).

Gostaria de saber qual seria a melhor maneira de hackear o PgAdmin III para manter a conexão ativa. Estou pensando em coisas como criar uma macro Autohotkey para automatizar ações da interface do usuário enquanto o PgAdmin está em segundo plano, ou talvez usar algum tipo de ferramenta de rede para forçar o envio de mensagens de rede em nome do PgAdmins.

Também recebi uma oferta de 500 $ para alguém mudar para o código do PgAmin III. O desenvolvedor do PgAdmin, não modificará o código, apenas por causa do Heroku.

O que devo fazer? O PgAdmin é superior em muitos aspectos, apenas tem essa desvantagem.

David
fonte
Para sua informação, Heroku não é o único com esse problema. Estamos enfrentando esse problema em uma VM Linux hospedada no Azure e acho que o problema está no provedor de serviços que fecha as conexões TCP inativas. Seria muito bom se PgAdmin poderia expor a opção viva sustento
Jonas Stawski
1
Eu tenho esse problema com o pgadmin desde 2002! Certamente o pgadmin poderia ser codificado para se reconectar automaticamente quando o tempo limite expirar, em vez de fazer você fechar o aplicativo, abri-lo novamente e reabrir a árvore inteira?
Matthew Bloqueio

Respostas:

18

libpq, a biblioteca cliente subjacente do PostgreSQL, tem a keepalivesopção de ativar os keepalives do TCP .

Parece que o PgAdmin-III não permite que você especifique parâmetros de conexão arbitrários diretamente, mas há uma solução alternativa.

Ao observar a configuração da conexão no PgAdmin-III, você verá a opção "service". Isso se refere ao arquivo do serviço de conexão . Para usá-lo, crie um ~/.pg_service.confconteúdo com como:

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

e ao conectar a partir do PgAdmin-III, digite myherokudbo servicecampo.

Isso fará com que o PgAdmin-III use os parâmetros de conexão especificados no arquivo de serviço, incluindo a ativação de keepalives.

(Se você estiver no Windows, o arquivo de serviço pode estar em outro local; consulte a documentação).

Não há variável de ambiente libpqpara controlar as keepalives; portanto, você não pode defini-lo dessa maneira; precisará usar um arquivo de serviço.

Adicionar suporte para parâmetros de conexão adicionais ao PgAdmin-III, ou uma caixa de seleção nas opções de conexão para controlar o parâmetro keepalives, deve ser bastante trivial. Gostaria de saber se Dave entendeu o que você estava pedindo em sua oferta para financiar o trabalho.


Atualização : o arquivo de serviço é procurado no local especificado na PGSYSCONFDIRvariável de ambiente. Se não estiver definido, o padrão será um local específico da plataforma, que não parece estar documentado corretamente para o Windows. Vou enviar um patch de documentação. A documentação para.pgpass mostra seu caminho como %APPDATA%\postgresql\pgpass.confse, então ~/.pg_service.confdeveria ser %APPDATA%\postgresql\pg_service.conf... mas não parece ser.

De fato, o caminho correto é:

%APPDATA%\postgresql\.pg_service.conf

Então:

  • Iniciar-> Executar
  • `% APPDATA%
  • crie o diretório "postgresql" se ele não existir
  • crie o arquivo ".pg_service.conf" como um arquivo de texto com o conteúdo fornecido acima (veja a nota abaixo sobre a nomeação de arquivos)
  • No PgAdmin-III, digite "localhost" no nome do host e o nome do serviço no campo de serviço.

Testei no Windows e descobri que você não pode deixar o hostcampo no PgAdmin-III em branco no Windows. O PgAdmin-III parece substituir qualquer host especificado no arquivo de serviço pelo especificado na caixa de diálogo de conexão. Portanto, você não deve incluir uma hostchave no arquivo de serviço. (Vou relatar um bug).

A opção "ocultar extensões de arquivo para tipos de arquivos conhecidos" está desativada no Windows, para que você não a chame acidentalmente .pg_service.conf.txt. Se não tiver certeza se o nome está correto ou não, verifique a coluna "Tipo" no Windows Explorer na exibição de lista; ele lerá "Documento de texto" se for nomeado incorretamente .pg_service.conf.txte CONF Filese for nomeado corretamente .pg_service.conf. Se você tiver problemas para renomeá-lo, desative "ocultar extensões de arquivo para tipos de arquivos conhecidos" ou use um editor de texto sensato, como o bloco de notas ++, que permitirá criar arquivos com o nome que desejar.

Observe o ponto inicial (ponto) no nome do arquivo. Sim, isso é diferente e pgpass.conf, sim, é irritante, na fronteira com um bug.

Craig Ringer
fonte
Muito obrigado por isso! Passei 45 minutos tentando fazer isso no meu computador com Windows 7. A primeira coisa é que não posso deixar o campo "host" vazio. Ele desativará o botão "OK" nessa caixa de diálogo. Tentei utilizar "-" como host, o que me levou ao segundo problema. Não sei onde colocar o arquivo pg_service.conf. Tentei fazer tentativa e erro e o coloquei em todos os subdiretórios relacionados ao PgAdmin III e também em C: \ Users \ pc \ AppData \ Roaming \ postgresql. Eu sempre tenho o erro: "Definição de serviço 'myherokudb' não encontrado.
David
1
Também tentei ler sobre o pg_service.conf, mas pareço encontrar apenas documentação referente a ele no contexto do servidor.
David
Não sei onde você obteve o "contexto do lado do servidor", pois a documentação à qual vinculei se refere ao cliente. A menos que você assuma "unix / linux" significa "servidor", o que não significa. Como você não se preocupou em mencionar em que sistema operacional estava, não poderia ser mais específico. Agora atualizei a resposta com informações específicas do Windows (e, francamente, é justo o suficiente que você esteja confuso). Além disso, no Windows, o PgAdmin-III parece substituir o host especificado no arquivo de serviço pelo especificado na interface do usuário; portanto, deixe hosto arquivo de serviço em branco.
Craig Ringer
Muito obrigado pela sua ajuda! Sua solução simplesmente funciona! Foi o ponto principal no nome do arquivo que me confundiu, eu pensei que era uma coisa do Linux. Mais uma vez obrigado!
David
2
Na verdade, essa solução não funciona, afinal. Demorei muito tempo para chegar a essa conclusão, pensando que isso causou instabilidade na minha rede, etc., mas a conexão ainda termina. Estou confiante de que segui sua descrição. Pode ser um caso, caso a heroku tenha implementado algo para evitar ter milhares de conexões com seus servidores de teste gratuitos que hospedam centenas de bancos de dados gratuitos.
David