簡體   English   中英

如何在Java中同時使用SQLite? 哪個是最適合此目的的包裝紙?

[英]How to use SQLite concurrently in Java? Which is the best wrapper for that purpose?

首先,我知道SQLite可能不是最適合高並發需求的DBMS,但使用客戶端/服務器DBMS對我來說不是一個選擇,至少到現在為止。

我正在編寫的應用程序可能會從不同的線程生成大量的查詢和更新。 它們不會是真正繁重或復雜的更新,可能是小而快的大多數,但實際上是不可預測的並發,因為它們依賴於從網絡上的客戶端獲得的信息。 據我所知,SQLite目前能夠支持許多並發讀取,但一次只能更新。 當它寫入時,需要獲取一個獨占鎖,並返回一個異常是其他東西正在編寫。

為了解決這個問題,我想我應該排隊(並因此序列化)更新操作,並同時從thre DB讀取。 這對我來說應該足夠了。 但是我很無能,我真的不知道怎么做,因為我一直在使用Zentus JDBC驅動程序,這似乎不足以滿足我的目的。

這是我的問題,您認為我應該怎么做? 哪個是適當的包裝來實現這個?

提前致謝! :)

更新:

關於SQLite並發性,在他們的網頁中說:

(...)只要連接沒有持有任何fcntl()鎖,就可以安全地跨線程移動連接句柄。 如果沒有待處理的事務且所有語句都已完成,您可以放心地假設沒有鎖定。

和:

多個進程可以同時打開同一個數據庫。 多個進程可以同時執行SELECT。 但是,只有一個進程可以隨時對數據庫進行更改。

(......)

當SQLite嘗試訪問由另一個進程鎖定的文件時,默認行為是返回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();
        }
    }
}

只要每個進行更新的人都通過上述呼叫,那么它將同步每個呼叫。

synchronized()函數會做你想要的嗎? 我的意思是,你的多個線程會阻止等待數據庫訪問,但是如果你非常小心,應該做你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM