Недавно я изучил веб-фреймворк Tornado, чтобы обслуживать множество последовательных соединений множеством разных клиентов.
У меня есть обработчик запросов, который в основном берет зашифрованную строку RSA и расшифровывает ее. Расшифрованный текст представляет собой строку XML, которая анализируется написанным мной обработчиком документов SAX. Все работает отлично, а время выполнения (на HTTP-запрос) составляет примерно 100 миллисекунд (с расшифровкой и разбором).
XML содержит хэш имени пользователя и пароля пользователя. Я хочу подключиться к серверу MySQL, чтобы убедиться, что имя пользователя соответствует хэшу пароля, предоставленному приложением.
Когда я добавляю в основном следующий код:
conn = MySQLdb.connect (host = "192.168.1.12",
user = "<useraccount>",
passwd = "<Password>",
db = "<dbname>")
cursor = conn.cursor()
safe_username = MySQLdb.escape_string(XMLLoginMessage.username)
safe_pass_hash = MySQLdb.escape_string(XMLLoginMessage.pass_hash)
sql = "SELECT * FROM `mrad`.`users` WHERE `username` = '" + safe_username + "' AND `password` = '" + safe_pass_hash + "' LIMIT 1;"
cursor.execute(sql)
cursor.close()
conn.close()
Время выполнения HTTP-запроса увеличивается до 4-5 секунд! Я считаю, что это связано со временем, которое требуется для подключения к самому серверу базы данных MySql.
Мой вопрос в том, как я могу ускорить это? Могу ли я объявить соединение MySQL в глобальной области и получить к нему доступ в обработчиках запросов, создав новый курсор, или это приведет к проблемам параллелизма из-за асинхронного дизайна Tornado?
В принципе, как я могу не создавать новое соединение с сервером MySQL КАЖДЫЙ Http-запрос, поэтому для реализации требуется всего доля секунды, а не несколько секунд.
Также обратите внимание, что SQL-сервер фактически находится на той же физической машине, что и экземпляр веб-сервера Tornado.
Обновлять
Я только что выполнил простой запрос MySQL через профилировщик, тот же код ниже.
Вызов функции init 'connections.py' занял 4,944 секунды. Это не кажется правильным, не так ли?
Обновление 2
Я думаю, что работа с одним соединением (или даже несколькими с очень простым пулом соединений БД) будет достаточно быстрой, чтобы справиться с пропускной способностью, которую я ожидаю для экземпляра веб-сервера торнадо.
Если 1000 клиентов должны получить доступ к запросу, типичное время запроса составляет тысячи секунд, самому неудачливому клиенту придется ждать только одну секунду, чтобы получить данные.