2016-06-29 14 views
0

Ich habe einen TCP-Server geschrieben, der Pakete von einem Endgerät empfängt. Der TCP-Server interpretiert die Daten und speichert sie in der Datenbank mit Postgres.Ruby TCP-Server - FEHLER: PG :: ConnectionBad: FATAL: verbleibende Verbindungssteckplätze sind reserviert für Nicht-Replikation Superuser-Verbindungen

Der TCP-Server ist multi-threaded. Ein Beispiel des Codes des Moments, in dem ich die Datenbankverbindung öffne und Daten speichere, sieht so aus;

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 

Nach ein paar Paketen erzeugt die db einen Fehler wie diesen; ERROR:PG::ConnectionBad: FATAL: remaining connection slots are reserved for non-replication superuser connections

Hinzufügen Auch die Linie conn.disconnect hat das Problem nicht helfen.

Antwort

1

Die Idee, jedes Mal eine Verbindung zur Datenbank herzustellen, wenn Sie einen Datensatz erstellen möchten, ist nicht der beste Ansatz. Denke darüber nach, es in einen Verbindungspool zu ändern.

Wenn Sie jedoch immer wieder eine Verbindung herstellen möchten, versuchen Sie, die Blockform von connect zu verwenden, die sicherstellt, dass die Verbindung nach Abschluss des Blocks geschlossen wird.

Auch gab es keine enge/disconnect in Ihrem Code, vielleicht setzen Sie es nach return Anruf (das heißt, es wurde nicht ausgeführt)

so etwas wie dieses Versuchen:

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

Sie hatten Recht zu trennen nach der Rückkehr Aussage. Vielen Dank – Acacia