MySQLdbを使用しています( http://mysql-python.sourceforge.net/ )。 connection.openとconnection.sqlstate()が機能しないようです。以下はコードです:
def open(self):
#TODO: check the connection's status
# self.__conn.open OR self.__conn.sqlstate()
try:
print "sqlstate:"+str( self.__conn.sqlstate() )
print "open?"+str( self.__conn.open )
return "00000" == self.__conn.sqlstate()
except Exception as e:
print "Exception while checking MYSQL Connection:"+str(e)
return False
しかし、「Sudo service mysql stop; sleep 60; Sudo service mysqlstart;」を実行するとテストを行うために。出力は次のとおりです。次の出力が永遠に繰り返されたようです(私は最終的にプロセスを強制終了しました)。サーバーがダウンしているとき、connection.openは1で、connection.sqlstate()は00000です。ただし、サーバーがアップしているときでも、connection.executemany()は例外をスローします。何か案は?ありがとう。
...
2015-10-20 14:09:06 Exception while executing statement:(2006, 'MySQL server has gone away')
2015-10-20 14:09:06 sqlstate:00000
2015-10-20 14:09:06 open?1
2015-10-20 14:09:06 Reconnected to MYSQL.
2015-10-20 14:09:06 Exception while executing statement:(2006, 'MySQL server has gone away')
2015-10-20 14:09:06 sqlstate:00000
2015-10-20 14:09:06 open?1
2015-10-20 14:09:06 Reconnected to MYSQL.
2015-10-20 14:09:06 Exception while executing statement:(2006, 'MySQL server has gone away')
2015-10-20 14:09:06 sqlstate:00000
2015-10-20 14:09:06 open?1
2015-10-20 14:09:06 Reconnected to MYSQL.
2015-10-20 14:09:06 Exception while executing statement:(2006, 'MySQL server has gone away')
2015-10-20 14:09:06 sqlstate:00000
2015-10-20 14:09:06 open?1
...
[〜#〜]更新[〜#〜]
もう一度テストしました。出力は次のとおりです。各スリープは10秒です。サーバーがダウンしている場合でも、connection.openが1であることを除いて、出力はOKです。しかし、connection.sqlstate()は正しい(HY000)。
2015-10-20 14:35:56 Exception while executing statement:(2006, 'MySQL server has gone away')
2015-10-20 14:35:56 Exception while ping:(2003, "Can't connect to MySQL server on '10.1.1.25' (111)")
2015-10-20 14:35:56 sqlstate:HY000
2015-10-20 14:35:56 open?1
2015-10-20 14:35:56 sleeping...
2015-10-20 14:36:06 Exception while ping:(2003, "Can't connect to MySQL server on '10.1.1.25' (111)")
2015-10-20 14:36:06 sqlstate:HY000
2015-10-20 14:36:06 open?1
2015-10-20 14:36:06 sleeping...
2015-10-20 14:36:16 Exception while ping:(2003, "Can't connect to MySQL server on '10.1.1.25' (111)")
2015-10-20 14:36:16 sqlstate:HY000
2015-10-20 14:36:16 open?1
2015-10-20 14:36:16 sleeping...
2015-10-20 14:36:26 Exception while ping:(2003, "Can't connect to MySQL server on '10.1.1.25' (111)")
2015-10-20 14:36:26 sqlstate:HY000
2015-10-20 14:36:26 open?1
2015-10-20 14:36:26 sleeping...
2015-10-20 14:36:36 Exception while ping:(2003, "Can't connect to MySQL server on '10.1.1.25' (111)")
2015-10-20 14:36:36 sqlstate:HY000
2015-10-20 14:36:36 open?1
2015-10-20 14:36:36 sleeping...
2015-10-20 14:36:46 Exception while ping:(2003, "Can't connect to MySQL server on '10.1.1.25' (111)")
2015-10-20 14:36:46 sqlstate:HY000
2015-10-20 14:36:46 open?1
2015-10-20 14:36:46 sleeping...
2015-10-20 14:36:56 Exception while ping:(2003, "Can't connect to MySQL server on '10.1.1.25' (111)")
2015-10-20 14:36:56 sqlstate:HY000
2015-10-20 14:36:56 open?1
2015-10-20 14:36:56 sleeping...
2015-10-20 14:37:06 sqlstate:00000
2015-10-20 14:37:06 open?1
2015-10-20 14:37:06 Reconnected to MYSQL.
私はしばらくの間この解決策を探していましたが、エレガントな解決策を見つけることができませんでした。
それを直接行う方法はないようです。クエリを実行しようとすると、接続が閉じられていることがわかります。
私はこの答えに似た何かをすることになります: Pythonで接続が生きていることを確認する方法は?
これを試して-
import MySQLdb
def main():
# Connect to the MySQL database
db = MySQLdb.connect(Host = 'z.cs.utexas.edu', user = 'userName', passwd = 'password', db = 'dbName')
# Check if connection was successful
if (db):
# Carry out normal procedure
print "Connection successful"
else:
# Terminate
print "Connection unsuccessful"
次のようにコーディングする必要があります。たとえば、前に実行するたびに、mysql-serverにpingを実行します。
import MySQLdb as db
class DB(object):
def __init__(self):
try:
self.conn =mdb.connect(Host='***',port=3306,user='',passwd='')
if (self.conn):
INFO_LOG("DB init success")
else:
INFO_LOG("DB init fail")
self.conn.autocommit(True)
self.conn.select_db(DB_NAME)
self.cursor = self.conn.cursor()
except Exception as e:
CRITICAL_LOG("DB init fail %s " % str(e))
def insert(self,player_id,cmd):
try:
if self.conn is None:
self.__init__()
else:
self.conn.ping(True)
self.cursor.execute('INSERT INTO table values("%s",%s")' %
(player_id,cmd))
except Exception as e:
import traceback
traceback.print_exc()
#error ocurs,rollback
self.conn.rollback()
誰かがこれが役立つと思った場合に備えて:
import socket
import time
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while sock.connect_ex(('db', 3306)) != 0: # 'db' is the Host, 3306 is the port
print('MySQL is not ready yet.')
time.sleep(2)
sock.close()
print("Now it's up and running! Bye!")