रूबी टीसीपी सर्वर - त्रुटि: पीजी :: कनेक्शनबैड: फाटल: शेष कनेक्शन स्लॉट गैर-प्रतिकृति सुपरसुर कनेक्शन के लिए आरक्षित हैं - रूबी, पोस्टग्रेस्क्ल, सॉकेट, टीसीपी, सीक्वेल

मैंने एक टीसीपी सर्वर लिखा है जो टर्मिनल डिवाइस से पैकेट प्राप्त करता है। टीसीपी सर्वर डेटा की व्याख्या करता है और इसे पोस्टग्रेज़ का उपयोग करके डेटाबेस में सहेजता है।

टीसीपी सर्वर बहु ​​थ्रेडेड है। इस समय के कोड का नमूना मैं डीबी कनेक्शन खोलता हूं और डेटा को सहेजता हूं;

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

कुछ पैकेट के बाद, डीबी इस तरह की एक त्रुटि बनाता है; ERROR:PG::ConnectionBad: FATAL: remaining connection slots are reserved for non-replication superuser connections

लाइन भी जोड़ना conn.disconnect इस मुद्दे की मदद नहीं करता है।

उत्तर:

उत्तर № 1 के लिए 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

संबंधित सवाल
सबसे लोकप्रिय