1

クエリを実行しようとしたとき-

select * from students where id = 20

PythonのMySQLdbライブラリを使用して、例外が発生していまし_mysql_exceptions.OperationalErrorMySQL server has gone away。私の友人の何人かは、既存のmysql接続を使用するように私に提案しました。そのため、このリンクを参照し始め、以下のコードのリンクから同じシングルトンクラスを使用しましたが、それでも同じ例外が発生します。

#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

問題は実際にはシングルトンです。シングルトンとしての唯一の目的は、クラスのインスタンスが1つだけ作成されるようにすることです。クラスでこの行を使用すると、の__metaclass__ = Singletonインスタンスを1つだけ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

のインスタンスを作成するとDBConnectself.instanceはなくなりNoneます。つまり、最初に作成したインスタンス(に格納されますself.instance)は、クラスを呼び出すたびに返されるインスタンスです。

私の(一方的な)アドバイスは、最初から始めて、MySQLdbライブラリで基本的な接続を機能させることです。最初に述べたエラーはMySQLエラーを示しているため、トラブルシューティングを行うことが最善の策である可能性があります。

于 2012-11-22T08:38:06.150 に答える