sql >> Databáze >  >> RDS >> PostgreSQL

Python Postgres psycopg2 ThreadedConnectionPool vyčerpán

Snažil jsem se najít opravdu podrobné informace o tom, jak ThreadedConnectionPool funguje. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html není špatné, ale ukázalo se, že jeho tvrzení, že getconn blokuje, dokud nebude dostupné připojení, je nesprávné. Při kontrole kódu, který ThreadedConnectionPool přidává, je zámek kolem metod AbstractConnectionPool, aby se zabránilo konfliktům. Pokud se v kterémkoli okamžiku pokusí použít více než maxconn připojení, fond připojení je vyčerpán Bude vyvolána chyba PoolError.

Pokud chcete něco trochu jednoduššího, než je přijatá odpověď, mělo by stačit další zabalení metod do semaforu poskytujícího blokování, dokud nebude dostupné připojení:

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. Získejte poslední den v měsíci v SQL

  2. ORA-12154 nedokázal vyřešit zadaný identifikátor připojení

  3. Určení OID tabulky v Postgres 9.1?

  4. Použití Oracle JDeveloper 12c s Oracle Database 12c na platformě Oracle Cloud, část 2