org.postgresql.util.PSQLException: FATAL: क्षमा करें, बहुत सारे ग्राहक पहले से ही


93

मैं एक Postgresql डेटाबेस से कनेक्ट करने का प्रयास कर रहा हूं, मुझे निम्नलिखित त्रुटि मिल रही है:

त्रुटि: org.postgresql.util.PSQLException: FATAL: क्षमा करें, बहुत सारे ग्राहक

त्रुटि का क्या अर्थ है और मैं इसे कैसे ठीक करूं?

मेरी server.propertiesफाइल निम्नलिखित है:

serverPortData=9042
serverPortCommand=9078
trackConnectionURL=jdbc:postgresql://127.0.0.1:5432/vTrack?user=postgres password=postgres
dst=1
DatabaseName=vTrack
ServerName=127.0.0.1
User=postgres
Password=admin
MaxConnections=90
InitialConnections=80
PoolSize=100
MaxPoolSize=100
KeepAliveTime=100
TrackPoolSize=120
TrackMaxPoolSize=120
TrackKeepAliveTime=100
PortNumber=5432
Logging=1

जवाबों:


38

हमें पता नहीं है कि सर्वर.प्रॉफर्टी फाइल क्या है, हम न तो जानते हैं कि सिमकोपोलिसाइज का मतलब क्या है (क्या आप?)

चलो अनुमान लगाते हैं कि आप डेटाबेस कनेक्शन के कुछ कस्टम पूल का उपयोग कर रहे हैं। फिर, मुझे लगता है कि समस्या यह है कि आपके पूल को 100 या 120 कनेक्शन खोलने के लिए कॉन्फ़िगर किया गया है, लेकिन आप पोस्टग्रैस्कल सर्वर को स्वीकार करने के लिए कॉन्फ़िगर किया गया है MaxConnections=90। ये परस्पर विरोधी सेटिंग्स लगती हैं। बढ़ाने का प्रयास करें MaxConnections=120

लेकिन आपको पहले अपने db लेयर इंफ्रास्ट्रक्चर को समझना चाहिए, जानिए कि आप किस पूल का उपयोग कर रहे हैं, अगर आपको वास्तव में पूल में बहुत सारे खुले कनेक्शन की आवश्यकता है। और, विशेष रूप से, यदि आप खुले रूप से पूल में खोले गए कनेक्शन वापस कर रहे हैं


168

निम्नलिखित त्रुटि का स्पष्टीकरण:

org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

सारांश:

आपने डेटाबेस से कनेक्शन की अनुमत सीमा से अधिक खोला है। आप कुछ इस तरह भागे: Connection conn = myconn.Open();एक लूप के अंदर, और दौड़ना भूल गए conn.close();। सिर्फ इसलिए कि आपकी कक्षा नष्ट हो गई है और एकत्र कचरा डेटाबेस से कनेक्शन जारी नहीं करता है। इसका सबसे तेज़ निर्धारण यह सुनिश्चित करना है कि आपके पास कनेक्शन बनाने वाले किसी भी वर्ग के साथ निम्नलिखित कोड है:

protected void finalize() throws Throwable  
{  
    try { your_connection.close(); } 
    catch (SQLException e) { 
        e.printStackTrace();
    }
    super.finalize();  
}  

उस कोड को किसी भी वर्ग में रखें जहाँ आप एक कनेक्शन बनाते हैं। फिर जब आपकी कक्षा में कचरा एकत्र किया जाएगा, तो आपका कनेक्शन जारी कर दिया जाएगा।

अनुमति के लिए अधिकतम कनेक्शन देखने के लिए इस SQL ​​को चलाएँ:

show max_connections;

डिफ़ॉल्ट 100 है। अच्छे हार्डवेयर पर PostgreSQL एक बार में कुछ सौ कनेक्शन का समर्थन कर सकता है। यदि आप हजारों चाहते हैं, तो आपको कनेक्शन ओवरहेड को कम करने के लिए कनेक्शन पूलिंग सॉफ़्टवेयर का उपयोग करने पर विचार करना चाहिए।

अपने कनेक्शनों को खोलने के लिए कौन / क्या / कब / कहां / क्या देख रहा है:

SELECT * FROM pg_stat_activity;

वर्तमान में उपयोग किए जाने वाले कनेक्शनों की संख्या है:

SELECT COUNT(*) from pg_stat_activity;

