Найти - Пользователи
Полная версия: Кеширование mod_wsgi
Начало » Web » Кеширование mod_wsgi
1
Paher
Добрый день, уважаемые!

Может быть, кто-то сталкивался. Есть у меня приложение на mod_wsgi. Оно выводит данные из некой таблицы MySQL. там данные периодически добавляются. Так вот, я получаю при одинаковых запросах разные ответы. т.е. например показывает, например, количество записей в таблице одно, через секунду показывает меньше(хотя записей меньше не становится, их количество только растет), затем снова возвращается к реальной цифре…

грешу на кеширование mod_wsgi. Собственно, вопрос такой, состоятельна ли моя теория и как проверить? Как исправить, если кто знает?

P.S. Пробовал эти запросы напрямую в MySQL-клиенте, результаты стабильные, не прыгают.
Андрей Светлов
Ну вы и спросили, уважаемый!
Абстрактное приложение на какой-то базе (с ней более или менее ясно), использующее непонятно какой интерфейс к БД и неясно как прицепленное к апачу.
Эта связка не работает.
Догадайтесь, где закрался злобный баг?

Очень удобно и легко отвечать на вопросы, которые можешь воспроизвести.
И очень лениво догадываться, что у вопрошающего не так.
igor.kaist
Paher
грешу на кеширование mod_wsgi
оно там вроде не кешируется же. Андрей Светлов верно сказал. Никакой фреймворк не используете?
Paher
Прошу прощения, если непонятно объяснил. Расскажу подробнее.

Итак, в базе MySQL есть таблица. с данными. Строки в таблицу только добавляются и никак не удаляются

вот входной скрипт main.py

import cgi
import monitoring


# End of initialisation


def application(environ, start_response):

cgidata = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ)
answer = monitoring.get_result(cgidata['begin'])
start_response('200 OK', [('Content-type', 'text/plain')])
return answer
Есть питоновский скрипт, который запрашивает количество записей в таблице(обычный SELECT COUNT(*)) monitoring.py

import MySQLdb

cursor = MySQLdb.connect(host, user, passwd, db, cursorclass = MySQLdb.cursors.DictCursor).cursor()

def get_result(begin):
sql = '''SELECT COUNT(*) FROM `monitoring` WHERE `date` > %s''' % begin
cursor.execute(sql)
count = cursor.fetchone()['num']
return count
настройки mod_wsgi


WSGIScriptAlias / /var/www/wsgi/main.py

<Directory /var/www/wsgi/>
Order deny,allow
Allow from all
</Directory>

так вот, при одинаковом параметре begin возвращаемое значение count должно либо оставться прежним, либо увеличиваться. а он, временами, скачет назад, как будто показывает уже отданные ответы

Фреймворк не использую
regall
Насколько я знаю, SQL стандарт не придерживается строгого порядка выдачи результатов запроса, пока явно не указан ORDER BY. С таким успехом вы можете итерировать по словарю и получать каждый раз другой порядок обхода. Судя по всему проблема в этом.
Paher
я получаю количество записей разное, а не разный порядок записей
regall
Paher
я получаю количество записей разное, а не разный порядок записей
Попробуйте выводить значение
cgidata['begin']
при каждом запуске. Не меняется, ли оно…
igor.kaist
Хм… может быть connect перенести в функцию get_rezult?
Paher
connect специально вынес за пределы функции, чтобы он происходил при импорте модуля и потом время на подключение не тратить. собственно, mod_wsgi именно поэтому и поставил, чтобы все подготовительные работы (подключение базы, импорт модулей) провести один раз, а в дальнейшем только пользоваться ими.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB