python - 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.
解决方案
我的初步想法如下:
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/
推荐阅读
- kubernetes - 如何使用 kubectl 正确访问多个 Kubernetes 集群
- python - flask_socketio 导入不起作用,错误:没有名为 flask_socketio 的模块
- dart - 将地图列表转换为飞镖中的一张地图?
- javascript - 如何在黄瓜中生成本地报告?
- azure - Azure Kinect DK 操作范围
- kubernetes - 为什么 Kubernetes 不断恢复我的副本规范?
- typescript - 如何在 Typescript 中输入转换元组的函数
- javascript - Firestore 查询错误:对象作为反应子项无效
- elasticsearch - 弹性搜索查询不返回结果
- c# - 如何允许用户在 if 语句中输入新值