Любой способ сохранить соединение в pgAdmin, не устанавливая его на сервере?

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

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

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

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

2 ответа

Решение

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

Похоже, что 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 для контроля активности, поэтому вы не можете установить его таким образом, вам придется использовать служебный файл.

Добавление поддержки дополнительных параметров подключения в 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 и да, это раздражает, граничит с ошибкой.

Просто выполните следующую команду в базе данных и все готово.

ALTER ROLE user_name_here В БАЗЕ ДАННЫХ имя_базы_данных_here SET tcp_keepalives_idle TO '30';

Другие вопросы по тегам