1

当我试图执行查询时 -

select * from students where id = 20

使用 Python 的MySQLdb库,我遇到了一个异常:_mysql_exceptions.OperationalErrorMySQL server has gone away. 我的一些朋友建议我使用现有的 mysql 连接。所以我开始引用这个链接,并在下面的代码中使用了相同的Singleton类,它仍然给了我同样的异常。

#DBConnect.py
import MySQLdb as connector
from Singleton import Singleton
class DBConnect:
    # As the link suggests
    __metaclass__  = Singleton
    def __init__(self):
        self.dbConnection = connector.Connect(host = 'localhost', user = 'root', 
                                          passwd = 'root', db = 'school')
        self.dbCursor = self.dbConnection.cursor(cursorclass=connector.cursors.DictCursor) 

    def getRecord(self,query):
        self.dbCursor.execute(query)
        result = self.dbCursor.fetchone()
        return result

    def __del__(self):
        self.dbCursor.close()
        self.dbConnection.close()

if __name__ == '__main__':
    dc = DBConnect()
    query = "select * from students where id = 20"
    result = dc.getRecord(query)

我试图创建更多的DBConnect实例,例如 -

dc2 = DBConnect()
dc3 = DBConnect()

当我打印 dc、dc2 和 dc3 时,它给出了 -

<__main__.DBConnect object at 0x8a5fe8c> 
<__main__.DBConnect object at 0x8a5fe8c> 
<__main__.DBConnect object at 0x8a5fe8c>

意思是同一个例子。那么问题似乎是什么?为什么我不能解决这个问题?

4

1 回答 1

1

问题实际上是单例。它作为单例的唯一目的是确保只创建一个类的一个实例。当您__metaclass__ = Singleton在类中使用该行时,您确保只能DBConnect创建一个实例,并且该类的任何后续实例都将指向同一个实例。因此,当您使用dc2 = DBConnect()and时dc3 = DBConnect(),您只是指回相同的实例,因此您看到的标识符相同。

这是导致该行为的单例代码部分:

def __call__(self, *args, **kw):
        if self.instance is None:
            self.instance = super(Singleton, self).__call__(*args, **kw)

        return self.instance

创建 的实例后DBConnectself.instance不再是None,这意味着您第一次创建的实例(存储在 中self.instance)是您调用类时返回的实例。

我的(不请自来的)建议是从头开始,只是尝试获得与 MySQLdb 库一起使用的基本连接 - 您在上面提到的错误表明 MySQL 错误,因此进行一些故障排除可能是最好的行动方案。

于 2012-11-22T08:38:06.150 回答