私のアプリケーションを使用しているときに、このエラーを報告するユーザーがいます。
このアプリケーションは、SQL Server CE 3.5 sp1を使用し、ORMとしてLinq-To-SQLを使用するWindowsXPEmbeddedで実行される.NETWinformsアプリケーションです。データベース自体は、アプリケーションがMy Documents
フォルダー内に作成するサブディレクトリにあります。ユーザーアカウントは、システムの管理者アカウントです。データベースに接続している他のアプリケーションやプロセスはありません。
ほとんどの場合、アプリケーションは正常に実行されているようです。起動し、データベースからデータをロードしたり、データベースにデータを保存したりできます。ユーザーは、アプリケーションを使用してデータベースにアクセスしています。おそらく1日に数百回です。彼らはこのエラーを受け取りますが、断続的にしか起こりません。たぶん1日3〜4回。
コード自体では、データベースへのすべての呼び出しは、using
句にラップされたLinq-To-SQLデータコンテキストを使用しています。つまり、次のようになります。
using(MyDataContext db = new MyDataContext(ConnectionString))
{
List<blah> someList = db.SomeTable.Where(//selection criteria).ToList();
return(someList);
}
これは、データベースへのほとんどすべての呼び出しがどのように見えるかです(データを保存する呼び出しが明らかに何も選択して返さないことを除いて)。前に述べたように、99%の確率で問題は発生しませんが、共有メモリエラーが発生するのは1日に数回だけです。
私の現在の「修正」は、アプリケーションの起動時です。データベースからすべてのデータを読み取り(多くはありません)、メモリにキャッシュし、データベース呼び出しをメモリ内リストから読み取るように変換しました。これまでのところ、これで問題は解決したようです。1日半の間、彼らは問題を報告していません。しかし、そもそも何がエラーを引き起こすのかわからないので、これはまだ私を悩ませています。
アプリケーションが1日に数百回データベースにアクセスしている間は、通常、連続して起動することはありません。通常、少なくとも数分に1回です。ただし、可能な限り高速に2つの呼び出しが次々に発生する可能性があるユースケースが1つあります。言い換えれば、次のようなものです。
//user makes a selectio n on the screen
DatabaseCall1();
DatabaseCall2();
これらは両方とも、上記のコードブロックのパターンに従い、新しいコンテキストを作成し、作業を行ってから戻ります。ただし、これらの呼び出しは非同期ではないため、DatabaseCall2が呼び出される前に、接続が閉じられて破棄されると思います。ただし、SQL Server CE側の何かが、接続を十分な速度で閉じていない可能性がありますか?ほとんどの場合問題がないので、なぜ断続的であるのかを説明するかもしれません。また、修正なしのこの正確なプログラムは、まったく同じハードウェアとソフトウェアを備えた他のいくつかのシステムにインストールされており(それらは互いにクローンです)、他のシステムのユーザーはエラーを報告していません。
開発マシンまたはテストマシンでこのエラーを再現できないため、頭を悩ませています。この例外に関する質問への回答は、通常、不十分なユーザー権限または共有ネットワークフォルダー上のデータベースを中心に展開されます。