+ -
当前位置:首页 → 问答吧 → 如何降低数据库连接数

如何降低数据库连接数

时间:2011-03-17

来源:互联网

本帖最后由 lolizeppelin 于 2011-03-17 17:10 编辑

#!/usr/bin/python
import sys,os
import pexpect
import MySQLdb
#import shelve
from UserDict import UserDict
reload(sys)
sys.setdefaultencoding('utf-8')

class mysqlClass(object):
    def __init__(self):
        """
        self.dblink use to define MySql link info
        """
        self.swich = 0
        self.dblink = {'dbuser':'root','dbport':3306,'dbpass':'loli383','dbip':'127.0.0.1','dbname':'wrz_db'}

    def __setitem__(self,key,item):
        if self.swich == 1:
            self.closeDB()
            self.swich = 0
        self.dblink[key] = item

    def __getitem__(self,key,item):
        if key in self.dblink:
            return self.dblink[key]
        else:
            print "error key"

    def __openDB(self):
        sqlLink = MySQLdb.connect(host=self.dblink['dbip'],user=self.dblink['dbuser'],passwd=self.dblink['dbpass'],\
                                db=self.dblink['dbname'],port=self.dblink['dbport'])
        self.swich = 1
        return sqlLink

    def closeDB(self):
        if self.swich == 0:
            return 0
        self.__openDB().close()
        return 1

    def __executeSqlCommand(self,command):
        sql = self.__openDB().cursor()
        sql.execute(command)
        rows = sql.fetchall()
        sql.close()
        return rows
   
    def sqlCommand(self,command='show databases',autoCloseDB = 1):
        """
        use this script to execute your sql command
        """
        for row in self.__executeSqlCommand(command):
            print row

        if autoCloseDB == 1:
            self.closeDB()

p = mysqlClass()
p['dbname']=''
p['dbpass']=''
import time
for i in range(1,10):
    p.sqlCommand('select * from mysql.user',autoCloseDB=0)
    time.sleep(3)

p.closeDB()


如果我设置autoCloseDB=0的话,netstat看连接数是10个,设置1的话19个
因为设置为0的时候我没有关闭数据库连接的,一个是1+1个连接才丢啊,为什么每次执行还是打开了新的连接
还有,设置为1为什么有18+1个,我的循环才9次啊?
每个都打开了2个连接?

也就是说我 每次 self.closeDB()的时候都重新打开了连接?
也就是说每次__openDB(self)都建立了新的连接?

作者: lolizeppelin   发布时间: 2011-03-17

- -我明白了,每次sql = self.__openDB().cursor()都是一个新的连接.....
只有直接在sql这次赋值下面操作才可以不开新连接,否则都会一直新开连接

作者: lolizeppelin   发布时间: 2011-03-17

本帖最后由 lolizeppelin 于 2011-03-17 17:54 编辑

自己解决啦
把__openDB(self): 赋值给一个self.xxx变量,每次调用这个变量就不会新开连接啦

没有指针还真麻烦

不过好像可以通过modules模块来达到目的?
直接用getattr来获得类似函数地址来调用好像也不用新开连接?

作者: lolizeppelin   发布时间: 2011-03-17