Python MySQLdbで[Lost connection to MySQL server during query]が

Python MySQLdbで[Lost connection to MySQL server during query]が出て落ちる

原因調べてたら

これ有効にしてないかららしい


my_bool reconnect = 1;
mysql_options(&mysql, MYSQL_OPT_RECONNECT, &reconnect);

でどうするか。

#!/usr/bin/env python
import MySQLdb
con = MySQLdb.connect(***)
con.ping(True) # ←これでRECONNECTが有効になる
cur = con.corsor()
cur.execute("重いクエリ")
con.commit()
cur.close()
con.close()

で落ちなくなった。

このバージョンではトランザクションも問題ないようだ。

MySQL-python-1.2.3c1の場合、con.autocommit(0)となっている様。

autocommitを有効にしたい場合con.autocommit(1)を明示しなければいけない。

上記は
python 2.4.3
MySQL-python-1.2.3c1
mysql 5.1.37-community
のバージョンの場合で確認。

参考サイト。
http://mp.i-revo.jp/user.php/kcvcrlkq/entry/259.html

 

[2010/05/20]追記。
autocommit=0、つまりトランザクション開始した場合
commitがエラーとなってロールバックするケースが多々あった。
バッチ処理の様なケースではautocommit(1)とした方がいい。

 

[2014/01/14] 追記
いまだにアクセスがあるのでさらに追記。
例えばシステム構成が

APP -> LVS -> DB

の様になっている場合LVSの影響でconnection closeになってしまう事がある。


def keepalive():
Query("SELECT 1").execute
の上記疑似コードの様なメソッドを追加し別スレッドで同じコネクションに対して

while(true):
keepalive()
sleep(60)
みたいにすればLostConnectionしない。
Node.jsでもこういう対応した。
スレッド使えない場合、例えばPHPとかの場合、LVS経由しないようにすればLostConnectionしないはず。