2013-10-24 64 views
1

我該如何偶爾寫入頻繁讀者的sqlite數據庫?我使用PHP,但這並不重要。我知道查詢()將返回SQLITE_BUSY,我可以再試一次,並且我可以撥打busyTimeout來幫助,但我希望有一種內置方式可以告訴數據庫自行等待。現在,我正在使用:實施生產者/消費者w/SQLite3的正確方法是什麼?

function wait_query_db($db, $query) { 
    do { 
     $db->busyTimeout(1000); 
     $result = @$db->query($query); 
    } while ($db->lastErrorCode() == SQLITE_BUSY); 
    return $result; 
} 
+0

真的這就是所有的DMS運行參數定義DBA – Kyle

+1

頻繁的讀者或作家?因爲在SQLite中,理論上你可以擁有無​​限的讀者。您的數據庫在寫入期間應該鎖定,寫入 –

+0

「我如何偶爾寫入頻繁讀者的sqlite數據庫?」基本上,寫入很少,但可能需要幾分鐘,但讀取頻繁且速度很快。 – Andy

回答

1

busyTimeout(或等值PRAGMA busy_timeout內置的方式來告訴數據庫等待。

如果您想等待更長時間,則應該使用較大的超時時間。

如果你的PHP足夠新,至少有SQLite 3.7,並且如果你的數據庫沒有通過網絡文件系統訪問,你應該考慮啓用write-ahead logging,這可以防止讀者和作者互相阻塞。

1

沒有「內建」方式。增加繁忙超時。你可以通過執行它設置爲連接本身:

PRAGMA busy_timeout = milliseconds 

(可用自SQLite的3.7.15)

+0

它看起來像'PRAGMA busy_timeout = 1000;'與'$ db-> busyTimeout(1000);'相同。如果是這樣的話,那麼打開數據庫後我只需要調用它一次,對吧?並可以從我的循環中刪除它? – Andy

+0

無論您使用哪種表單,只需調用一次。 –

+0

是的,這是一樣的,你可以肯定地從循環中刪除設置超時。 – SqliteDog