2016-04-17 4 views
1

У нас есть Postgres как наша база данных. Наш процесс выполняет определенную работу (т. Е. Некоторые вставки/обновления в БД), а затем спать в течение часа.простаивающее соединение в postgres, вызывающее процесс застревания или приводит к ошибке

Это то, что мы заметили. Пока время нашего процесса спадает, состояние соединения Postgres рассматривается как незанятое.

postgres 5045 0.3 0.4 231220 33780 ?  Ss 12:13 0:16 postgres: scp scp_test x.x.x.x(60400) idle  

Теперь мой вопрос?

Если у меня есть процесс, который спать в течение часа.

Может ли Postgres закрыть незанятое соединение через некоторое время?

Поскольку на следующем запуск процесса не в состоянии вставить/обновить любую запись в БД.

Вот как выглядит мой код.

$logger = Logger.new('log/checker.log') 
    last_modified = Time.now 
    while 
    if (last_modified == File.mtime(file_path)) 
     $logger.info "Sleeping for 1 hour" 
     sleep 3600 
    else 
     $logger.info "Inserting the file mtime changed .." 
     last_modified = File.mtime(file_path) 
     $logger.info "File modified ....." 
     attributes = Test.testFile(file_path) 
     index = 0 
     $logger.info "........Index set......" 
     header_attributes = attributes.shift 
     $logger.info "...........Header removed..........." 
     trailer_attributes = attributes.pop 
     $logger.info "...Trailer removed......." 
     count = attributes.count 
     $logger.info "............Count calculated #{count} ........." 
     attributes.each_slice(50000) { |records| 
     _records = initialize_records(records) 
     _records.each { |record| 
      record.save 
      index += 1 
      $logger.info "Inserting ...... [#{index}/#{count}]" 
     } 
    } 
    $logger.info "Completed insertion of #{count}" 
    end 
end 

Испытано это с версией

Ruby-2.2.2 - ActiveRecord-4.2.6 - pg-0.18.0 
Ruby-2.3.0 - ActiveRecord-4.2.6 - pg-0.18.0 
Jruby-9.0.5.0 - ActiveRecord-4.2.6 - activerecord-jdbc-adapter 

Postgres.

PostgreSQL 9.4.5 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit 
(1 row) 

Есть 1 разница между выходом Ruby и JRuby?

Хотя оба процесса застревают после того, как они просыпаются от сна

Процесс Рубин умирает с PG::UnableToSend: SSL SYSCALL error: EOF detected ошибки

но процесс JRuby застревает навсегда (не умирает).

Не знаете, где проблема, так как я не могу указать какую-либо конкретную библиотеку или код на этом этапе.

Примечание: Работает отлично на интерфейсе обратной петли. Сервер postgres, о котором идет речь, является удаленным.

ответ

0

Внутри папки данных есть файл с именем postgresql.conf, вы должны настроить его для отправки сообщения keepalive клиенту. Читайте this для получения дополнительной информации.

Настройка postgresql.conf

Ваш файл postgresql.conf должен иметь строку этой tcp_keepalives_idle. Если вы хотите отправить сообщение keepalive на клиентский компьютер каждые 5 минут; Обновление tcp_keepalives_idle линии, как этот

tcp_keepalives_idle = 300

Убедитесь, раскомментировать эту строку, удалив # знак.

+0

Если это проблема с keepalive, почему бы мне не увидеть какой-либо тайм-аут, и он отлично работает на интерфейсе loopback.Я уверен, что соединение loopback работает через * TCP-сокет * и ** не ** * unix socket *, так как я могу обнюхать пакет через TCP через * tcpdump *. – Viren

+0

Это хороший ответ, предлагающий проверить тайм-аут Java-сокета. не может объяснить, почему он работает, используя ** lo **, но, возможно, его обработка так-тайм-аут по-другому. уже видели устаревшие соединительные разъемы DB с JRuby, хотя никогда не были localhost, поэтому было бы интересно, если бы вы могли подтвердить тест и подтвердить, что происходит (с таймаутами). – kares