mysql connection不断增加

程序运行以后,刷新页面,在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不再持续增加。

原文地址:https://www.cnblogs.com/xiami303/p/3414505.html