5

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

我们刚刚开始在我们的服务器日志中报告错误 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”次。

4

2 回答 2

0

可能的解决方案:异常消息:发生某种磁盘 I/O 错误

摘要:数据库可能没有问题,但是一旦打开数据库,创建(或删除)临时文件就会出现问题。AIR 可能对数据库具有权限,但不能在目录中创建或删除文件。

对我有用的一个答案是使用该PRAGMA语句将journal_mode值设置为DELETE. 您可以通过PRAGMA以与发出查询语句相同的方式发出语句来执行此操作。

PRAGMA journal_mode = OFF

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

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

于 2013-04-08T11:27:03.223 回答
0

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

于 2013-04-08T19:09:40.193 回答