Оригинал: Я недавно начал получать MySQL OperationalErrors из некоторого моего старого кода и, похоже, не смог отследить проблему. Поскольку он работал раньше, я подумал, что это может быть обновление программного обеспечения, которое что-то сломало. Я использую python 2.7 с django runfcgi с nginx. Вот мой оригинальный код:
views.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()
Я пробовал следующее, но он все еще не работает:
views.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. Также я заметил, что при использовании django manage.py runserver
у меня не было бы этой проблемы, в то время как 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)