2011-07-12 57 views
1

可能重复:
Django cache.set() causing duplicate key errorDjango缓存导致数据库中重复的键错误?

我就遇到了这个问题,使用Django核心的数据库缓存:

ERROR: duplicate key value violates unique constraint "cache_pkey" 
STATEMENT: INSERT INTO "cache" (cache_key, value, expires) VALUES (E':1:cms-menu_nodes_en-us_1', E'gAJdcQEoY21lbnVzLmJhc2UKTmF2aW 
LOG: server process (PID 8453) was terminated by signal 9: Killed 
LOG: terminating any other active server processes 
LOG: all server processes terminated; reinitializing 
FATAL: could not create shared memory segment: Cannot allocate memory 
DETAIL: Failed system call was shmget(key=5432001, size=29278208, 03600). 

我在表中果然一看,有一个输入密钥':1:cms-menu_nodes_en-us_1'。我发现了一个类似的问题here,但无法准确理解问题所在。

任何人有任何想法或建议?听起来像Django核心中的错误,因为如果存在密钥,它应该更新记录。

编辑:我应该澄清,数据库是PostgreSQL 8.4.7。感谢lazerscience。

编辑@杰克中号:我一直没能复制这一错误,但相信该代码是在django.core.cache.backends.db.DatabaseCache在一个名为set()方法调用_base_set()

+0

你试过什么数据库后端?与其他人一起尝试... –

+0

将此条目添加到缓存的代码是什么? –

回答

1

听起来像是在Django核心中的错误,因为如果存在密钥,它应该更新记录。

确实,但我建议所说的bug与并发问题有关,在这种情况下,它可以在应用程序级别修复。就像在两个相同的资源/页面/任何运行exists()语句的相邻调用中一样,查找没有行,然后继续插入结果 - 不发出任何类型的锁,也没有将事务包装在事务中放弃违规通话和(因为它只是一个缓存)继续。

它还引出了一个问题:你确定你应该首先缓存在你的数据库中吗?数据库通常是Web应用程序中的一个瓶颈(特别是在使用ORM时),缓存的重点在于避免瓶颈。你不应该使用memcache吗?

+0

我的问题是我内存受限,因此添加memcache不是一个选项。该网页使sql调用的数量保持不变,而不是在代码中优化,单个数据库调用显着加快了速度。这是假设缓存工程.... – GoogleDroid

相关问题