2011-07-12 60 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

相關問題