Python Flask MySQL: Как постоянно хранить объект пула соединений?

#python #flask #mysql-connector #multi-database-connections

Вопрос:

После долгих поисков я не смог найти ответа на свой вопрос, возможно ли вообще то, чего я желаю. Мой вопрос касается реализации соединения MySQL для API Flask. То, что я хочу реализовать, заключается в следующем:

  1. При запуске приложения Flask create_db_connection вызывается метод, который создал несколько соединений mysql в объекте пула.
  2. Для каждого входящего запроса get_connection вызывается метод, чтобы получить одно соединение от poule
  3. И, конечно же, когда запрос завершен, close_connection вызывается метод для закрытия соединения и пометки его доступным в пуле.

Проблема, с которой я сталкиваюсь, заключается в постоянном хранении пула соединений, чтобы его можно было повторно использовать для каждого запроса.

метод create_db_connection:

 def create_db_connection():
    print("-----INITIALISING-----")
    db_pool = mysql.connector.pooling.MySQLConnectionPool(pool_name = "BestLiar_Public_API",
                                                        pool_size = 10,
                                                        autocommit = True,
                                                        pool_reset_session = True,
                                                        user = 'user',
                                                        password = 'pass',
                                                        host = 'hostel',
                                                        database =' db')
    print("-----DB POOL INITIALISED-----")
    
    // SOLUTION TO PERSISTENTLY SAVE db_pool OBJECT
 

метод get_connection:

 def __enter__(self):
    try:

        // SOLUTION TO FETCH THE db_pool OBJECT > NAMED AS db_pool IN LINE BELOW

        self.con = db_pool.get_connection()
        self.cur = self.con.cursor(dictionary=True)
        if self.con.is_connected():
            return {'cur': self.cur, 'con': self.con}
        else:
            raise NoConnectionError("No database connection", "Pool connection not connected")
    except mysql.connector.PoolError:
        raise SystemOverload("Too many requests, could not process","No pool connection available")
    except:
        raise NoConnectionError("No database connection", "Unknown reason")
 

метод close_connection:

 def __exit__(self, type, value, traceback):
    if self.con: 
        self.cur.close()
        self.con.close()
 

Я попытался сохранить объект db_pool в качестве глобальной переменной (нежелательно) и попробовал глобальный объект flask (работает только для одного запроса).
У кого-нибудь есть ключ к разгадке?

Комментарии:

1. Можете ли вы отличить, почему/как «постоянное хранение» и «глобальная переменная» отличаются друг от друга?

2. Если вы посмотрите на это таким образом, вы правы, поскольку концептуально это одно и то же, но глобальные переменные не работают в некоторых средах, поэтому я рассматриваю альтернативы. Я хочу, чтобы пул подключений к базе данных работал в течение всего сеанса Flask, что не может быть гарантировано с помощью глобальной переменной.