Flask - концепция пула mysql.connector, дизайн и разработка - PullRequest
0 голосов
/ 08 ноября 2019

В настоящее время я занимаюсь разработкой веб-приложения с использованием среды Flask и планирую использовать метод пула для управления подключением к БД MYSQL, чтобы уменьшить накладные расходы при установлении нового подключения для каждого пользовательского запроса. Тем не менее, после прочтения некоторых статей из Интернета, я все еще не понимаю, как их реализовать, приведенные примеры слишком просты и понятны для небольших приложений. Следовательно, у меня есть несколько вопросов:

  1. Пул создается по запросу пользователя или только один раз после запуска сервера?
  2. Я прочитал статью о том, что макс. Размер пула для Python mysql.connector составляет 25 соединений, а это означает, что он может поддерживать только 25 соединений одновременно? Если есть> 25 пользователей, делающих запросы одновременно к базе данных, возникнут проблемы?
  3. Как работает механизм повторного использования? Если новое соединение устанавливается по запросу, MySQLConnectionPool.get_connection() вернет новый объект из пула. Это означает, что он создаст новый объект подключения, если пул пуст, иначе вернет существующий объект? И после запроса я закрываю соединение, оно вернется в пул для повторного использования в следующий раз?
  4. После того, как я попытался реализовать это, я получаю ошибку ниже, затем я устанавливаю 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);

В этой реализации яЯ не уверен, что я делаю правильно. Поток должен быть:

  1. Когда сервер запущен, он создаст новый пул при первом запросе от пользователя.
  2. Получить соединение от объекта пула (назначенного данному объекту) иверните его в соединение с объектом g для этого контекста.
  3. Закройте объект соединения (я думаю, что вернитесь в пул), прежде чем отвечать.
  4. Следующий запрос пользователя начнется только с шага 2.

Однако, когда второй запрос приходит от пользователя, я получаю эту ошибку:

AttributeError: у объекта '_AppCtxGlobals' нет атрибута 'mySQLPool'

Очевидно, g.mySQLPool.get_connection() у данного объекта нет объекта пула при поступлении второго запроса. Когда я перемещаю createMYSQLConnectionPool() в @api.before_request, проблема исчезла, но, похоже, она создает новый пул при каждом запросе. Любой совет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...