SQLite中的多线程数据写入[重复]

Posted

技术标签:

【中文标题】SQLite中的多线程数据写入[重复]【英文标题】:Multithreading data writing in SQLite [duplicate] 【发布时间】:2013-12-24 16:27:46 【问题描述】:

当我尝试使用我的 SQLite 数据库建立多线程工作时,我有点困惑,所以我有一个服务可以定期从服务器加载数据并将其插入不同的数据库表中,任何用户也可以随时存储在应用程序窗口中按下“保存按钮”时他自己的数据在数据库中,因此基于一次只有一个线程可以在数据库中写入数据的规则,我想进行线程合作。起初我创建了一个只有一个数据库实例的单例,我的 read-db 方法一切都很好,因为所有线程都可以同时读取数据,但是写入呢?我在 write-function 中使用了一个线程,并且在前一个线程完成工作之前不要再启动另一个线程。(当用户按下保存按钮时,我也会为来自 ui 线程的调用执行此操作)

问题:我想做的只是考虑两种情况 - 首先是当线程调用相同的函数来写入数据然后我使用同步,第二 - 当线程调用不同的写入函数时我应该使用锁, 正确的?所以现在我做出了决定,但这样做是否正确和正确?

代码(更新):

// Sync method for processing 1st situation
public synchronized void addPoints(final ArrayList<Point> points, final OnDBOperationListener listener) 
    if (listener != null) 
        // Lock for others write-threads in 2nd situaton
        synchronized (mWriteLock) 
            while (mWriteWait) 
                try 
                    mWriteLock.wait();
                 catch (InterruptedException e) 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                
            
            mWriteWait = true;

                    try 
                        SQLiteDatabase db = getDatabase();
                        // write a data

                        listener.onSuccess();
                     catch (Exception e) 
                        e.printStackTrace();
                        listener.onError();
                     finally 
                        closeDatabase();
                        synchronized (mWriteLock) 
                            mWriteWait = false;
                            mWriteLock.notifyAll();
                        
                    

        

    

【问题讨论】:

每个连接应该在自己的线程上创建并且共享。如果这样做了,那么线程可以同时使用 SQLite。事务可以(并且应该)用于控制数据库操作的原子性 - 事务将负责数据库级别的所有必需锁定。话虽如此,如果可以减少或限制线程的数量,那么问题一开始就被简化了。 (此外,由于锁模型,SQLite 对多写入器的支持很差。) @user2864740 你的意思是你应该使用事务而不是db.insert吗?他们关心多重写作,对吧? 不是“代替”。需要查看正在完成的实际操作,以便所有数据库工作都以原子方式完成 - 这可以通过使用事务来完成。但在这种特殊情况下,创建一个新线程似乎非常复杂且没有必要。 @user2864740 好的,我同意这个函数中的一个线程是多余的,我刚刚读了这个sqlite.org/threadsafe.html,似乎sqllite 可以与许多线程一起工作,结果我可以同时从任何线程写入数据 这是我编写/使用的一个包装器,它使在 android 环境中使用 SQLite 变得稍微容易一些 - SqlDb for Android 【参考方案1】:

经过长时间的搜索,我终于为我的问题找到了一个很好的答案,所以任何想要创建对 db 的多线程访问的人都应该先阅读这个What are the best practices for SQLite on Android?

【讨论】:

以上是关于SQLite中的多线程数据写入[重复]的主要内容,如果未能解决你的问题,请参考以下文章

对 C# 循环中的多线程感到困惑 [重复]

我的多线程————读取百万条Excel数据,写入到数据库

Python中的多线程并行运行

关于 iPhone 上的多线程

现代 CPU 中的多线程旧遗留应用程序 [关闭]

关于女神SQLite的疑惑