2012-09-12 201 views
0

我在共享文件夾上有一個SQLite3數據庫。我想從Java應用程序覆蓋數據庫文件。雖然這個文件的讀寫流量很低,但我想確保:a)覆蓋不會損壞db文件,以及b)任何可能想要訪問db文件的人都會看到它被鎖定,直到被覆蓋做完了。我目前的計劃看起來是這樣的......覆蓋共享網絡文件夾上的SQLite數據庫

String query = "BEGIN EXCLUSIVE TRANSACTION"; 
/* Execute this query*/ 
File sourceFile = new File(LocalPath); 
File destFile = new File(DbPath); 

InputStream inStream = new FileInputStream(sourceFile); 
OutputStream outStream = new FileOutputStream(destFile); 

byte[] buffer = new byte[1024]; 

int length; 

while((length = inStream.read(buffer)) > 0) { 
    outStream.write(buffer, 0, length); 
} 

inStream.close(); 
outStream.close(); 

/* Now release lock */ 

query = "ROLLBACK TRANSACTION"; 

/* Execute query */ 

所以從SQLite的導讀這裏http://www.sqlite.org/howtocorrupt.html,似乎這個鎖就存在於雜誌,當我運行回滾事務複製後進行更新。與此同時,如果客戶端在我複製時嘗試訪問Db,我想他們不會找到該文件,並且我的SQLite驅動程序假定該數據庫不存在。對?

我的問題是...是放置在數據庫上的一個有爭議的點?有沒有更好的策略或一種方法來使數據庫顯示鎖定而不是丟失?另外,我是否在數據庫腐敗中冒着巨大風險,這使得這種行爲不可行?另一個想法是鎖定數據庫文件,將新文件寫入不同的名稱,然後在寫入完成後重命名,然後釋放鎖定...對此有何想法?

不知道覆蓋數據庫文件是否是一個絕妙的想法,但我可以想到的唯一可行的事情就是我擁有的資源(在網絡上的共享文件夾中的數據庫上運行大量事務是令人無法接受的緩慢。我知道我在共享文件夾上運行SQLite數據庫時出現腐敗的風險更高)。我在本地編寫更新,然後讓用戶選擇「提交」更改並啓動數據庫文件副本。

除了回答我的問題,在這種情況下,任何一般的建議是歡迎...

+1

你知道https://www.sqlite.org/faq.html#q5? – 2012-09-12 14:10:34

+0

https://www.sqlite.org/faq.html#q5不覆蓋覆蓋SQLite數據庫或覆蓋時訪問策略。 – bristophocles

回答

1

Backup API允許覆蓋數據庫。

(我不知道,如果你的Java包裝公開這個API)。