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.