web-dev-qa-db-ja.com

セマフォ例外-指定されたカウントをセマフォに追加すると、最大数を超えます

私はしばらくの間、このSemaphoreFullExceptionを静かにしてきました。

要約すると、私はIIS 7.5でASP.NET v4.0フレームワークアプリケーションプール(統合)でアプリケーションをホストしました。Windows認証を使用して、ドメイン(isinrole)経由でユーザーを認証しています。

このトピックに関する他のすべてのスレッドを見てきましたが、Pooling = Falseに設定することをお勧めします。私はそれをしたくないので、パフォーマンス上の利点があるため、引き続きプーリングを使用したいと思います。

Entity Framework 6を​​使用してデータベースにクエリを実行していますが、ユーザーコードのどこにもdbcontextを「破棄」していません。問題はDbConnectionPoolコードにあるようです。

エラーはいつでもランダムに発生します。アプリケーションが使用されているかどうかは問題ではありません。場合によっては、この問題が原因で、再起動する必要がありますIIS新しいユーザーが認証されなくなるためです。

これまでに試したこと:

  • DBトランザクションオブジェクトが破棄されているか確認してください。
  • DBContext(ctx)が時期尚早に破棄されているかどうかを確認してください。
  • アプリケーションのビルドを確認します(32/62ビット)。この場合-私は任意のCPUモードでアプリケーションを構築し、私のサーバーは64ビットです。

注:私のアプリケーションでは、ほとんどの場合、linq-to-EFオブジェクトを使用してDBにクエリを実行しました。

Exception: System.Threading.SemaphoreFullException

Message: Adding the specified count to the semaphore would cause it to exceed its maximum count.

StackTrace:    at System.Threading.Semaphore.Release(Int32 releaseCount)
   at System.Data.ProviderBase.DbConnectionPool.CleanupCallback(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.TimerQueueTimer.CallCallback()
   at System.Threading.TimerQueueTimer.Fire()
   at System.Threading.TimerQueue.FireNextTimers()

この点でどんな助けでも大歓迎です。

19
Ali Haider

これが問題の解決策になると思います: http://www.davepaquette.com/archive/2013/03/27/managing-entity-framework-dbcontext-lifetime-in-asp-net- mvc.aspx -ご覧のとおり、DbContextの寿命が終わったときは、DbContextの破棄に注意する必要があります。

Db接続は管理されていないdb処理コードで終了するため、ガベージコレクションがメインメモリでスリープしているコンテキストを破棄しない限り、接続プールからの接続もブロックされることに問題があることに注意してください。遅かれ早かれ、適切な条件下で、接続プールを空にして例外を取得します。

5
flohack

私の場合、問題はデバッグ中にアプリケーションを停止したことでした。アプリケーションは多くの非同期呼び出しを行っていました。

したがって、私はIIS server:iisresetをコマンドプロンプトまたはPowerShellを介してリセットし、それが機能しました。

[〜#〜] edit [〜#〜]:@aaroncatlinコメントでIIS Express

11
Luis Teijon

私は同じ問題を抱えていましたが、接続を閉じる前に.Dispose();を実行していたため、次のように解決しました。

私は.Dispose();の2つのインスタンスを持っていました-1つはSqlDataAdapterにあり、もう1つは1つのSqlCommandにあり、その後接続を閉じてエラーを取得していました。 SqlCommandとSqlDataAdapterから.Dispose();を削除しただけで、エラーは発生しなくなりました!これが何とかお役に立てば幸いです。

1
JCO9