2013-03-02 40 views
0

我有一臺服務器正確執行9/10次,但有時我得到錯誤「在查詢過程中丟失與MySQL服務器的連接」,然後整個過程停止/凍結。確保查詢得到執行

我試圖讓MySQL查詢再次執行,如果它失敗使用此功能,不幸的是,似乎代碼停止或卡住,每當我得到一個錯誤。難道我做錯了什麼?

下面的字符串是一樣的東西:SELECT xx FROM xxx WHERE xxx

try: 
    db = MySQLdb.connect (host = "", 
     user = "", 
     passwd = "", 
     db = "") 
except MySQLdb.Error, e: 
    print("Error %d: %s" %(e.args[0], e.args[1])) 
    sys.exit(1); 
cursor = db.cursor() 

def mysql_handling(string): 
    while 1: 
     try: 
      cursor.execute(string) 
      if 'SELECT' not in string: 
       db.commit()   
      break 
     except: 
      mysql_error_tracking(string) 

mysql_error_tracking是要監視的查詢失敗,大部分時間(不相關)的功能。

+1

可以是任何這些:http://dev.mysql.com/doc/refman/5.0/en/gone-away.html – Tshepang 2013-03-02 12:40:44

+0

我經歷過這已,我只是想檢測出現錯誤時再試一次。 – Lazykiddy 2013-03-02 12:42:37

+0

另外,只需在'except'塊中放入'mysql_error_tracking'函數;不需要爲它創建一個額外的標識符'x'。 – Tshepang 2013-03-02 12:43:50

回答

0

添加一個超時的連接方法:

db = MySQLdb.connect (host = HOST, user = USER, passwd = PASS, db = DB, 
         connect_timeout = TIMEOUT) 

except塊這樣做,這樣你做一個重新連接。

爲了讓您的生活更輕鬆,請將連接代碼放在單獨的功能中,以便重新使用它。像這樣(未經):

def get_cursor() 
    try: 
    db = MySQLdb.connect (host = HOST, user = USER, passwd = PASS, db = DB, 
          connect_timeout = TIMEOUT) 
    except MySQLdb.Error, e: 
     print("Error %d: %s" %(e.args[0], e.args[1])) 
     sys.exit(1); 
    return db.cursor() 

def mysql_handling(cursor, string): 
    while True: 
     try: 
      cursor.execute(string) 
      if 'SELECT' not in string: 
       db.commit()  
      break 
     except MySQLdb.MySQLError: 
      cursor.close() 
      mysql_error_tracking(string) 
      cursor = get_cursor() 

def main(): 
    mysql_handling(get_cursor(), string) 
+0

謝謝!如果查詢不正確,只有這個代碼不會在無限循環中返回? – Lazykiddy 2013-03-02 15:11:40