zoukankan      html  css  js  c++  java
  • 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不再持续增加。

  • 相关阅读:
    CCF201509-3 模板生成系统(100分)
    CCF201509-3 模板生成系统(100分)
    CCF201512-3 画图(100分)
    CCF201512-3 画图(100分)
    CCF201403-3 命令行选项(100分)
    CCF201403-3 命令行选项(100分)
    Java---jdk与jre的区别
    Java--- J2EE、Java SE、Java EE、Java ME 区别
    Java---java ee和j2ee
    Java---null
  • 原文地址:https://www.cnblogs.com/xiami303/p/3414505.html
Copyright © 2011-2022 走看看