オリジナル: 最近、古いコードの一部から MySQL OperationalErrors が発生し始めましたが、問題を追跡できないようです。以前は機能していたので、ソフトウェアの更新で何かが壊れたのではないかと思いました。nginxでdjango runfcgiでpython 2.7を使用しています。これが私の元のコードです:
ビュー.py
DBNAME = "test"
DBIP = "localhost"
DBUSER = "django"
DBPASS = "password"
db = MySQLdb.connect(DBIP,DBUSER,DBPASS,DBNAME)
cursor = db.cursor()
def list(request):
statement = "SELECT item from table where selected = 1"
cursor.execute(statement)
results = cursor.fetchall()
次のことを試しましたが、まだ機能しません。
ビュー.py
class DB:
conn = None
DBNAME = "test"
DBIP = "localhost"
DBUSER = "django"
DBPASS = "password"
def connect(self):
self.conn = MySQLdb.connect(DBIP,DBUSER,DBPASS,DBNAME)
def cursor(self):
try:
return self.conn.cursor()
except (AttributeError, MySQLdb.OperationalError):
self.connect()
return self.conn.cursor()
db = DB()
cursor = db.cursor()
def list(request):
cursor = db.cursor()
statement = "SELECT item from table where selected = 1"
cursor.execute(statement)
results = cursor.fetchall()
現在、私の唯一の回避策は、MySQLdb.connect()
mysql を使用する各関数で行うことです。manage.py runserver
また、django を使用すると、nginx がこれらのエラーをスローする一方で、この問題は発生しないことに気付きました。list()
サーバーの起動から数秒以内に呼び出されているため、接続でタイムアウトしているとは思えません。私が使用しているソフトウェアに、これが壊れる原因となるアップデートはありましたか?これに対する修正はありますか?
編集:関数をデーモン化するためのミドルウェアを最近書きましたが、これが問題の原因であることに気付きました。しかし、私はその理由を理解できません。これがミドルウェアのコードです
def process_request_handler(sender, **kwargs):
t = threading.Thread(target=dispatch.execute,
args=[kwargs['nodes'],kwargs['callback']],
kwargs={})
t.setDaemon(True)
t.start()
return
process_request.connect(process_request_handler)