def create_cursor(cursors, ts, tester): c = ConnectionPool.cursor() cursors.append(c) t = threading.Thread(target = close_cursor, args = (c, )) t.setDaemon(True) t.start() ts.append(t) # print ConnectionPool._count, ConnectionPool.MAX_COUNT tester.assertTrue(ConnectionPool._count <= ConnectionPool.MAX_COUNT + 1) tester.assertTrue(len(ConnectionPool._connections) <= ConnectionPool.MAX_COUNT)
class TransactionManager(object): """ handles all transaction and db query """ def __init__(self): self.conn = ConnectionPool().pool.connection() self.cursor = self.conn.cursor() def startTransaction(self): """ For databases that support transactions, the Python interface silently starts a transaction when the cursor is created. so we do nothing here. """ pass def commitTransaction(self): self.cursor.close() self.conn.commit() def endTransaction(self): """ 结束事务 """ pass def rollbackTransaction(self): """ 回滚事务 """ self.cursor.close() self.conn.rollback() def queryInsert(self, sqlid, inputObject): """ 查询插入 """ #======================================================================= # resultclasstype参数在没有返回值的时候用不到 #======================================================================= sql, resultclasstype = processSql(sqlid, inputObject) try: var = self.cursor.execute(sql) return var except IntegrityError: return -1 def queryUpdate(self, sqlid, inputObject): """ 查询更新 """ self.queryInsert(sqlid, inputObject) def queryDelete(self, sqlid, inputObject): """ 查询删除 """ self.queryInsert(sqlid, inputObject) def queryForObject(self, sqlid, inputObject): """ 查询并返回一个对象 """ sql, resultclasstype = processSql(sqlid, inputObject) self.cursor.execute(sql) objList = Data2Object.data2object(self.cursor, resultclasstype) if len(objList) == 0: return None elif len(objList) == 1: return objList[0] else: raise Exception('query for one object, but get many.'); def queryForList(self, sqlid, inputObject): """ 查询并返回一个列表 """ sql , resultclasstype = self.processSql(sqlid, inputObject) self.cursor.execute(sql) objList = self.data2object(self.cursor, resultclasstype) return objList def processSql(self, sqlid, inputObject): # TODO (zj) return '', '' def data2object(cursor, resultclasstype): # TODO (zj) return [] def execute_sql(self, sql, pre_sql=None): r = [] try: if pre_sql: self.cursor.execute(pre_sql) self.cursor.execute(sql) r = self.cursor.fetchall() self.conn.commit() except Exception, e: print "Exception when execute_sql:%s, rollback" % e self.conn.rollback() finally: