Использую Pool соединений в приложение Flask, чтобы было несколько соединений, которые по необходимости забирались и возвращались в Pool без закрытия соединения после использования в запросе. Реализовал это через context manager:
from contextlib import contextmanager
import mysql.connector
from mysql.connector.errors import Error
from mysql.connector import pooling
SQL_CONN_POOL = pooling.MySQLConnectionPool(
pool_name="mysqlpool",
pool_size=1,
user=DB_USER,
password=DB_PASS,
host=DB_HOST,
database=DATABASE,
auth_plugin=DB_PLUGIN
)
@contextmanager
def mysql_connection_from_pool() -> "conn":
conn_pool = SQL_CONN_POOL # get connection from the pool, all the rest is the same
_conn = conn_pool.get_connection()
try:
yield _conn
except (Exception, Error) as ex:
# if error happened all made changes during the connection will be rolled back:
_conn.rollback()
# this statement re-raise error to let it be handled in outer scope:
raise
else:
# if everything is fine commit all changes to save them in db:
_conn.commit()
finally:
# actually it returns connection to the pool, rather than close it
_conn.close()
@contextmanager
def mysql_curs_from_pool() -> "curs":
with mysql_connection_from_pool() as _conn:
_curs = _conn.cursor()
try:
yield _curs
finally:
_curs.close()
Я знаю что если соединения c DB не используются определенное время, то MySQL их завершает. Время этого завершения определяется глобальными настройками MySQL к которым я доступа не имею. По поводу Pool однозначного ответа я не нашел. Предположим я провожу отладку приложения и периодически его закрываю, при принудительном закрытии приложения, что происходит с соединениями Pool? Как Pool поддерживает входящие в него соединения если ими долго не пользуются? Как на уровне Python/Flask завершать Pool?
Дополнение: На сегодняшний момент не понял преимуществ SQL Alchemy, кроме как возможности легко поменять DB например с MySQL на PostgreSQL, поэтому использую менеджер контекста и стандартный запросы SQL.