У нас есть 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, о котором идет речь, является удаленным.
Если это проблема с keepalive, почему бы мне не увидеть какой-либо тайм-аут, и он отлично работает на интерфейсе loopback.Я уверен, что соединение loopback работает через * TCP-сокет * и ** не ** * unix socket *, так как я могу обнюхать пакет через TCP через * tcpdump *. – Viren
Это хороший ответ, предлагающий проверить тайм-аут Java-сокета. не может объяснить, почему он работает, используя ** lo **, но, возможно, его обработка так-тайм-аут по-другому. уже видели устаревшие соединительные разъемы DB с JRuby, хотя никогда не были localhost, поэтому было бы интересно, если бы вы могли подтвердить тест и подтвердить, что происходит (с таймаутами). – kares