В настоящее время я занимаюсь разработкой веб-приложения с использованием среды Flask и планирую использовать метод пула для управления подключением к БД MYSQL, чтобы уменьшить накладные расходы при установлении нового подключения для каждого пользовательского запроса. Тем не менее, после прочтения некоторых статей из Интернета, я все еще не понимаю, как их реализовать, приведенные примеры слишком просты и понятны для небольших приложений. Следовательно, у меня есть несколько вопросов:
- Пул создается по запросу пользователя или только один раз после запуска сервера?
- Я прочитал статью о том, что макс. Размер пула для Python mysql.connector составляет 25 соединений, а это означает, что он может поддерживать только 25 соединений одновременно? Если есть> 25 пользователей, делающих запросы одновременно к базе данных, возникнут проблемы?
- Как работает механизм повторного использования? Если новое соединение устанавливается по запросу,
MySQLConnectionPool.get_connection()
вернет новый объект из пула. Это означает, что он создаст новый объект подключения, если пул пуст, иначе вернет существующий объект? И после запроса я закрываю соединение, оно вернется в пул для повторного использования в следующий раз? - После того, как я попытался реализовать это, я получаю ошибку ниже, затем я устанавливаю
pool_reset_session=False
. Что оно делает? Разве это не для сброса аутентификации varaible (пароль, имя БД ... и т. Д.)? Поскольку мое приложение работает только с 1 базой данных, я думаю, что можно отключить его. mysql.connector.errors.NotSupportedError: MySQL версии 5.7.2 и более ранних версий не поддерживает COM_RESET_CONNECTION.
Ниже приведены коды, которые я пробовал,просто пример кода:
В моем server.py
для создания пула сразу:
from mysql_connection import *
@api.before_app_first_request
def before_first_request():
#create the pool once only per server startup
createMYSQLConnectionPool()
@api.before_request
def before_request():
#get connection object per request and set to g object to use globally per context
g.conn = getSQLConnection()
@api.after_request
def after_request(response):
#properly close connection before make response
closeSQLConnection()
В mysql_connection.py:
from mysql.connector import pooling
from flask import g
import mysql.connector
def createMYSQLConnectionPool():
try:
g.mySQLPool = mysql.connector.pooling.MySQLConnectionPool(pool_name="db_pool",pool_reset_session=False,pool_size=25,host='localhost',port='3308',database='sample_db',user='username',password='password')
print("-I- Created MYSQL database pool...", file=sys.stdout)
print ("Printing connection pool properties: ")
print("Connection Pool Name - ", g.mySQLPool.pool_name)
print("Connection Pool Size - ", g.mySQLPool.pool_size)
except Error as e:
print(err, file=sys.stdout)
def getSQLConnection():
try:
#get connection from pool
mySQLconnection = g.mySQLPool.get_connection()
if mySQLconnection.is_connected():
print("-I- Connected to MySQL Database...", file=sys.stdout)
return mySQLconnection
except Error as e:
print(err, file=sys.stdout)
def closeSQLConnection():
if(g.conn.is_connected()):
g.conn.close()
print("-I- MySQL connection is closed...", file=sys.stdout);
В этой реализации яЯ не уверен, что я делаю правильно. Поток должен быть:
- Когда сервер запущен, он создаст новый пул при первом запросе от пользователя.
- Получить соединение от объекта пула (назначенного данному объекту) иверните его в соединение с объектом g для этого контекста.
- Закройте объект соединения (я думаю, что вернитесь в пул), прежде чем отвечать.
- Следующий запрос пользователя начнется только с шага 2.
Однако, когда второй запрос приходит от пользователя, я получаю эту ошибку:
AttributeError: у объекта '_AppCtxGlobals' нет атрибута 'mySQLPool'
Очевидно, g.mySQLPool.get_connection()
у данного объекта нет объекта пула при поступлении второго запроса. Когда я перемещаю createMYSQLConnectionPool()
в @api.before_request
, проблема исчезла, но, похоже, она создает новый пул при каждом запросе. Любой совет?