Задать вопрос
Delgus
@Delgus

Создать подключение к MYSQL один раз или создавать каждый раз?

Допустим пишу я телеграм бота на python и мне нужно что то делать с базой. Подключение надо создать один раз или при обработке каждого сообщения.
Я считаю что надо создать одно подключение и держать. так например

bot = telebot.TeleBot("")
db = mysql.connector.connect(
    host="localhost",
    user="root",
    passwd="root",
    port="3307",
    database="youtube"
)
db.reconnect(attempts = 100, delay=10)

@bot.message_handler()
def route(message):
    cursor = db.cursor();
    sql = "SELECT * users"
    cursor.execute(sql)
    result = cursor.fetchall()
    db.commit()
    bot.send_message(message.chat.id, "Hello world!")


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

bot = telebot.TeleBot("")

@bot.message_handler()
def route(message):
      db = mysql.connector.connect(
          host="localhost",
          user="root",
          passwd="root",
          port="3307",
          database="youtube"
      )
     cursor = db.cursor();
     sql = "SELECT * users"
     cursor.execute(sql)
     result = cursor.fetchall()
     db.commit()
     db.close()
     bot.send_message(message.chat.id, "Hello world!")


Какой вариант правильный? Есть какие-то пруфы, документация на этот случай?
  • Вопрос задан
  • 1553 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@kirillinyakin
Вообще MySQL разрывает автоматически соеденение в случае простоя, и насколько я знаю это можно настроить, в своес проекте я каждый раз создаю подключение и в конце функции разрываю
Ответ написан
Delgus
@Delgus Автор вопроса
Первый вариант не будет работать. connect() возвращает одно соединение а не pool
bot = telebot.TeleBot("")
# создаем пулл из 3 соединений например
cnxpool = mysql.connector.pooling.MySQLConnectionPool(pool_name = "mypool",
                                                      pool_size = 3,
                                                      host="localhost",
    user="root",
    passwd="root",
    port="3307",
    database="youtube")

@bot.message_handler()
def route(message):
    # достаем соединение из пулла
    db = cnxpool.get_connection()
    cursor = db.cursor();
    sql = "SELECT * users"
    cursor.execute(sql)
    result = cursor.fetchall()
    db.commit()
    # закрываем соединение. оно вернется обратно в пулл
    db.close()
    bot.send_message(message.chat.id, "Hello world!")


Новое соединение хоть и достаточно быстро устанавливается, но все равно тратит ресурсы сервера. Тратить их много раз, когда можно один конечно не стоит. так что этот вариант получше по-моему
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы