記事のディレクトリ
- I.はじめに
- 第二に、WAIT_TIMEOUTを理解し、二つのパラメータは、interactive_timeout
- 図1に示すように、コマンドライン操作
- 2、WAIT_TIMEセットの失敗
- 3、リファレンスマニュアルのコンセプトは、2つのパラメータを説明します
- 図4は、それが非対話とみなすもの、インタラクティブみなすもの
- 三、Pythonの再生用のMySQLサーバが立ち去りました
- コード効果により1、2つのテストパラメータ
- (1)パラメータは、二つの時間10秒に設定されている場合:
- (2)当WAIT_TIMEOUT = 10、而は、interactive_timeout = 1000
- (3)当は、interactive_timeout = 10、而WAIT_TIMEOUT = 1000
- (4)パラメータは、効果を確認するために、2つの10S、プログラム睡眠(15)が設けられています。
- 2、再接続が提供されていない、対応するルックSQLの直接実装
- 3、要約
- 第四に、完全なコードキャプチャMySQLエラーと再接続
I.はじめに
この章では透けpython
につながる、接続されたデータベースプログラムのエラーパラメータとそのルーツで問題を解決するために、プログラムのエラーを再現その後、コンセプト、および。mysql
wait_timeout
interactive_timeout
要件:
python
聞きするスクリプトファイル、ファイルの行数増加する10
ラインは、データベースの永続性操作後に実行されます。時には、単にファイルを高めるために数分かかることがあり10
ラインを、データベースを操作するには、この時間が表示されます:MySQL server has gone away
エラー、スクリプトが停止しています。
上記のエラーに基づいて、最初に再生するMySQL server has gone away
状況を、エラーがどの方法がどうあるべきかに引っ掛かって引き起こされたパラメータを参照します。それは何気なくBaiduはインパクトパラメータデータベースの接続時間を知ることができるようになります一般的であるwait_timeout
とinteractive_timeout
、2つのパラメータ以下は、いくつかのミスを再現注力し、発生した問題を要約します
Pythonのmysqlの上のさまざまなエラーをキャプチャする方法、あなたは私の以前の記事を参照することができます:mysqlのエラーをキャプチャする方法のPython
第二に、WAIT_TIMEOUTを理解し、二つのパラメータは、interactive_timeout
エラーを再現するために、我々は二つのパラメータである設定10s
、つまり、10s
データベースが自動的に切断され、コマンドラインの最初のテストを見てみましょう。
図1に示すように、コマンドライン操作
またはWAIT_TIMEOUTは、interactive_timeout設定するかどうかを設定= 10、コマンドラインでは、SQLエラーを実行します:
エラー1:
ERROR 2013 (HY000): Lost connection to MySQL server during query
再実行SQL、それはこの時点でエラーを再接続します私たちが何をしたいです gone away
エラー2:
mysql> show variables like '%timeout%';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 27
Current database: *** NONE ***
当初考えていた直接報告します:MySQL server has gone away
ミスを、私が最初に失うことを期待していなかった、そのデータベース接続エラーを報告し、ブロガーは、これら2つのパラメータが生成された2つのエラーに影響を与えるのだろうか。
2、WAIT_TIMEセットの失敗
始まるちょっと不思議な、明らかセットwait_time =10
、 interactive_timeout =1000
しかし実際のビュー、および常に見つけwait_time =1000
奇妙な本当に奇妙な、なぜこのパラメータは、自分自身を変えるのだろうか?
有効でないWAIT_TIMEOUT改正の質問:
https://www.cnblogs.com/azhqiang/p/5454000.html
実際には、このリンクを介して見つけることができるwait_timeout
、それがの影響を受けているinteractive_timeout
影響が、なぜこのような状況はありますか?
3、リファレンスマニュアルのコンセプトは、2つのパラメータを説明します
interactive_timeout:
The number of seconds the server waits for activity on an interactive connection before closing it. An interactive client is defined as a client that uses the CLIENT_INTERACTIVE option to mysql_real_connect()
WAIT_TIMEOUT:
The number of seconds the server waits for activity on a noninteractive connection before closing it. On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value,
depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect())
彼らはsession/global
単に前者は非対話型クライアントアイドルタイムアウトのために使用されている対話型のクライアントのアイドルタイムアウトを、記述するために使用されていることを意味するが、ここでは、対話型クライアント接続の場合にも、明らかに、レベルsession
というwait_timeout
意志それはされてinteractive_timeout
非対話型クライアント接続があれば、他の言葉で、上書きsession
使用することはありませんinteractive_timeout
上書きwait_timeout
すなわち、interactive_timeout
の影響がありません。あなたがセッションレベルのタイムアウトパラメータを変更する場合は、セッション成功着陸すると、関係なく、対話型または非対話型の変更することでwait_timeout
有効にするにはパラメータを。
参考:
http://blog.itpub.net/7728585/viewspace-2637237/
この記事は非常に明確、非常に鮮明な例を解決し、結論では、それは次のようになります。
それは対話型のクライアント接続であればsession
、それはwait_timeout
されるinteractive_timeout
非対話型クライアント接続があれば、他の言葉で、上書きされsession
使用されることはありませんinteractive_timeout
アウトカバーするためにwait_timeout
、それは、あるinteractive_timeout
のいずれかの役割なし。
図4は、それが非対話とみなすもの、インタラクティブみなすもの
インタラクティブな操作:
素人の面では、あなたがあなたのローカルマシン上で開くことでmysql
、クライアント黒いウィンドウ、様々で黒いウィンドウということですsql
操作は、当然のことながら、確かに取っているtcp
契約を。(小さな黒いボックスモード)
非対話型操作:
あなたの呼び出しプログラムは、あなたのプロジェクトです。例えば、一方の側であるtomcat web
サーバは、データベースサーバながら、両方どの通信、?ではjava web
、私たちは選択する傾向がhibernate
いずれかjdbc
の接続に。したがって、この時間は、非対話型操作です。(接続コード)
上記によると、我々がなければならないことを、インタラクティブな操作属してテストする前に、コマンドラインを使用すると、プログラムがこの問題を再現したい場合、あなたは非対話型に設定する必要があり、非対話型の接続を接続することでwait_time
値を
三、Pythonの再生用のMySQLサーバが立ち去りました
どのパラメータが最後になります错误1
になりますどのようなパラメータを、错误2
まだ。、それは常に発見されたコマンドラインテストが最初に来ると错误1
、再び错误2
、2つのエラーは、2つの別々のパラメータの影響を受けているかどうか?:私たちが望むものを再現する方法をmysql server has gone away
エラーが発生しました。
コードをテストすることによって、コマンドラインをテストしていきません。非対話的な操作のためのコード。
コード効果により1、2つのテストパラメータ
(1)パラメータは、二つの時間10秒に設定されている場合:
try:
conn.ping()
except MySQLdb.Error, e:
print 'error'
# sqlError = "Error %d:%s" % (e.args[0], e.args[1])
print e.args[0]
print e.args[1]
try:
conn.ping()
except MySQLdb.OperationalError,e:
print 'error1'
print e
pass
次のようにこのコードが印刷されています。
error
2013
Lost connection to MySQL server during query
error1
(2006, 'MySQL server has gone away')
テストの後、または直接なかったMySQL server has gone away
、間違った、最初はデータベース接続の損失を報告し、その後、再接続、今回はそれが報告されています。MySQL server has gone away
(2)当WAIT_TIMEOUT = 10、而は、interactive_timeout = 1000
error
2013
Lost connection to MySQL server during query
2013
error1
(2006, 'MySQL server has gone away')
2222_2
そして、上記の合意の結果、無別々のレポートMySQL server has gone away
エラー。
(3)当は、interactive_timeout = 10、而WAIT_TIMEOUT = 1000
エラーなし、通常のプログラム実行。ときにコード接続mysql
この時に時間が、非インタラクティブに対応interactive_timeout
して、無駄な対応wait_timeout
値、プログラムが与えられていません。
(4)パラメータは、効果を確認するために、2つの10S、プログラム睡眠(15)が設けられています。
import time
time.sleep(15)
error
2013
Lost connection to MySQL server during query
2013
error1
(2006, 'MySQL server has gone away')
頻繁にテストを通じてそれが現れた错误1
と错误2
これら2つのエラーが常に異なるオリジナルの推測である、一緒に表示されるので、これら2つのパラメータを操作していないようです。しかし、あなたが操作したい、それについてだと思うMysql
より論理的、サブスレッドは確かにあるかどうかをチェックし、彼らは間違いがないことがわかったと報告して、間違いを報告するために失敗したことを再接続する最初の、
2、再接続が提供されていない、対応するルックSQLの直接実装
try:
cursor.execute(insert_sql) # 直接执行sql
except MySQLdb.Error, e:
print 'error'
# sqlError = "Error %d:%s" % (e.args[0], e.args[1])
print e.args[0]
print e.args[1]
print e[0]
try:
cursor.execute(insert_sql)
except MySQLdb.OperationalError, e:
print 'error1'
print e
pass
次のように印刷結果は以下のとおりです。
error
2006
MySQL server has gone away
2006
error1
(2006, 'MySQL server has gone away')
ここで見つかり、直接実行にsql
時間、それが直接報告しますMySQL server has gone away
エラーを。OK、エラーが再現されています。
3、要約
これはエラーではありませんinteractive_timeout
し、wait_timeout
これら2つのパラメータが影響します。と推定されているmysql
直接実行にsql
時間、スレッドプールは、子供を捜すためのイニシアチブをとるでしょう投げるために時間を見つけることができないLost connection to MySQL server during query
エラーが発生し、その後、投げたときに再接続しようとするMySQL server has gone away
エラーを。
私たちは、コードを再接続しようとしている上にあるので、最初に投げ错误1
、その後投げます错误2
。直接実行sql
時間が、错误1
されて错误2
カバーし、そのプリントアウトするためにMySQL server has gone away
、実際には、错误1
まだ存在しています。
第四に、完全なコードキャプチャMySQLエラーと再接続
コードは以下の通りであります:
try:
cursor.execute(insert_sql)
except MySQLdb.OperationalError: # 先检测数据库连接的问题,检测无误则执行sql
print 'connect error1'
cursor = MakeDbConnection() # 重新连接sql,函数里面的是connect()方法
try:
cursor.execute(insert_sql)
except MySQLdb.ProgrammingError: # 捕获sql语句执行的错误
try:
xxxxxxxxxxxxxxx # 根据各自的需求,重新调整下
cursor.execute(insert_sql) #重新执行sql
except:
pass
except UnicodeDecodeError: # 捕获编码错误,如捕获代码不是utf-8的错误
pass
だから、あなたがすることができ、接続に失敗したキャプチャするために、データベース接続エラーの損失を避けるために再接続して、コードを実行することができ、私の母は、もはや自分自身のスクリプトを停止して心配する必要はありません。
終わり