Definición de Pool de Conexiones:
Es un conjunto limitado de conexiones hacia una base de datos, estas conexiones son reutilizables por los usuarios, este es manejado por un servidor de aplicaciones.
Aplicación:
Primero crearemos un archivo para la clase conexión , aquí pondremos todo lo referente a la conexión a la base de datos
conexion.py
Del módulo de psycopg2
importar pool
from psycopg2 import pool
Crear una clase Conexion, ya con los parámetros como HOST, USERNAME, PASSWORD, etc. Todos los parámetros como privados
class Conexion:
__DATABASE = 'test_db'
__USERNAME = 'postgres'
__PASSWORD = 'admin'
__DB_PORT = '5432'
__HOST = '127.0.0.1'
__MIN_CON = 1
__MAX_CON = 5
__pool = None**
Luego crear una classmethod, obtenerPool(), para el pool de conexiones:
#Obteniendo varias coexiones a la base de datos con pool
@classmethod
def obtenerPool(cls):
if cls.__pool == None:
try:
cls.__pool = pool.SimpleConnectionPool(
cls.__MIN_CON,
cls.__MAX_CON,
host=cls.__HOST,
user=cls.__USERNAME,
password=cls.__PASSWORD,
port=cls.__DB_PORT,
database=cls.__DATABASE)
logger.debug(f'Creacion pool exitosa: {cls.__pool}')
return cls.__pool
except Exception as e:
logger.error(f'Errror al crear el pool de conexiones: {e}')
sys.exit()
else:
return cls.__pool
Luego tenemos que crear una classmethod, obtenerConexion(), para obtener del pool una conexión:
#Obteniendo la conexion del pool
@classmethod
def obtenerConexion(cls):
conexion = cls.obtenerPool().getconn()
logger.debug(f'Conexión obtenida del pool: {conexion}')
return conexion
Creamos otra classmethod, liberarConexion(), para retornar la conexión al pool
#Regresar el objeto conexion al pool
@classmethod
def liberarConexion(cls, conexion):
cls.obtenerPool().putconn(conexion)
Utilizaremos otro classmethod, cerrarConexiones(), para cerrar las conexiones
#Cerrando todas las conexiones del pool
@classmethod
def cerrarConexiones(cls):
cls.obtenerPool().closeall()
logger.debug(f'Cerramos todas las conexiones del pool: {cls.__pool}')
Aquí un ejemplo de como utilizar los métodos de clase
if __name__ == "__main__":
#Obtener una conexion a partir del pool
conexion1 = Conexion.obtenerConexion()
conexion2 = Conexion.obtenerConexion()
#Regresamos las conexiones al pool
Conexion.liberarConexion(conexion1)
Conexion.liberarConexion(conexion2)
#Cerramos el pool
Conexion.cerrarConexiones()
#error el pool ya esta cerrado
#conexion3 = Conexion.obtenerConexion()
Top comments (1)
Muy gozu eres webon