当我试图执行一个查询时-

select * from students where id = 20

使用Python的MySQLdb库,我得到一个异常:_mysql_exceptions.OperationalErrorMySQL server has gone away。我的一些朋友建议我使用现有的MySQL连接。所以我开始引用this link并使用下面代码中链接的同一个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>

意思是相同的例子。那么问题是什么呢?为什么我不能解决这个问题?

最佳答案

问题其实是单身汉。它作为单例的唯一目的是确保只创建类的一个实例。当您在类中使用__metaclass__ = Singleton行时,您将确保只能创建DBConnect的一个实例,并且该类的任何后续实例都将指向同一实例。因此,当您使用dc2 = DBConnect()dc3 = DBConnect()时,您只是在引用同一个实例,因此所看到的标识符是相同的。
以下是导致此行为的单例代码部分:

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

        return self.instance

创建DBConnect的实例后,self.instance不再是None,这意味着您首先创建的实例(存储在self.instance中)是在调用类时返回的实例。
我(未经请求)的建议是从头开始,尝试与MySQLdb库建立基本连接-上面提到的错误表示MySQL错误,因此进行一些故障排除可能是最佳的操作方法。

09-18 02:04