【问题标题】:Caching of DB queries in django在 django 中缓存数据库查询
【发布时间】:2012-08-16 15:09:36
【问题描述】:

我有使用两个外部脚本的 django 应用程序。一个脚本将文件从 A 移动到 B,将 B 的值存储在数据库中 - 然后存在,它应该提交任何可能打开的事务。下一个脚本对文件的移动做出反应(使用 inotify),计算 md5sum(这显然需要时间),然后在数据库中查找一个条目,如 x = Queue.get(filename=location)。 查看我的日志的时间戳,我 100% 确定第一个脚本在第二个脚本(实际上是一个守护进程)运行查询之前很久就完成了。有趣的是,重启守护进程后,事情就可以完美运行了。

这让我相信,在守护进程运行期间,查询集(我实际上每次使用 inotify 检测到新文件时都会运行上面显示的代码)以某种方式被缓存。然而,我不想一直重启守护进程,而是强制查询实际使用数据库而不是缓存。

django 文档对此并没有多说 - 但是通常 django 不用作外部 :)

提前感谢您的任何提示!

PS:根据要求,来自守护进程的相关部分的来源

def _get_info(self, path):
    try:
        obj = Queue.objects.get(filename=path)
        x = obj.x
        return x
    except Exception, e:
        self.logger.error("Error in lookup: %s" % e)
        return None

每次将新文件移动到监视目录时,线程都会调用它

而第一个脚本中的代码看起来像

for f in Queue.objects.all():
    if (matching_stuff_here):
         f.filename = B
         f.save()    
         sys.exit(0)

【问题讨论】:

    标签: python database django caching


    【解决方案1】:

    您没有显示任何实际代码,所以我们必须猜测。我的猜测是,即使第一个脚本中的事务已经完成并提交,你仍然在脚本 B 中的一个开放事务中:并且由于事务隔离,在完成事务之前你不会看到 B 中的任何更改在那里。

    【讨论】:

    • 我更新了我的帖子以包含相关的源 sn-ps。但是,就我掌握的全部内容而言,我必须在每次在守护程序中查找后强制事务结束,对吧?
    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2012-09-11
    • 1970-01-01
    相关资源
    最近更新 更多