程序运行以后,刷新页面,在mysql的status里面检测到Threads_connected的值不断上升。
对程序断点调试,发现,是由于下面的代码导致。
class ConnectionMySQL(object): """ MySQL """ def __init__(self): self.mypool = pool.QueuePool(self.getconn, pool_size=15, timeout=30) self.conn = self.mypool.connect() print self.conn def getconn(self): c = libdb.connect(host=configeApp.DB_HOST, port=configeApp.DB_PORT, user=configeApp.DB_USER, passwd=configeApp.DB_PASSWD, db=configeApp.DB_DATABASE, use_unicode=True, charset='utf8') return c def ExceptionHandling_mysql(self,sql): try: cur = self.conn.cursor(libdb.cursors.DictCursor) rowcount = cur.execute(sql) self.conn.commit() result = cur.fetchall() while cur.nextset(): pass except Exception, e: print 'This is mysql: %s' % (sql) print e result = [] self.mysql_del(cur) return result def mysql_del(self, cur): if cur: cur.close() def mysql_delCon(self): if self.conn: self.conn.close()
问题在于,每次我创建了ConnectionMySQL的对象cm,在使用完毕,调用cm.mysql_delCon(),并没有真正的销毁掉connection对象。也就是mysql的connection是没有关闭的,导致了connection不断增加。
于是,我以我自己的需求,我不建立连接池,直接获取connection对象,那么可以解决问题。如果为了和同事共用代码,就需要在我不需要链接的时候,把连接池里的conn对象包括连接池一起销毁掉。
查看class QueuePool(Pool)类的源代码,找到函数dipose可以实现销毁自己的功能:
def dispose(self): while True: try: conn = self._pool.get(False) conn.close() except sqla_queue.Empty: break self._overflow = 0 - self.size() self.logger.info("Pool disposed. %s", self.status())
于是,修改mysql_delCon函数为:
def mysql_delCon(self): if self.conn: self.conn.close() if self.mypool: self.mypool.dispose()
测试,也能正常工作。Threads_connected不再持续增加。