sql >> データベース >  >> RDS >> PostgreSQL

Python Postgrespsycopg2ThreadedConnectionPoolが使い果たされました

    ThreadedConnectionPoolがどのように機能するかについての本当に詳細な情報を見つけるのに苦労しました。 https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html悪くはありませんが、接続が利用可能になるまでgetconnがブロックするという主張は正しくありません。コードを確認すると、ThreadedConnectionPoolが追加するのは、競合状態を防ぐためのAbstractConnectionPoolメソッドの周りのロックです。いずれかの時点でmaxconnを超える接続が使用されようとすると、接続プールが使い果たされます PoolErrorが発生します。

    受け入れられた答えよりも少し単純なものが必要な場合は、接続が利用可能になるまでブロックを提供するセマフォでメソッドをさらにラップすると、トリックが実行されます。

    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. SQLServerの命名規則または命名規則に従ってすべてのデフォルト制約の名前を変更する方法-SQLServer/TSQLチュートリアルパート93

    2. WHEREがUUIDまたは文字列であるPostgresSELECT

    3. 内部クエリを使用したORDERBY、ORA-00907に右括弧がありません

    4. Oracleで文字列の一部を削除する方法