2014-07-04 69 views
0

有, 我有一個應用程序繼續運行,需要訪問sqlite3數據庫。 約1022次打開/關閉同一數據庫後程序崩潰。sqlite3 C API不能打開/關閉超過1024數據庫

例:

int i = 1024; 
sqlite3 * db; 
while(i){ 

    sqlite3_open("database.sqlite",&db) ; 
    // exécute prepared statement 
    sqlite3_close(db); 
    i--; 

} 

我無法打開數據庫後1022迭代,IV得到了錯誤: 無法打開數據庫無法打開數據庫fileFailed準備數據庫庫例程叫出來序列2的

我看看限制sqlite文檔,但沒有提到這樣的限制: http://sqlite.org/limits.html

+0

爲我工作。你能分享一些關於你的環境的額外信息,比如你正在運行的sqlite版本和操作系統。 – laalto

回答

0

你可能沒有sqlite3_finalize你準備好的陳述。您無法關閉仍有未完成準備語句的數據庫。你檢查sqlite3_close的結果代碼嗎?

1

您正在碰到操作系統本身的max open files per process限制。

看一看ulimit -S -a:(這裏顯示例如礦)

xenon-lornix:~> ulimit -S -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 29567 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 29567 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

去翻列表,看到它說open files?默認限制爲1024,這意味着用戶(您在這種情況下!)最多隻能同時打開每個進程的1024個文件。

一個典型的程序默認打開3個文件,STDIN,STDOUT,& STDERR ...留下1021個文件描述符可用...所以當你打開1022nd數據庫時,它拒絕並失敗。

一定要閱讀涉及ulimit的手冊頁,令人驚訝的是,它不是 man ulimit !最好的文檔是bash,所以請嘗試man bash,然後按斜槓('/')並鍵入ulimit來搜索它。 (在我的bash手冊頁的3383行左右)

各種ulimits的更詳細的編程方面可以在man getrlimit中找到。

請記住ulimit與硬件軟件限制。用戶可以將限制(通過-S)從0更改爲限制值爲HARD-H)。但是用戶不能RAISE他們HARD限制,如果用戶降落時他們HARD限制,他們無法再次上揚回來。只有超級用戶(root)可能會提高限制。

因此,要提高你的SOFTopen files限制,試試這個:

ulimit -S -n 8192 

一個怪癖...的ulimit 默認來設置HARD限制。我有一個別名的ulimit默認保存到限制,這樣的:

alias ulimit='ulimit -S' 

如果你碰巧添加-H選項,它會覆蓋默認-S)選項,所以一切都很好。

要查看限制:

ulimit -H -a 
+0

等等......你正在關閉循環中的數據庫......很奇怪。 – lornix

+0

仔細閱讀sqlite3文檔......似乎由於各種因素,文件__may__沒有立即關閉,所以很有可能你達到了1024的限制,因爲sqlite3服務已經延遲了文件描述符的發佈。 – lornix