首页 > 解决方案 > Python MySQL.connector - MySQL 连接不可用

问题描述

我目前正在开发一个 Python 项目,有时必须将数千个条目一个接一个地写入数据库。不幸的是,我经常遇到连接错误。

起初我认为这是因为我没有在每次查询后关闭数据库连接,但随后消息出现在数据库中的第一个条目之后。否则,数百个条目后会出现错误。当我打电话给数据库时,我做错了什么?

class Database ():
    def __init__(self):
        pass

    def connect(self, log):
        try:
            self.conn = mysql.connector.connect(host=self.Adress,
                                                port=self.Port,
                                                database=self.Database,
                                                user=self.Username,
                                                password=self.Password)
        except Exception as e:
            log.bootLog(self, "Database Connection ---- FAILED: " + str(e), "Error")
            sys.exit(0)
        return

    def insert(self, query, args, log):
        cursor = self.conn.cursor()
        try:
            cursor.execute(query, args)
            self.conn.commit()
            cursor.close()
            self.conn.close()
        except Exception as e:
            log.writeLog(self, "Database Connection ---- FAILED: " + str(e) + "\n" + cursor.statement, "Error")
        return
Traceback (most recent call last):
  File "/home/tobi/PycharmProjects/TradingBot/Module/brokerAPI.py", line 27, in initialisierung
    tradingBot.Database.insert(query,args, tradingBot.log)
  File "/home/tobi/PycharmProjects/TradingBot/Module/MySQLConnector.py", line 32, in insert
    cursor = self.conn.cursor()
  File "/home/tobi/PycharmProjects/TradingBot/venv/lib/python3.7/site-packages/mysql/connector/connection.py", line 809, in cursor
    raise errors.OperationalError("MySQL Connection not available.")
mysql.connector.errors.OperationalError: MySQL Connection not available.

标签: pythonmysql

解决方案


我的初步想法如下:

1 - MySQL 不使用游标,因此您不必担心关闭游标。

2 - 你需要在每次插入后提交吗?最好两次批量插入并每 100 次插入提交一次或其他什么,我不知道是否尝试每毫秒提交一次事务会导致表锁定或任何问题。

3 - 您绝对不需要在每次交易后关闭连接。如果不确定交易的频率如何,我可能会在关闭交易之前放置一个 sleep(5) 或其他东西,这样它就可以在另一个交易传入的情况下保持打开状态。数千次打开和关闭与数据库的连接可能对性能不是很好。

4 - 你听说过连接池吗?这可能会解决您在这里遇到的大部分麻烦。它让python打开一个连接池并根据需要自行决定使用它们并关闭它们。

https://dev.mysql.com/doc/connector-python/en/connector-python-connection-pooling.html https://pynative.com/python-database-connection-pooling-with-mysql/


推荐阅读