电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

解決mysql服務器在無操作超時主動斷開連接的情況

瀏覽:2日期:2023-10-13 16:25:19

我們在使用mysql服務的時候,正常情況下,mysql的設置的timeout是8個小時(28800秒),也就是說,如果一個連接8個小時都沒有操作,那么mysql會主動的斷開連接,當這個連接再次嘗試查詢的時候就會報個”MySQL server has gone away”的誤,但是有時候,由于mysql服務器那邊做了一些設置,很多情況下會縮短這個連接timeout時長以保證更多的連接可用。有時候設置得比較變態,很短,30秒,這樣就需要客戶端這邊做一些操作來保證不要讓mysql主動來斷開。

查看mysql的timeout

使用客戶端工具或者Mysql命令行工具輸入show global variables like ’%timeout%’;就會顯示與timeout相關的屬性,這里我用docker模擬了一個測試環境。

mysql> show variables like ’%timeout%’; +-----------------------------+----------+| Variable_name| Value |+-----------------------------+----------+| connect_timeout | 10 || delayed_insert_timeout | 300 || have_statement_timeout | YES || innodb_flush_log_at_timeout | 1 || innodb_lock_wait_timeout | 50 || innodb_rollback_on_timeout | OFF || interactive_timeout | 30 || lock_wait_timeout | 31536000 || net_read_timeout | 30 || net_write_timeout | 60 || rpl_stop_slave_timeout | 31536000 || slave_net_timeout | 60 || wait_timeout| 30 |+-----------------------------+----------+13 rows in set

wait_timeout:服務器關閉非交互連接之前等待活動的秒數,就是你在你的項目中進行程序調用

interactive_timeout: 服務器關閉交互式連接前等待活動的秒數,就是你在你的本機上打開mysql的客戶端,cmd的那種

使用pymysql進行查詢

我在數據庫里隨便創建了一個表,插入兩條數據

mysql> select * from person;+----+------+-----+| id | name | age |+----+------+-----+| 1 | yang | 18 || 2 | fan | 16 |+----+------+-----+2 rows in set

我使用pymysql這個庫對其進行查詢操作,很簡單

#coding:utf-8import pymysqldef mytest(): connection = pymysql.connect( host=’localhost’, port=3306, user=’root’, password=’123456’, db=’mytest’, charset=’utf8’) cursor = connection.cursor() cursor.execute('select * from person') data = cursor.fetchall() cursor.close() for i in data: print(i) cursor.close() connection.close()if __name__ == ’__main__’: mytest()

可以正確的得到結果

(1, ’yang’, 18)

(2, ’fan’, 16)

連接超時以后的查詢

上面可以正常得到結果是由于當創建好一個鏈接以后,就立刻進行了查詢,此時還沒有超過它的超時時間,如果我sleep一段時間,看看什么效果。

#coding:utf-8import pymysqlimport timedef mytest(): connection = pymysql.connect( host=’localhost’, port=3306, user=’root’, password=’123456’, db=’mytest’, charset=’utf8’) cursor = connection.cursor() cursor.execute('select * from person') data = cursor.fetchall() for i in data: print(i) cursor.close() time.sleep(31) cursor = connection.cursor() cursor.execute('select * from person') data2 = cursor.fetchall() for i in data2: print(i) cursor.close() connection.close()if __name__ == ’__main__’: mytest()

這里進行了兩次查詢,因為我把mysql的wait_timeout設置了30秒,所以我在第一次查詢之后停了31秒,目的讓mysql服務主動的和我剛才創建的連接斷開,得到的結果是

(1, ’yang’, 18)(2, ’fan’, 16)Traceback (most recent call last): File 'F:/python/python3Test/mysqltest.py', line 29, in <module> mytest() File 'F:/python/python3Test/mysqltest.py', line 22, in mytest cursor.execute('select * from person') ... ... File 'C:Python35libsite-packagespymysqlconnections.py', line 702, in _read_bytes CR.CR_SERVER_LOST, 'Lost connection to MySQL server during query')pymysql.err.OperationalError: (2013, ’Lost connection to MySQL server during query’)Process finished with exit code 1

可以看到在停了31秒鐘以后,再次使用該連接進行查詢將拋出2013, ’Lost connection to MySQL server during query’錯誤。

解決辦法

解決的方法有兩種,既然這里的超時是由于在規定時間內沒有任何操作導致mysql主動的將鏈接關閉,pymysql的connection對象有一個ping()方法,可以檢查連接是否有效,在每次執行查詢操作之前先執行一下ping()方法,該方法默認的有個reconnect參數,默認是True,如果失去連接了會重連。

#coding:utf-8import pymysqlimport timedef mytest(): connection = pymysql.connect( host=’localhost’, port=3306, user=’root’, password=’123456’, db=’mytest’, charset=’utf8’) connection.ping() cursor = connection.cursor() cursor.execute('select * from person') data = cursor.fetchall() for i in data: print(i) cursor.close() time.sleep(31) connection.ping() cursor = connection.cursor() cursor.execute('select * from person') data2 = cursor.fetchall() for i in data2: print(i) cursor.close() connection.close()if __name__ == ’__main__’: mytest()

我曾嘗試使用另外一個線程不停來執行ping()操作,但是當我這樣做以后連接就會丟失,之后的操作就不能進行了。這個問題我再研究研究。

