4

例に従って、Usingステートメントを使用してインスタンスを開き、セッションを作成し、データベースに接続して開き、トランザクションを開いてレコードを保存するなどの操作を実行してみました。しかし、このパターンを各操作に使用すると。保存などの各操作には約0.5秒かかります。だから私はこれを間違っていると思います。しかし、私はこれをどのように行うべきかわかりません。

インスタンスは1つだけにする必要がありますか?名前が違う場合はもっと欲しいですか?

複数のスレッドがある場合、もっと多く持つことができますか?

複数のセッションを同時に開くことができるようですが、それは問題ないと思いますが、すべてのセッションをアタッチする必要がありますか?セッションごとにデータベースを開く必要がありますか?これらのさまざまなシナリオをテストすると、一貫性のない結果が得られます。テストに合格することもあれば、破棄されたオブジェクトを使用しようとしたり、EsentTempPathInUseExceptionなどの例外が発生したりすることもあります。

それで、これをどのように使用すべきかについてのガイダンスはありますか?

4

1 に答える 1

9

私はこれらの答えを他の場所で、または試行錯誤によって見つけましたが、ここでそれらを見る人にとっては...

インスタンスを 1 つだけ持つ必要があります。インスタンスの作成には非常にコストがかかります。実際にはデータベースを作成しています。予期しないシャットダウンから自己回復するため、必要に応じてこれらのルーチンを実行できます。別の名前を付けた場合、複数のインスタンスを開くことはできません。最初のインスタンスとは異なる2番目のインスタンスが作成されます。重複するとエラーになります。

マルチスレッドで問題ありません。データベースを 1 回開きます。セッションを一度アタッチします。セッションはスレッドをまたがってはなりません。それぞれがデータベースにアクセスする独自のセッションを持つ複数のスレッドを持つことができます。管理されたセント オブジェクトを必ず破棄してください。SO 例に従って「Using」ステートメントを使用するか、オブジェクトがそれらを破棄するようにしてください。

EsentTempPathInUseException は、現在のインスタンスがまだ使用されているときに 2 番目のインスタンスを開こうとしてスローされます。

破棄されたオブジェクトの例外が発生したのは、Managed Esent オブジェクトの作成と破棄を重複してはならないときにオーバーラップさせていたためです。

于 2012-09-25T21:49:55.813 に答える