2012-09-12 51 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)。