覆盖共享网络文件夹上的SQLite数据库

时间:2012-09-12 14:08:46

标签: java sqlite

我在共享文件夹上有一个SQLite3数据库。我想从Java应用程序覆盖db文件。虽然此文件的读写流量很低,但我想确保a)覆盖不会破坏db文件,b)任何可能正在寻找访问db文件的人在覆盖之前都会看到它被锁定完成了。我目前的计划看起来像这样......

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驱动程序假设db不存在。正确?

我的问题是......对数据库设置锁定是否有点没用?是否有更好的策略或方法使数据库看起来锁定而不是丢失?另外,我是否在DB腐败中冒了很大的风险,这使得这个不可行?我曾经有过另一种想法,就是锁定db文件,将新文件写入另一个名称,然后在写完成后重命名,然后释放锁...对此有什么想法?

不确定是否覆盖数据库文件是一个绝妙的主意,但我能想到的唯一可行的事情是我拥有的资源(通过网络在共享文件夹中的数据库上运行巨大的事务是非常慢的。我知道我在共享文件夹上使用SQLite数据库运行更高的腐败风险。我在本地编写更新,然后让用户选择“提交”更改并启动db文件副本。

除了回答我的问题之外,欢迎任何有关此案例的一般性建议......

1 个答案:

答案 0 :(得分:1)

Backup API允许您覆盖数据库。

(我不知道你的Java包装器是否公开了这个API。)