2016-06-29 1 views
0

Я написал tcp-сервер, который принимает пакеты с терминального устройства. Сервер TCP интерпретирует данные и сохраняет их в базе данных с помощью postgres.Ruby TCP server - ОШИБКА: PG :: ConnectionBad: FATAL: оставшиеся слоты для подключения зарезервированы для соединений с невосстанавливаемым суперпользователем

Сервер tcp является многопоточным. Образец кода момента, когда я открываю соединение db и сохраняю данные, выглядит следующим образом:

conn = Sequel.connect('postgres://xxxxx:[email protected]:xxxxx/xxxxxxxxx',:max_connections => 100) # requires pg 
transactions = conn.from(:transactions) 
if transactions.insert(serial_number: card_serial, balance_before: balance_before, amount: transaction_amount, balance_after: balance_after, transaction_time: time, terminal_number: terminal_number, terminal_type: terminal_type, created_at: Time.now, updated_at: Time.now) 
    response = {message: "TT01000080", status: "SUCCESS" } 
    return response 
else 
    response = {message: "", status: "FAILED" } 
    return response 
end 

После нескольких пакетов db создает ошибку, подобную этой; ERROR:PG::ConnectionBad: FATAL: remaining connection slots are reserved for non-replication superuser connections

Даже добавив строку conn.disconnect не помогает вопрос.

ответ

1

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

Но если вы все еще хотите подключаться каждый раз, попробуйте использовать форму блока соединения, которая гарантирует, что соединение будет закрыто после завершения блока.

Также не было близко/отключить в коде, может быть, вы положили его после return вызова (что означает, что он не был выполнен)

Попробуйте что-то вроде этого:

response = nil 
Sequel.connect('postgres://xxxxx:[email protected]:xxxxx/xxxxxxxxx',:max_connections => 100) do |conn| # requires pg 
    transactions = conn.from(:transactions) 
    if transactions.insert(serial_number: card_serial, balance_before: balance_before, amount: transaction_amount, balance_after: balance_after, transaction_time: time, terminal_number: terminal_number, terminal_type: terminal_type, created_at: Time.now, updated_at: Time.now) 
    response = {message: "TT01000080", status: "SUCCESS" } 
    else 
    response = {message: "", status: "FAILED" } 
    end 
end 
return response 
+0

Вы были правы насчет отключения после заявления о возврате. благодаря – Acacia

Смежные вопросы

 Смежные вопросы