当我试图执行一个查询时-
select * from students where id = 20
使用Python的MySQLdb库,我得到一个异常:
_mysql_exceptions.OperationalError
说MySQL 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错误,因此进行一些故障排除可能是最佳的操作方法。