डिबगिंग की रणनीति

  1. आप उन प्रोग्रामों को अलग-अलग उपयोगकर्ता नाम / पासवर्ड दे सकते हैं जो शायद यह पता लगाने के लिए कनेक्शन जारी नहीं कर रहे हैं कि यह कौन है, और फिर pg_stat_activity में यह पता लगाने के लिए कि कौन सा खुद के बाद सफाई नहीं कर रहा है।

  2. एक पूर्ण अपवाद स्टैक ट्रेस करें जब कनेक्शन नहीं बनाया जा सकता है और कोड का अनुसरण करें जहां आप एक नया Connectionबनाते हैं, तो सुनिश्चित करें कि हर कोड लाइन जहां आप कनेक्शन बनाते हैं, उसके साथ समाप्त होता हैconnection.close();

अधिक से अधिक max_connections कैसे सेट करें:

postgresql.conf में max_connections डेटाबेस सर्वर के समवर्ती कनेक्शन की अधिकतम संख्या निर्धारित करता है।

  1. सबसे पहले अपनी postgresql.conf फाइल को खोजें
  2. यदि आप नहीं जानते कि यह कहां है, तो डेटाबेस को sql से क्वेरी करें: SHOW config_file;
  3. मेरा है: /var/lib/pgsql/data/postgresql.conf
  4. रूट के रूप में लॉगिन करें और उस फ़ाइल को संपादित करें।
  5. स्ट्रिंग के लिए खोजें: "max_connections"।
  6. आपको एक पंक्ति दिखाई देगी जो कहती है max_connections=100
  7. उस नंबर को बड़ा सेट करें, अपने पोस्टग्रैस्कल संस्करण के लिए सीमा की जांच करें।
  8. परिवर्तनों को प्रभावी करने के लिए postgresql डेटाबेस को पुनरारंभ करें।

अधिकतम max_connections क्या है?

इस क्वेरी का उपयोग करें:

select min_val, max_val from pg_settings where name='max_connections';

मुझे वह मूल्य मिलता है 8388607, सिद्धांत रूप में, जो आपके पास सबसे अधिक अनुमति है, लेकिन फिर एक भगोड़ा प्रक्रिया हजारों कनेक्शन खा सकती है, और आश्चर्य की बात है कि आपका डेटाबेस रीबूट होने तक अनुत्तरदायी है। यदि आपके पास 100 की तरह एक समझदार max_connections है। अपमानजनक कार्यक्रम एक नए कनेक्शन से इनकार किया जाएगा।


4
कुछ लोग 'क्यों भूल जाते हैं?' SQL बयानों के बाद ?! प्रतिलिपि बनाता है और एक पेस्ट पेस्ट करता है :)
कोडवर्ड

@ कॉडरविंस आपको ध्यान देना होगा। मैं लगभग यह कहना चाहूंगा कि आपको कॉपी + पेस्ट के बजाय कमांडों को स्थानांतरित करना चाहिए।
19

4

MaxConnections और InitialConnections को बढ़ाने की आवश्यकता नहीं है। अपना काम करने के बाद बस अपने कनेक्शन बंद कर दें। उदाहरण के लिए यदि आप कनेक्शन बना रहे हैं:

try {
     connection = DriverManager.getConnection(
                    "jdbc:postgresql://127.0.0.1/"+dbname,user,pass);

   } catch (SQLException e) {
    e.printStackTrace();
    return;
}

अपना काम बंद करने के बाद:

try {
    connection.commit();
    connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}

11
हमेशा अंत में ब्लॉक में कनेक्शन बंद करो! अन्यथा त्रुटि होने पर कनेक्शन खुला रहता है।
tine2k

1

निम्नलिखित पंक्तियाँ निम्नलिखित हैं:

MaxConnections=90
InitialConnections=80

आप अधिक कनेक्शन की अनुमति देने के लिए मान बढ़ा सकते हैं।


4
और अगर आपके पास अधिक कनेक्शन होंगे तो मेमोरी पैरामीटर समायोजित करने के साथ-साथ बढ़े हुए कनेक्शन के साथ संरेखित करने की अनुमति होगी।
कुबेरचुन

0

आपको उदाहरण के लिए अपने सभी संदर्भों को बंद करने की आवश्यकता है: यदि आप एक INSERT INTO स्टेटमेंट बनाते हैं, तो आपको इस तरह से स्टेटमेंट और अपने कॉन्सेप्शन को बंद करने की आवश्यकता है:

statement.close();
Connexion.close():

और यदि आप एक सेलेक्ट स्टेटमेंट बनाते हैं तो आपको स्टेटमेंट, कंसीलर और परिणाम को इस तरह से बंद करना होगा:

resultset.close();
statement.close();
Connexion.close();

मैंने यह किया और यह काम किया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.