【问题标题】:Access SQLite from different processes从不同的进程访问 SQLite
【发布时间】:2010-08-18 00:55:40
【问题描述】:

我正在开发一个使用 SQLite 作为主要数据存储方法的应用程序。我有两个使用备用入口点为我的应用程序运行的进程。

我需要从两个不同的进程访问同一个数据库,但我们现在的 SQLite 不像服务器数据库引擎,它一次只能访问一次。

我想知道是否有一种方法可以在其他进程访问数据库时“锁定”数据库,这样如果第二个进程尝试同时访问数据库,它会等到第一个进程完成,然后尝试再次访问它。

如何处理这个问题?

【问题讨论】:

    标签: sqlite blackberry


    【解决方案1】:

    如果您还没有,请创建一个将您的数据库访问抽象出来的类并将其存储在 RuntimeStore 中。从您要与 SQLite 交互的任何地方,使用您存储它的 GUID (RuntimeStore.get(long)) 获取对该类的引用,并按照您通常的方式同步该类(成员对象锁定、同步方法)。

    不要只使用 Wikipedia 风格的单例模式,因为它不是该平台上跨进程的真正单例。

    见:

    http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/system/RuntimeStore.html

    示例:

    class SQLManager {
        private static long GUID = 0xa178d3ce564cae69L; // hash of com.stackoverflow.SQLManager
    
        private SQLManager() {
            // ctor stuff here
        }
    
        public static SQLManager getInstance() {
            RuntimeStore rs = RuntimeStore.getRuntimeStore();
    
            SQLManager instance = rs.get(GUID);
    
            if (instance == null) {
                instance = new SQLManager();
                rs.put(GUID, instance);
            }
    
            return instance;
        }
    }
    

    您仍在使用单例“模式”本身,但您在第一次调用 getInstance 时将对象实例存储在 RuntimeStore 中,然后使用您指定的 GUID 将其从 RuntimeStore 中提取出来。

    【讨论】:

    • 谢谢 Doug!,我刚刚在 Wiki 上阅读了关于单身人士的文章,对我来说是一个新术语,但我想我现在不理解它了。为什么这在黑莓上不起作用?这个特性在 Java ME 中不可用吗?我现在将阅读有关 RuntimeStore 的内容,因为我不熟悉它。如果您有一些代码示例,我将不胜感激,但我仍会阅读有关运行时商店的信息,非常感谢!
    • 顺便问一下,你用过@Blackberry 的SQLITE_BUSY 标志吗?我不确定这是否可以解决。这是一个例子stackoverflow.com/questions/2775595/sqlite-multi-process-access
    • 嘿,Doug,我阅读了有关 RuntimeStore 的信息,但在这种情况下不太清楚我应该在 RuntimeStore 中包装的对象。我创建了一个名为 SQLManager 的类来处理所有 DB 事件(打开、插入、更新、创建等),我应该包装这个对象吗?我想我不理解 RuntimeStore 的概念,但在这种情况下的实现并不是很清楚。 =/ ,任何帮助将不胜感激。提前致谢
    • 我不了解整个 Java ME(快速搜索没有发现任何问题),但是对于 BlackBerry,单例实例仅在调用 getInstance 的进程范围内是唯一的,所以你最终会得到多个单身人士:) 抱歉,我没有使用 SQLITE_BUSY 标志。从它的声音来看,是的,您会将 SQLManager 放在 RuntimeStore 中。我将使用代码示例编辑我的答案。
    • 它只是通过在 RuntimeStore 中存储一个布尔标志来指示 DB 文件是否正在使用,谢谢 Doug!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多