Gerenciar conexões com o banco de dados em produção exige um pool de conexões. O DBUtils oferece um pool de conexões Python compatível com phoenixdb para conexão ao LindormTable, permitindo controlar a reutilização de conexões, limites de ociosidade e comportamento de bloqueio sem escrever a lógica do pool manualmente.
Pré-requisitos
Antes de começar, verifique se você tem:
Python 3.8 ou posterior instalado
Endereço IP do cliente adicionado à lista de permissões da instância Lindorm. Para mais detalhes, consulte Configure listas de permissões
LindormTable 2.3.1 ou posterior. Para verificar ou atualizar sua versão, consulte Notas de versão do LindormTable e Atualize a versão secundária do mecanismo de uma instância Lindorm
Instale dependências
Instale o phoenixdb e o DBUtils:
pip install phoenixdb==1.2.0
pip install DBUtils==3.0.2
Conectar ao LindormTable usando um pool de conexões
O exemplo a seguir cria um pool de conexões PooledDB e demonstra operações de upsert e consulta no 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:
Defina
urlcomo o endereço HTTP do endpoint SQL do LindormTable. Remova o prefixojdbc:lindorm:table:url=. Por exemplo, se o console exibirjdbc:lindorm:table:url=http://ld-bp1p7e07ohamf****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30060, definaurlcomohttp://ld-bp1p7e07ohamf****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30060. Para localizar o endpoint, consulte Visualize os endpoints do LindormTable.Configure
userepasswordcom as credenciais do LindormTable. Essas informações estão disponíveis no sistema de gerenciamento de cluster do LindormTable.Especifique em
databaseo nome do banco de dados desejado para a conexão.
Parâmetros do pool de conexões
Ajuste maxcached e maxconnections conforme sua carga de trabalho.
|
Parâmetro |
Descrição |
Valor no exemplo |
|
|
Quantidade máxima de conexões ociosas mantidas no pool |
|
|
|
Total máximo de conexões que o pool pode abrir |
|
|
|
Define se o cliente aguarda quando não há conexão ociosa disponível. |
|
|
|
Verifica a conectividade com o servidor ao recuperar uma conexão do pool. Consulte Limitações para restrições deste parâmetro |
|
|
|
Ativa o modo de confirmação automática em cada conexão |
|
Limitações
**O parâmetro
pingnão se aplica a conexões phoenixdb.** Embora seja possível executar o comandopingpara testar a conectividade de conexões estabelecidas pelo DBUtils, esse método não funciona para conexões criadas via phoenixdb.**Conexões ociosas por mais de 10 minutos geram o erro
NoSuchConnection.** Caso uma conexão fique inativa por mais de 10 minutos, chame_connect()para obter uma nova conexão do pool.