1
resposta

Estouro no pool de conexões com o PostgreSQL.

Caros, boa noite!

Após construir uma API e integrar outras duas com o web.py, me deparei com um problema de performance relacionado a operações com banco. Decidi implementar um pool de conexões com ThreadedConnectionPool, já que estou utilizando o driver psycopg2 e PostgreSQL como SGBD. Para melhor organizar o código, criei uma classe com os métodos principais:

...
# PostgreSQL Max Connections = 100
# db_pool_min = 05
# db_pool_max = 50

pool = ThreadedConnectionPool(db_pool_min, db_pool_max, srt_conn)

class BaseDao:

    def __init__(self):       
        logging.basicConfig(format='''%(asctime)s %(levelname)s: %(name)s - %(message)s''',  level=logging.INFO)

        self.logger = logging.getLogger(__name__)
        self.db_schema = config.db_schema

        self.conn = pool.getconn()
        self.cursor = self.conn.cursor()

    def commit(self):
        self.conn.commit()

    def close(self):
        pool.putconn(conn=self.conn)

    def execute(self, sql, vars=None):
        self.cursor.execute(sql, vars)
...

Instanciei a mesma nas minhas classes DAO relacionadas às minhas classes modelo, como por exemplo:

...
class NamespaceDao(BaseDao):

    def __init__(self):
        BaseDao.__init__(self)
...

As minhas consultas obedecem o padrão:

...
def consultar(sistema=None, dia=None):

    logging.info("Abrindo conexoes de banco...")
    namespaceDao = NamespaceDao()
    extratoDao = ExtratoContainerDao()
...
    logging.info("Liberando conexoes de banco...")
    namespaceDao.close()
    extratoDao.close()
...

Para minha surpresa, estou recebendo um 500 bonito nas requisições em certos momentos e, nos logs da aplicação, consta o erro: connection pool exhausted

Alguém poderia me dar uma luz de como proceder?

Desde já, agradeço a colaboração e aguardo retorno.

1 resposta

Nunca usei postgress com Python, mas depois de usar a conexão você deveria devolvê-la para o pool. Tem que ver como fazer isso com o driver do postgres.