sql >> Database >  >> RDS >> PostgreSQL

Python Postgres psycopg2 ThreadedConnectionPool uitgeput

Ik heb moeite om echt gedetailleerde informatie te vinden over hoe de ThreadedConnectionPool werkt. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html is niet slecht, maar het blijkt dat de bewering dat getconn blokkeert totdat er een verbinding beschikbaar is, onjuist is. Door de code te controleren, voegt ThreadedConnectionPool alleen een slot toe rond de AbstractConnectionPool-methoden om race-omstandigheden te voorkomen. Als er op enig moment meer dan maxconn-verbindingen worden geprobeerd, is de verbindingspool uitgeput PoolError wordt opgeworpen.

Als je iets eenvoudiger wilt dan het geaccepteerde antwoord, zou het voldoende moeten zijn om de methoden verder te verpakken in een semafoor die de blokkering biedt totdat er een verbinding beschikbaar komt:

from psycopg2.pool import ThreadedConnectionPool
from threading import Semaphore

class ReallyThreadedConnectionPool(ThreadedConnectionPool):
    def __init__(self, minconn, maxconn, *args, **kwargs):
        self._semaphore = Semaphore(maxconn)
        super().__init__(minconn, maxconn, *args, **kwargs)

    def getconn(self, *args, **kwargs):
        self._semaphore.acquire()
        return super().getconn(*args, **kwargs)

    def putconn(self, *args, **kwargs):
        super().putconn(*args, **kwargs)
        self._semaphore.release()


  1. Retourneer de Unix-tijdstempel in PostgreSQL

  2. PDF-bestanden maken met PLSQL in Oracle

  3. Waarom staat MySQL group by queries toe ZONDER aggregatiefuncties?

  4. Voorbeelden van opmaak 'datetimeoffset' in SQL Server met behulp van Standard Format Strings (T-SQL)