Para gestionar las conexiones a bases de datos de manera eficiente en entornos de producción, se requiere un pool de conexiones. DBUtils proporciona un pool de conexiones en Python compatible con phoenixdb para conectarse a LindormTable. Esta herramienta le permite controlar la reutilización de conexiones, los límites de inactividad y el comportamiento de bloqueo sin necesidad de implementar su propia lógica de pool.
Requisitos previos
Antes de empezar, asegúrese de cumplir con lo a continuación:
Tener instalado Python 3.8 o una versión posterior.
Haber agregado la dirección IP de su cliente a la lista de permitidos de la instancia de Lindorm. Para más detalles, consulte Configure whitelists.
Contar con LindormTable 2.3.1 o una versión posterior. Para comprobar o actualizar su versión, consulte Release notes of LindormTable y Upgrade the minor engine version of a Lindorm instance.
Instalación de dependencias
Instale phoenixdb y DBUtils:
pip install phoenixdb==1.2.0
pip install DBUtils==3.0.2
Conexión a LindormTable mediante un pool de conexiones
El siguiente ejemplo crea un pool de conexiones PooledDB y muestra operaciones de upsert y consulta en LindormTable.
#!/usr/bin/python3
from dbutils.pooled_db import PooledDB
import importlib
class DBUtilsDemo:
def __init__(self, url, user, password, database):
config = {
'url': url,
'lindorm_user': user,
'lindorm_password': password,
'database': database,
'autocommit': True
}
db_creator = importlib.import_module("phoenixdb")
# Create a connection pool based on DBUtils.
self.pooled = PooledDB(db_creator,
maxcached=10,
maxconnections=50,
blocking=True,
ping=1,
**config)
# Obtain a connection from the connection pool.
def _connect(self):
try:
r = self.pooled.connection()
return r
except Exception as e:
print("Failed to connect:" + str(e))
# Return a connection to the connection pool.
def _close(self, conn, stmt):
if stmt:
stmt.close()
if conn:
conn.close()
# Query a single row of data.
def select_row(self, sql):
connection = self._connect()
statement = None
try:
statement = connection.cursor()
statement.execute(sql)
row = statement.fetchone()
return row
except Exception as e:
print(e)
finally:
self._close(connection, statement)
# Query multiple rows of data.
def select_rows(self, sql):
connection = self._connect()
statement = None
try:
statement = connection.cursor()
print(sql)
statement.execute(sql)
rows = statement.fetchall()
return rows
except Exception as e:
print(e)
finally:
self._close(connection, statement)
# Update and insert data to a table.
def upsert_data(self, sql_upsert):
connection = self._connect()
statement = None
try:
statement = connection.cursor()
statement.execute(sql_upsert)
connection.commit()
except Exception as e:
print(e)
finally:
self._close(connection, statement)
# Update and insert data to a table by specifying parameters.
def upsert_data_prams(self, sql_upsert, prams):
connection = self._connect()
statement = None
try:
statement = connection.cursor()
statement.execute(sql_upsert, prams)
connection.commit()
except Exception as e:
print(e)
finally:
self._close(connection, statement)
if __name__ == '__main__':
url = 'http://ld-bp1p7e07ohamf****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30060'
user = 'root'
password = 'root'
database = 'test'
poolUtils = DBUtilsDemo(url, user, password, database)
poolUtils.upsert_data("upsert into tb(id,name,address) values ('i001','n001','a001')")
params = ['i002', 'n002', 'a002']
poolUtils.upsert_data_prams("upsert into tb(id,name,address) values (?,?,?)", params)
rows = poolUtils.select_rows("select * from tb")
print(rows)
row = poolUtils.select_row("select * from tb limit 1")
print(row)
row = poolUtils.select_row("select * from tb where id = 'i001' limit 1")
print(row)
Notas de uso:
Establezca
urlcon la dirección HTTP del endpoint SQL de LindormTable. Elimine el prefijojdbc:lindorm:table:url=. Por ejemplo, si la consola muestrajdbc:lindorm:table:url=http://ld-bp1p7e07ohamf****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30060, configureurlcomohttp://ld-bp1p7e07ohamf****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30060. Para localizar el endpoint, consulte View the endpoints of LindormTable.Configure
userypasswordcon las credenciales de LindormTable. Puede encontrarlas en el sistema de gestión de clústeres de LindormTable.Defina
databasecon el nombre de la base de datos a la que desea conectarse.
Parámetros del pool de conexiones
Ajuste maxcached y maxconnections según su carga de trabajo.
|
Parámetro |
Descripción |
Valor en el ejemplo |
|
|
Número máximo de conexiones inactivas que se mantienen en el pool |
|
|
|
Número total máximo de conexiones que puede abrir el pool |
|
|
|
Determina si el cliente espera cuando no hay ninguna conexión inactiva disponible. |
|
|
|
Comprueba la conectividad con el servidor al obtener una conexión del pool. Consulte Límites para conocer las restricciones de este parámetro |
|
|
|
Habilita el modo de confirmación automática en cada conexión |
|
Límites
**
pingno aplica a las conexiones de phoenixdb.** Es posible ejecutar el comandopingpara probar la conectividad de las conexiones establecidas por DBUtils, pero este método no es válido para las conexiones establecidas mediante phoenixdb.**Las conexiones inactivas por más de 10 minutos generan el error
NoSuchConnection.** Si una conexión no se ha utilizado durante más de 10 minutos, llame a_connect()para obtener una nueva conexión del pool.