PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL में स्वचालित रूप से निष्क्रिय कनेक्शन कैसे बंद करें?

रुचि रखने वालों के लिए, यहां क्रेग रिंगर की टिप्पणी से प्रेरित समाधान है:

<ब्लॉकक्वॉट>

(...) यह देखने के लिए क्रॉन जॉब का उपयोग करें कि कनेक्शन आखिरी बार कब सक्रिय था (देखें pg_stat_activity) और पुराने लोगों को मारने के लिए pg_terminate_backend का उपयोग करें।(...)

चुना हुआ समाधान इस तरह नीचे आता है:

  • सबसे पहले, हम Postgresql 9.2 में अपग्रेड करते हैं।
  • फिर, हम एक थ्रेड को हर सेकेंड चलाने के लिए शेड्यूल करते हैं।
  • जब थ्रेड चलता है, तो यह किसी पुराने निष्क्रिय कनेक्शन की तलाश करता है।
    • एक कनेक्शन को निष्क्रिय माना जाता है यदि इसकी स्थिति . है या तो idle है , idle in transaction , idle in transaction (aborted) या disabled
    • एक कनेक्शन को पुराना माना जाता है यदि इसकी स्थिति . है 5 मिनट से अधिक समय तक वही रहा।
  • ऐसे अतिरिक्त सूत्र हैं जो ऊपर के समान ही करते हैं। हालांकि, वे थ्रेड अलग-अलग उपयोगकर्ता के साथ डेटाबेस से जुड़ते हैं।
  • हम अपने डेटाबेस से जुड़े किसी भी एप्लिकेशन के लिए कम से कम एक कनेक्शन खुला छोड़ देते हैं। (rank() समारोह)

यह थ्रेड द्वारा चलाई जाने वाली SQL क्वेरी है:

WITH inactive_connections AS (
    SELECT
        pid,
        rank() over (partition by client_addr order by backend_start ASC) as rank
    FROM 
        pg_stat_activity
    WHERE
        -- Exclude the thread owned connection (ie no auto-kill)
        pid <> pg_backend_pid( )
    AND
        -- Exclude known applications connections
        application_name !~ '(?:psql)|(?:pgAdmin.+)'
    AND
        -- Include connections to the same database the thread is connected to
        datname = current_database() 
    AND
        -- Include connections using the same thread username connection
        usename = current_user 
    AND
        -- Include inactive connections only
        state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled') 
    AND
        -- Include old connections (found with the state_change field)
        current_timestamp - state_change > interval '5 minutes' 
)
SELECT
    pg_terminate_backend(pid)
FROM
    inactive_connections 
WHERE
    rank > 1 -- Leave one connection for each application connected to the database


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेएसक्यूएल - ग्रुप बाय क्लॉज या एक समग्र कार्य में उपयोग किया जा सकता है

  2. आप तारीख गणित कैसे करते हैं जो वर्ष की उपेक्षा करता है?

  3. PostgreSQL में टाइमस्टैम्प से दिनांक (yyyy/mm/dd) निकालें

  4. अंतिम सम्मिलित आईडी के लिए PostgreSQL फ़ंक्शन

  5. पोस्टग्रेस्क्ल पोर्ट भ्रम 5433 या 5432?