【问题标题】:Sqlite thread modes and sqlite misuse paradoxSqlite 线程模式和 sqlite 误用悖论
【发布时间】:2012-02-26 16:01:01
【问题描述】:

我有一个项目,我应该使用多个表来避免在我的 sqlite 文件中保留重复的数据(即使我知道使用多个表是一场噩梦)。

在我的应用程序中,我正在以某种方法从一个表中读取数据,并以某种其他方法将数据插入到另一个表中。当我这样做时,我从 sqlite 步进函数中得到错误代码 21,这是 sqlite 滥用。

根据我的研究,这是因为我无法从多线程访问表。

到目前为止,我阅读了 sqlite 网站,了解到配置 sqlite 数据库有 3 种模式:

1) 单线程:你没有机会调用多个线程。
2)多线程:是的多线程;但有一些障碍。
3) 序列化:这是与多线程数据库应用的最佳匹配。

如果sqlite3_threadsafe() == 2 返回 true,那么是的,您的 sqlite 数据库已序列化并且返回 true,所以我为自己证明了这一点。

然后我有一个代码来配置我的 sqlite 数据库以进行序列化以保证它。

sqlite3_config(SQLITE_CONFIG_SERIALIZED);

当我在类中使用上述代码时,我从 1 个表中读取和插入数据时效果很好:)。但是如果我尝试在课堂上使用它,我从 2 个表中读取和插入数据(实际上是我真正需要它的地方),就会出现 sqlite 滥用问题。

我检查了我打开和关闭数据库的代码,它们没有问题。除非我删除另一个,否则它们会起作用。

我正在使用 ios5,这对我的项目来说确实是一个大问题。我听说instagram 使用postgresql 可能是这个原因哈?一开始你会建议 postgresql 还是 sqlite?

【问题讨论】:

    标签: multithreading sqlite misuse


    【解决方案1】:

    在我看来,你把两件事搞混了。

    单线程与多线程

    单线程构建只能在代码的一个线程中安全使用,因为它们在内部缺少允许多个线程安全使用的机制(互斥体、临界区等)。如果您使用多线程,请使用多线程构建(或期待“有趣”的麻烦;您已被警告)。

    SQLite 的线程支持非常简单。在多线程构建中,特定的连接只能在单个线程中使用(除非它们最初可以在另一个线程中打开)。

    所有最近(过去几年?)的 SQLite 构建都对从多个进程访问单个数据库感到满意,但并行度取决于……

    交易类型

    SQL 通常支持多种类型的事务。 SQLite 只支持其中的一个子集,并且它的默认值是 SERIALIZABLE。这是最安全的访问方式;它模拟了如果一次只能发生一件事,您会看到什么。 (在内部,它是使用一种方案实现的,该方案允许许多读者同时进入,但只有一个作者;有一些巧妙的方法可以防止任何人挨饿。)

    SQLite 还支持读取未提交的事务。这增加了可用于代码的并行性数量,但存在读者看到尚未保证持续存在的信息的风险。这对您是否重要取决于您的应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 2017-06-16
      相关资源
      最近更新 更多