java - 如何在Java中并发使用SQLite?哪个是为此目的最好的 wrapper ?

标签 java sqlite concurrency

首先,我知道 SQLite 可能不是满足高并发需求的最合适的 DBMS,但是使用客户端/服务器 DBMS 对我来说不是一个选择,至少现在是这样。

我正在编写的应用程序可能会从不同线程生成大量查询和更新。它们不会是真正繁重或复杂的更新,它们中的大多数可能是小而快的,但实际上是不可预测的并发,因为它们依赖于来自网络上客户端的信息。据我所知,SQLite 目前能够支持很多并发读取,但一次只能支持一个更新。当它写入时,需要获取独占锁,并返回异常是其他正在写入。

为了解决这个问题,我认为我应该将更新操作排队(并因此序列化),并同时从 thre DB 读取。这对我来说应该足够了。但是我很无能,我真的不知道该怎么做,因为我一直在使用 Zentus JDBC 驱动程序,这似乎不足以满足我的要求。

这是我的问题,你认为我应该怎么做?哪个包装器适合实现此目的?

提前致谢! :)

更新:

关于 SQLite 并发,在他们的网页上说:

(...) it is safe to move a connection handle across threads as long as the connection is not holding any fcntl() locks. You can safely assume that no locks are being held if no transaction is pending and all statements have been finalized.

和:

Multiple processes can have the same database open at the same time. Multiple processes can be doing a SELECT at the same time. But only one process can be making changes to the database at any moment in time, however.

(...)

When SQLite tries to access a file that is locked by another process, the default behavior is to return SQLITE_BUSY.

希望这有帮助:)。

最佳答案

这取决于您在数据库设计中采用的方法类型,但基本上可以归结为按照 Femi 的建议进行操作,将每个调用汇集到一个同步(或锁定)方法中。

public class DatabaseUpdater
{
    private static final Lock lock = new ReentrantLock();

    public static void doUpdate(DatabaseObject db) throws SQLException
    {
        lock.lock();

        try
        {
            db.doWork();
        }
        finally
        {
            lock.unlock();
        }
    }
}

只要每个做更新的都经过上面的调用,那么每次调用都会同步。

关于java - 如何在Java中并发使用SQLite?哪个是为此目的最好的 wrapper ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5798439/

相关文章:

JavaFX 使用自定义列表单元

java - 如何从这些分析器结果中得出结论

sql - 在SQL中,如何使用LIKE匹配最多(但不超过)个通配符?

android 和 sqlite-有 5 列,但提供了 4 个值

java - 迭代 ConcurrentHashMap 值线程安全吗?

java - 如何使用 EJB 3.0 实现适当的计数器 bean?

java - JPA 延迟获取不起作用并抛出 LazyInitializationException

android - 带有外键的sqlite选择查询另一个表

java - 如何从后台线程安全地更新 JavaFX 应用程序的 GUI?

java - 切换到另一个 Activity 时出错,无法找到显式 Activity 类,您是否在 AndroidManifest 中声明了此 Activity