Background

我每天在某个特定时间从服务中更新数据库,而该数据库正在更新中,并且用户尝试打开我要保留的应用程序,并且不显示正在发生的事情,尽管我的服务是实施的典型Cron作业在后台。要做到这一点怎么办?我也想在数据库上获得一个锁,这样记录就不会弄乱了。在这方面,我们将不胜感激。

最佳答案

这是使用ReentrantReadWriteLock锁定数据库的方法。

// Create the lock object
private ReentrantReadWriteLock lockSqliteDB = new ReentrantReadWriteLock();

// Called to update the database
public void updateDatabase() {
    try {
        lockSqliteDB.writeLock().lock();

        // Read and update the database here

    } finally {
        sqliteDB.close();
        lockSqliteDB.writeLock().unlock();
    }
}

// Called to read from the database
public void readDatabase() {
    try {
        lockSqliteDB.readLock().lock();

        // Read from the database here

    } finally {
        sqliteDB.close();
        lockSqliteDB.readLock().unlock();
    }
}


请注意,多个线程将能够与读取锁同时从数据库读取。但是,可以使用写锁将单个线程写入数据库,在此期间其他线程将无法读取或写入。

10-04 23:10
查看更多