#coding:utf-8import pymysqlimport timeimport threadingimport tracebackdef ping(conn): while True: try: conn.ping() except: print(traceback.format_exc()) finally: time.sleep(1)def mytest(): connection = pymysql.connect( host=’localhost’, port=3306, user=’root’, password=’123456’, db=’mytest’, charset=’utf8’) cursor = connection.cursor() # 放在此處不行,必須等待cursor的一個execute之后再運行才可以 # th = threading.Thread(target=ping, args=(connection,)) # th.setDaemon(True) # th.start() cursor.execute('select * from person') data = cursor.fetchall() for i in data: print(i) cursor.close() # 線程放在此處啟動可以 th = threading.Thread(target=ping, args=(connection,)) th.setDaemon(True) th.start() time.sleep(31) cursor = connection.cursor() cursor.execute('select * from person') data2 = cursor.fetchall() for i in data2: print(i) cursor.close() connection.close()if __name__ == ’__main__’: mytest()

還有一種方法是使用連接池,連接池中保持著指定數量的可用連接,每次重新獲取一個有效的連接進行查詢操作,pymysql本身不具有連接池功能,需要借住DBUtils

#coding:utf-8import pymysqlimport timefrom DBUtils.PooledDB import PooledDB, SharedDBConnectiondef mytest(): pool = PooledDB( creator=pymysql, # 初始化時,連接池至少創建的空閑連接,0表示不創建 maxconnections=3, # 連接池中空閑的最多連接數,0和None表示沒有限制mincached=2, # 連接池中最多共享的連接數量,0和None表示全部共享(其實沒什么卵用) maxcached=5,maxshared=3, host=’localhost’, port=3306, user=’root’, password=’123456’, db=’mytest’, charset=’utf8’ ) connection = pool.connection() cursor = connection.cursor() cursor.execute('select * from person') data = cursor.fetchall() for i in data: print(i) time.sleep(40) cursor.execute('select * from person') data2 = cursor.fetchall() for i in data2: print(i) cursor.close() connection.close()if __name__ == ’__main__’: mytest()

這種方式雖然可以正確的獲取結果,但是實際的項目中并不會這么使用,而是在執行完查詢語句以后要將connection關閉,注意這里的關閉并不是真正的關閉,而只是將連接返回給連接池讓其它人使用.

#coding:utf-8import pymysqlimport timefrom DBUtils.PooledDB import PooledDB, SharedDBConnectiondef mytest(): pool = PooledDB( creator=pymysql, maxconnections=3, # 初始化時,連接池至少創建的空閑連接,0表示不創建 mincached=2, # 連接池中空閑的最多連接數,0和None表示沒有限制 maxcached=5, # 連接池中最多共享的連接數量,0和None表示全部共享(其實沒什么卵用) maxshared=3, host=’localhost’, port=3306, user=’root’, password=’123456’, db=’mytest’, charset=’utf8’ ) connection = pool.connection() cursor = connection.cursor() cursor.execute('select * from person') data = cursor.fetchall() for i in data: print(i) cursor.close() # 關閉連接,其實并沒有真正關閉,只是將連接返回給連接池 connection.close() time.sleep(40) connection = pool.connection() cursor = connection.cursor() cursor.execute('select * from person') data2 = cursor.fetchall() for i in data2: print(i) cursor.close() connection.close()if __name__ == ’__main__’: mytest()

以上這篇解決mysql服務器在無操作超時主動斷開連接的情況就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 压力喷雾干燥机,喷雾干燥设备,柱塞隔膜泵-无锡市闻华干燥设备有限公司 | 压力喷雾干燥机,喷雾干燥设备,柱塞隔膜泵-无锡市闻华干燥设备有限公司 | 护栏打桩机-打桩机厂家-恒新重工 | 导电银胶_LED封装导电银胶_半导体封装导电胶厂家-上海腾烁 | 开云(中国)Kaiyun·官方网站 - 登录入口 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 重庆轻质隔墙板-重庆安吉升科技有限公司| COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 桨叶搅拌机_螺旋挤压/方盒旋切造粒机厂家-无锡市鸿诚输送机械有限公司 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 包头市鑫枫装饰有限公司| 一礼通 (www.yilitong.com)-企业礼品解决方案一站式服务平台 | 柴油机_柴油发电机_厂家_品牌-江苏卡得城仕发动机有限公司 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 欧景装饰设计工程有限公司-无锡欧景装饰官网 | SDI车窗夹力测试仪-KEMKRAFT方向盘测试仪-上海爱泽工业设备有限公司 | 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 预制直埋蒸汽保温管-直埋管道-聚氨酯发泡保温管厂家 - 唐山市吉祥保温工贸有限公司 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 礼至家居-全屋定制家具_一站式全屋整装_免费量房设计报价 | 闸阀_截止阀_止回阀「生产厂家」-上海卡比阀门有限公司 | 硫化罐-胶管硫化罐-山东鑫泰鑫智能装备有限公司 | 南昌旅行社_南昌国际旅行社_南昌国旅在线 | 办公室家具_板式办公家具定制厂家-FMARTS福玛仕办公家具 | 电磁铁_推拉电磁铁_机械手电磁吸盘电磁铁厂家-广州思德隆电子公司 | 通信天线厂家_室分八木天线_对数周期天线_天线加工厂_林创天线源头厂家 | 电缆接头_防水接头_电缆防水接头_防水电缆接头_上海闵彬 | 动物麻醉机-数显脑立体定位仪-北京易则佳科技有限公司 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 别墅图纸超市|别墅设计图纸|农村房屋设计图|农村自建房|别墅设计图纸及效果图大全 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 识禅_对禅的了解,从这里开始 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 | 中红外QCL激光器-其他连续-半导体连续激光器-筱晓光子 | 渣油泵,KCB齿轮泵,不锈钢齿轮泵,重油泵,煤焦油泵,泊头市泰邦泵阀制造有限公司 | 环球电气之家-中国专业电气电子产品行业服务网站! |