5

ソフトウェアの新しいベータ版にいくつかの変更が加えられていますが、データベースレイヤーにはありません。

サーバーログでエラー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.  

このエラーの原因がわかりません。多分アンチウイルスプログラム?たぶん、私たちのアプリは混乱していて、お互いの上にデータを書き込んでいますか?非同期接続を使用しています。

それは多くの問題を引き起こしていて、私たちは途方に暮れています。以前のバージョンで発生しましたが、月に47,000回ではなく100回になる可能性があります。いずれにせよ、それを「0」回実現させたいと思います。

4

2 に答える 2

0

考えられる解決策:例外メッセージ:ある種のディスクI/Oエラーが発生しました

概要:データベースにはおそらく問題はありませんが、データベースを開いた後の一時ファイルの作成(または削除)に問題があります。AIRにはデータベースへのアクセス許可がありますが、ディレクトリ内のファイルを作成または削除することはできません。

私にとってうまくいった答えの1つは、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

解決策は、小さなラッパーをラップすることにより、データベースの削除、更新、挿入が一度に1つだけ行われるようにすることでした。その上、エラー3128を監視して、再試行する必要がありました。これは、データを挿入した後にデータベースをロックする可能性のあるトリガーが実行されているためだと思います。

于 2013-04-08T19:09:40.193 に答える