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

标签 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 ,看起来这个锁会存在于日志中,并在我运行回滚事务时在复制后更新。同时,如果客户端在我复制时尝试访问数据库,我想他们不会找到该文件,并且我的 SQLite 驱动程序会假设该数据库不存在。对吗?

我的问题是...在数据库上加锁是否有实际意义?是否有更好的策略或方法使数据库显示为锁定而不是丢失?另外,我是否面临数据库损坏的巨大风险,这使得这不可行?我的另一个想法是锁定数据库文件,将新文件写入不同的名称,然后在写入完成后重命名,然后释放锁定......对此有什么想法吗?

不确定覆盖数据库文件是否是一个绝妙的主意,但对于我所拥有的资源,我能想到的唯一可行的事情是(在网络共享文件夹中的数据库上运行大量事务的速度慢得令人无法接受)。我知道我在共享文件夹上使用 SQLite 数据库会面临更高的损坏风险。我在本地编写更新,然后让用户选择“提交”更改并启动数据库文件复制。

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

最佳答案

Backup API允许您覆盖数据库。

(我不知道您的 Java 包装器是否公开了此 API。)

关于java - 覆盖共享网络文件夹上的 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12390087/

相关文章:

java - 对象上的 sphere.io 自定义字段

android - 如何获取 callLog.calls 中最频繁的值条目的数量?

Sqlite 对一列的全文搜索

java - Android 应用程序开发中的 SQLite 数据库行为

ios - 在 NSString 中写入 %

java - 哪里可以下载openjdk10源码包(openjdk-10*_src.tar.gz....)?

java - 如何使用 Jackson 和默认类型对 EnumMap 进行(反)序列化?

java - 从光标覆盖或更新 Android 播放列表数据库

java - IntelliJ IDEA 中标有编译器错误的代码在 Eclipse 中运行良好

java - 定义多色渐变