这是我的python代码的一部分,用于将从Sharepoint检索的数据插入MySQL数据库,它每10分钟运行一次。
cnx = mysql.connector.connect(user='user', password='pwd', host='CP-MSQL03',port='3306',database='datacenter')
cnx.autocommit=True
MySQL_cursor = cnx.cursor()
r = requests.get(url, headers=headers, params=params)
delete_data = []
for item in r.json()['d']['results']:
id = item['Id']
lot_No = item['LOT_No']
start = datetime.strptime(item['START'], '%Y-%m-%dT%H:%M:%SZ')
lbs = item['LBS']
line_NAV = item['Line_No']['NAV_x0020_HS_x0020_LINE']
rpo_No = item['RPO_No']['RPO_No']
item_NO = item['RPO_No']['Item_No']
mrt_No = item['RPO_No']['MRT_No']
SQL_Insert = (
"INSERT INTO datacenter.mrt_consumption_archive (Line_No, RPO_No, Item_No, MRT_No, LOT_No, Start_Time, LBS) "
"VALUES('%s', '%s', '%s', '%s', '%s', '%s', %s);" % (
line_NAV, rpo_No, item_NO, mrt_No, lot_No, start, lbs))
MySQL_cursor.execute(SQL_Insert)
delete_data.append(id)
这是我成功运行几个小时后得到的错误代码。
我的问题是,为什么会出现此错误?是防火墙问题吗?超时设置问题?我该如何解决? 而且,为什么在第一次失败后,我在所有重试中仍然遇到相同的错误?
答案 0 :(得分:1)
连接下降,它发生了。防火墙,启用NAT的路由器等可能使它发生的次数比应有的多,但是这仍然不是您希望程序崩溃的原因。
因此,通常,在运行查询之前,它必须对连接进行测试并捕获所有连接异常。捕获时,重新启动连接。幸运的是,这是一个称为池的熟悉概念,并且已经可以通过连接器使用。
摘录自https://dev.mysql.com/doc/connector-python/en/connector-python-connection-pooling.html:
要隐式创建连接池:打开连接并指定一个或多个与池相关的参数(pool_name,pool_size)。例如:
dbconfig = { "database": "test", "user": "joe" } cnx = mysql.connector.connect(pool_name = "mypool", pool_size = 3, **dbconfig)
如果您只是出于某种原因从保持连接打开的角度进行查看,还可以设置持续时间短的keepalive(如果问题是网络设备不可靠,这可能就是您所需的所有解决方法)正在从其内存中的表清除连接)。如果可以解决网络问题,那是比自定义连接设置更好的方法。
答案 1 :(得分:0)
如果您的脚本成功运行了几个小时,我认为这可能是数据库配置的一个参数,那么请用以下语句检查配置,
SHOW GLOBAL VARIABLES where variable_name like'%time%';
也许连接很多或者会话超时,但是我很确定这是您的MySQL服务器问题