import threading import time import MySQLdb import traceback import sys import datetime class DBCursor: def __init__(self,lock,cursor,db): self.lock=lock self.cursor=cursor self.db=db lock.acquire() def close(self): self.lock.release() def execute(self,format,*arg): try: #print "format:",format #print "args:",arg return self.cursor.execute(format,*arg) except (MySQLdb.InterfaceError,MySQLdb.OperationalError): print>>sys.stderr, datetime.datetime.now() traceback.print_exc() self.cursor=self.db.reconnect() print "format:",format print "args", arg return self.cursor.execute(format,*arg) except: print>>sys.stderr, datetime.datetime.now() traceback.print_exc() print "format:",format print "args", arg def fetchone(self): try: return self.cursor.fetchone() except (MySQLdb.InterfaceError,MySQLdb.OperationalError): print>>sys.stderr, datetime.datetime.now() traceback.print_exc() self.cursor=self.db.reconnect() return self.cursor.fetchone() except: print>>sys.stderr, datetime.datetime.now() traceback.print_exc() def fetchall(self): try: return self.cursor.fetchall() except (MySQLdb.InterfaceError,MySQLdb.OperationalError): print>>sys.stderr, datetime.datetime.now() traceback.print_exc() self.cursor=self.db.reconnect() return self.cursor.fetchall() except: print>>sys.stderr, datetime.datetime.now() traceback.print_exc() def insert_id(self): try: return self.cursor.lastrowid() except (MySQLdb.InterfaceError,MySQLdb.OperationalError): print>>sys.stderr, datetime.datetime.now() traceback.print_exc() self.cursor=self.db.reconnect() return self.cursor.lastrowid() except: print>>sys.stderr, datetime.datetime.now() traceback.print_exc() class DBLayer: def __init__(self): self.db=None self.maxTries=30 self.cursorLock=threading.RLock() def connect(self,**arg): self.dbArgs=arg self.db=MySQLdb.connect(**arg) def reconnect(self): count=0 db=None while count>sys.stderr, "database reconnect try: ",count,"of",self.maxTries time.sleep(2*count) except: print>>sys.stderr, datetime.datetime.now() traceback.print_exc() else: self.db=db return self.db.cursor() raise IOError, "could not reconnect to database" def cursor(self): return DBCursor(self.cursorLock,self.db.cursor(),self) def commit(self): try: return self.db.commit() except: print>>sys.stderr, datetime.datetime.now() traceback.print_exc() def rollback(self): try: return self.db.rollback() except: print>>sys.stderr, datetime.datetime.now() traceback.print_exc()