2012-01-20 21 views
5

私が働いているプログラムは、Webサービスからデータを取得し、データベースにデータを追加し、削除して更新します。 しかし、時々私は私のアプリケーションを実行すると、すべてのアクションは成功しますが、時には私が追加、削除、またはデータを更新したいときにこのエラーが出ます。データベースファイルがロックされています

サーバーが要求を処理できませんでした。 --->データベースファイルが データベースは

をロックされているロックされている私はいくつかの時点で同じプログラムを理解カント正常に動作しますが、いくつかの時点で非常にプログラムがこのメッセージを表示します。

+0

どのデータベースエンジンを使用していますか?データベースログをチェックしましたか? –

+0

どのデータベースに接続していますか? MS Access .mdbファイルまたはSQL Server?接続文字列も表示できますか? –

+0

どのデータベースを使用しているのか、どのようにデータベースにアクセスしているのかについて詳しく説明する必要があります。 –

答えて

5

SqlLiteでは、2つのスレッドが同時にデータベースを使用することはできません。

これを解決する最も簡単な方法は、すべてのデータベース呼び出しについてlockステートメントを使用することです。

+1

しかし、問題は私のウェブサイトに4つのデータベースがあるということです。他のすべてのアプリはうまくいきますが、このアプリだけがウェブサービスと連携していません。動作しないということは時々動作し、同じアプリが私が言及したようにエラーを出すことを意味します。 –

+0

あなたの他のサイトを読み込もうとしましたか?彼らは遅かれ早かれ問題に遭遇します。おそらく、Webサービスで同じHTTPリクエストに対して複数のdb接続を使用しようとしていますか? – jgauffin

3

Accessのようなファイルベースのデータベースを使用していますか?

データベースファイルは常に(ほぼすべてのデータベースシステムで)ロックされています。データベースサービスを停止してファイルをロック解除してみてください。

+0

sqLiteデータベースファイルを使用しています。 Webサービスがどのようにできるのかは、ファイルのロックを解除することを意味しますか? –

4

SysInternalsという優れたパッケージがあります。内部のコンポーネントの1つがProcess Monitor(procmon)です。それを使用して、データベースファイルをロックしているアプリケーションと、アプリケーションの2つのインスタンスがDBファイルをロックすることについて「戦っている」かどうかを確認します。

Sqliteでは、複数のプロセスがDBファイルから読み込むことができますが、特定の時間に変更(INSERT/UPDATE/DELETE)を行うことはできません。複数のプロセスが同じ時間にDBを変更しようとすると、このエラーが発生します。 Mutexを使用して、DBにアクセスするプロセス間で同期をとることができます。

ここでは、複数のスレッドからデータベースを使用しないようにすることを推奨しています。同時に1つのスレッドだけがDBにアクセスするようにするには、データベースとのすべてのやりとりを行う静的クラスを作成し、このクラス内のロック文を使用して複数のスレッドから同時にDBにアクセスしないようにできます。

関連する問題