【问题标题】:Just started getting AIR SQLite Error 3182 Disk I/O error occurred刚开始收到 AIR SQLite 错误 3182 发生磁盘 I/O 错误
【发布时间】:2012-10-31 03:55:25
【问题描述】:

我们的软件有一个新的测试版,有一些变化,但不是围绕我们的数据库层。

我们刚刚开始在我们的服务器日志中报告错误 3128。似乎一旦发生,只要应用程序打开,它就会发生。代码中最明显的部分是我们通过 SQLite 每秒记录数据的地方。仅本月,我们的服务器就产生了 47k 错误。

3128     Disk I/O error occurred.   Indicates that an operation could not be completed because of a disk I/O error. This can happen if the runtime is attempting to delete a temporary file and another program (such as a virus protection application) is holding a lock on the file. This can also happen if the runtime is attempting to write data to a file and the data can't be written.  

我不知道是什么导致了这个错误。也许是防病毒程序?也许我们的应用程序变得混乱并在彼此之上写入数据?我们正在使用异步连接。

它引起了很多问题,我们不知所措。它发生在我们的旧版本中,但一个月可能发生 100 次,而不是 47,000 次。无论哪种方式,我都想让它发生“0”次。

【问题讨论】:

    标签: sqlite air


    【解决方案1】:

    可能的解决方案:Exception Message: Some kind of disk I/O error occurred

    总结:数据库可能没有问题,但在打开数据库后创建(或删除)临时文件时出现问题。 AIR 可能对数据库有权限,但不能在目录中创建或删除文件。

    对我有用的一个答案是使用 PRAGMA 语句将 journal_mode 值设置为 DELETE。为此,您可以像发出查询语句一样发出 PRAGMA 语句。

    PRAGMA journal_mode = OFF
    

    不幸的是,如果应用程序在事务处理过程中崩溃并设置了 OFF 日志模式,那么数据库文件很可能会损坏。1

    1http://www.sqlite.org/pragma.html#pragma_journal_mode

    【讨论】:

      【解决方案2】:

      解决方案是通过包装一个小包装器来确保数据库删除、更新、插入一次只发生一次。最重要的是,我们必须注意错误 3128 并重试。我认为这是因为我们运行了一个触发器,它可以在我们插入数据后锁定数据库。

      【讨论】:

      • 包装一个小包装是什么意思?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      相关资源
      最近更新 更多