Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Соединение разорвано другой стороной  [new]
Сергей Бабичев
Member

Откуда:
Сообщений: 13
Коллеги, может кто-нибудь сталкивался с такой проблемой.
На компе А работает сервис, написанный на qt. Периодически, раз в 10 секунд он вызывает хранимую процедуру (ХП) из базы ПГ. Процедура связывается через postgres_fdw в компом В. Они делают там инсерты и апдейты, таким образом синхронизируют две базы на разных серверах. Почему выбран такой способ синхронизации, а не штатный сейчас не будем обусждать вопрос не в этом.
При закрытии соединения с базой после выполнения ХП на компе В в логе Постгреса появляется запись " СООБЩЕНИЕ: не удалось получить данные от клиента: Соединение разорвано другой стороной". ХП вызывалась с компа А, но в его логе никаких сообщений не появляется.
void TaskThread::run()
{
    DB *db = new DB(Name);
    db->DelayAfterSql = DELAY_AFTER_QUERY_SEC;
    try {
        log->Write("Запуск скрипта " + Command + " для " + Name);
        db->Connect(sett->host,sett->user,sett->pass,sett->port,sett->dbname);
        if (db->Connected()) {
           db->sQuery = Command;
           db->execSQL();                                                 // здесь  выполняется вызов ХП
           if (db->DelayAfterSql > 0) sleep(static_cast<unsigned long>(db->DelayAfterSql));
           } else {
           log->Write("База недоступна " + db->getError());
        }
        log->Write("Скрипт выполнен для " + Name + " рез. " + db->getError());
        db->Close();                                                          // А здесь появляется это сообщение в логе компа В


    } catch (...) {
        log->Write("Ошибка выполнения " );
    }
    delete db;
    QSqlDatabase::removeDatabase(Name);
    emit finished();
    return;
}


Всю ХП я приводить не буду, ибо большая. Ее работа сводится к сбору id записей с компа В а потом вставку их в свою таблицу
    INSERT INTO  TMP_CLUST_DATA_INSERT 
    select
        * 
    from
        (
            select
                R.Report_ID
            from
                sync.T20_DATA as R
            left  join
                T20_DATA as L
            on
                R.Report_ID = L.Report_ID
            where
                L.Report_ID is Null 
        ) as Qry
    limit 5000

.............
  INSERT  /*+ APPEND*/    INTO T20_DATA
    SELECT
    ROWGUID                           ,
    REPORT_ID                         ,
    и еще куча полей....  
    FROM sync.T20_DATA
    WHERE Report_ID   IN ( select MYREPORTID from TMP_CLUST_DATA_INSERT)   


TMP_CLUST_DATA_INSERT - временная таблица, создается в этой же ХП

Самое прикольное, что если я вызываю эту ХП из PgAdmin, то никакого сообщения нигде не появляется. Правда Админ не закрывает соединение с базой после выполнения запроса, а моя прога закрывает. И это сообщение появляется именно на закрытии соединения.
Есть какие - нибудь идеи?
20 июл 20, 14:50    [22170457]     Ответить | Цитировать Сообщить модератору
 Re: Соединение разорвано другой стороной  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1122
postgres_fdw кэширует использованные в сессии соединения (contrib/postgres_fdw/connection.c)
А вот их закрытия при завершении процесса я как-то не вижу. Как собственно и подходящего callback на завершении процесса. Поэтому для базы, к которой postgres_fdw подключался и выглядит как закрытие сетевого соединения.

Ну как похожая на правду теория, которую мне неохота проверять глубже чем взглядом в исходник.
20 июл 20, 15:56    [22170511]     Ответить | Цитировать Сообщить модератору
 Re: Соединение разорвано другой стороной  [new]
Сергей Бабичев
Member

Откуда:
Сообщений: 13
В доке не пишут, что соединение нужно специально открывать и закрывать.
А есть такая возможность принудительного завершения сеанса? Наверное мне его как раз и не хватает
20 июл 20, 16:01    [22170516]     Ответить | Цитировать Сообщить модератору
 Re: Соединение разорвано другой стороной  [new]
Сергей Бабичев
Member

Откуда:
Сообщений: 13
Melkij, не подскажете как закрыть сеанс в fdw?
20 июл 20, 16:09    [22170522]     Ответить | Цитировать Сообщить модератору
 Re: Соединение разорвано другой стороной  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1122
Сергей Бабичев
В доке не пишут, что соединение нужно специально открывать и закрывать.

Верно, не нужно

Сергей Бабичев
Melkij, не подскажете как закрыть сеанс в fdw?

Никак
20 июл 20, 17:51    [22170585]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить