Любой способ сохранить соединение в pgAdmin без установки на сервере?

12673
David

Я использую postgres.heroku.com для размещения своих баз данных. Это означает, что у меня нет возможности изменить настройки сервера. Поэтому ответ на этот вопрос мне не поможет. Heroku не хочет менять свои настройки (я связался с ними).

Мне интересно, как лучше всего взломать PgAdmin III, чтобы сохранить связь. Я имею в виду такие вещи, как создание макроса Autohotkey для автоматизации действий пользовательского интерфейса, когда PgAdmin находится в фоновом режиме, или, возможно, использование какого-либо сетевого инструмента для принудительной отправки сетевых сообщений от имени PgAdmins.

Я также получил предложение от 500 $ за то, чтобы кто-то перешел на код PgAmin III. Разработчик PgAdmin, не будет изменять код, только из-за Heroku.

Что я должен делать? PgAdmin превосходит во многих отношениях, он просто имеет этот недостаток.

11
К вашему сведению, Heroku не единственная с этой проблемой. Мы сталкиваемся с этой проблемой на виртуальной машине Linux, размещенной в Azure, и я думаю, что проблема заключается в том, что поставщик услуг закрывает неактивные TCP-соединения. Было бы очень хорошо, если бы PgAdmin мог выставить опцию keep alive Jonas Stawski 7 лет назад 0
У меня была эта проблема с pgadmin с 2002 года! Конечно, pgadmin может быть закодирован для автоматического переподключения по истечении времени ожидания, вместо того, чтобы заставлять вас закрывать приложение, открывать его снова и снова открывать все дерево? Matthew Lock 6 лет назад 1

1 ответ на вопрос

15
Craig Ringer

libpqлежащая в основе клиентская библиотека PostgreSQL, имеет keepalivesвозможность включить поддержку активности TCP .

Похоже, что PgAdmin-III не позволяет вам указывать произвольные параметры соединения напрямую, но есть обходной путь.

Когда вы посмотрите на конфигурацию соединения в PgAdmin-III, вы увидите опцию «сервис». Это относится к файлу службы подключения . Чтобы использовать его, создайте ~/.pg_service.confсодержимое, например:

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

и при подключении из PgAdmin-III введите myherokudbв serviceполе.

Это приведет к тому, что PgAdmin-III будет использовать параметры соединения, указанные в служебном файле, включая включение keepalive.

(Если вы работаете в Windows, служебный файл может находиться в другом месте; см. Документацию).

Там нет переменной окружения libpqдля управления keepalive, поэтому вы не можете установить ее таким образом, вам придется использовать служебный файл.

Добавление поддержки дополнительных параметров подключения в PgAdmin-III или флажок в параметрах подключения для управления параметром keepalives должен быть довольно тривиальным. Интересно, понял ли Дейв то, о чем вы просили, по поводу вашего предложения о финансировании работы.


Обновление : файл службы ищется в месте, указанном в PGSYSCONFDIRпеременной среды. Если не установлено, по умолчанию используется местоположение для конкретной платформы, которое, похоже, не документировано должным образом для Windows. Я отправлю документацию патча. Документация для него.pgpass показывает его путь, как %APPDATA%\postgresql\pgpass.confи ~/.pg_service.confдолжно быть %APPDATA%\postgresql\pg_service.conf... но это не так.

На самом деле правильный путь:

%APPDATA%\postgresql\.pg_service.conf 

Так:

  • Пуск-> Выполнить
  • `% APPDATA%
  • создать каталог "postgresql", если он не существует
  • создайте файл ".pg_service.conf" в виде текстового файла с содержимым, приведенным выше (см. примечание ниже по поводу именования файлов)
  • В PgAdmin-III введите «localhost» в поле «Имя хоста» и имя службы в поле «Служба».

Я проверил на Windows, и обнаружил, что вы не можете оставить hostполе в PgAdmin-III пустым в Windows. PgAdmin-III, кажется, переопределяет любой хост, указанный в служебном файле, тем, что указан в диалоге соединения. Поэтому вам не следует включать hostключ в служебный файл. (Я сообщу об ошибке).

В Windows отключена функция «скрывать расширения файлов для известных типов файлов», поэтому вы не случайно вызываете ее .pg_service.conf.txt. Если вы не уверены, правильно ли оно названо или нет, проверьте столбец «Тип» в проводнике Windows в виде списка; он будет читать «Текстовый документ», если он имеет неправильное имя .pg_service.conf.txtи CONF Fileесли он правильно назван .pg_service.conf. Если у вас возникли проблемы с переименованием, отключите «скрывать расширения файлов для известных типов файлов» или используйте удобный текстовый редактор, такой как notepad ++, который позволит вам создавать файлы с именами, которые вам нравятся.

Обратите внимание на начальный период (точка) в имени файла. Да, это отличается от pgpass.conf, и да, это раздражает, граничит с ошибкой.

Большое спасибо за это! Я потратил 45 минут, пытаясь это сделать на своем компьютере с Windows 7. Во-первых, я не могу оставить поле «хост» пустым. Он отключит кнопку «ОК» в этом диалоге. Я попытался использовать «-» в качестве хоста, что привело меня ко второй проблеме. Я не знаю, где разместить файл pg_service.conf. Я попытался сделать метод проб и ошибок и поместил его во все подкаталоги, связанные с PgAdmin III, а также в C: \ Users \ pc \ AppData \ Roaming \ postgresql. Я всегда получал ошибку: "Определение сервиса" myherokudb "не найдено. David 10 лет назад 0
Я также попытался прочитать о pg_service.conf, но, похоже, нахожу документацию, относящуюся к нему, только в контексте на стороне сервера. David 10 лет назад 1
Я не знаю, откуда у вас "серверный контекст", учитывая, что документация, на которую я ссылаюсь, относится к клиенту. Если только вы не предполагаете, что «unix / linux» означает «сервер», это не так. Поскольку вы изначально не удосужились упомянуть, на какой ОС вы работали, я не могу быть более конкретным. Теперь я обновил ответ информацией, специфичной для Windows (и, честно говоря, достаточно справедливо, что вы были сбиты с толку). Кроме того, в Windows PgAdmin-III, кажется, переопределяет хост, указанный в служебном файле, на тот, который указан в пользовательском интерфейсе, поэтому оставьте `host` в служебном файле пустым. Craig Ringer 10 лет назад 0
Спасибо большое за вашу помощь! Ваше решение просто работает! Меня смутила главная точка в имени файла, я думал, что это Linux. Еще раз спасибо! David 10 лет назад 0
На самом деле, это решение не работает в конце концов. Мне потребовалось много времени, чтобы прийти к такому выводу, подумав, что это вызвало нестабильность моей сети и т. Д., Но соединение действительно все еще истекло. Я уверен, что я следовал вашему описанию. Это может быть случай, когда heroku создала что-то, чтобы избежать тысяч соединений с их бесплатными тестовыми серверами, на которых размещены сотни бесплатных баз данных. David 10 лет назад 2
`keepalives = 1` [уже должно быть по умолчанию в соответствии с документацией] (https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-PARAMKEYWORDS), поэтому я добавил` connect_timeout = 20` и `keepalives_idle = 10`. Кажется, работает после перезапуска pgadmin. mivk 7 лет назад 0
Будет ли это работать на pgAdmin 4? В пользовательском интерфейсе нет поля "service", поэтому я должен ввести `myherokudb` (например) в поле имени? Desmond Lee 7 лет назад 0