0

Ninject を使用して、リクエストごとに同じデータベース接続を使用しています。ルート内に別の Web アプリケーションである RosterProcess というルートがありますが、同じコード ベースを使用しているため、2 つの異なるアプリケーション プールを使用できます。このプロセス中にいくつかのスレッドをスローしているため、アプリケーション プールがスレッドの問題を引き起こしていると思います。InThreadScope は機能しますが、1 つだけを使用するのではなく、データベースで複数の接続を開きます。以下のエラーが表示されますが、その理由がわかりません。

Global.asax

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory<MySqlConnection>>().InRequestScope().WithConstructorArgument("connectionString", Config.Data.MySQLConnection);

工場

public class DatabaseFactory<T> : Disposable, IDatabaseFactory where T : IDbConnection, new()
    {
        private readonly string _connectionString;
        private  IDbConnection _dataConnection;

        public DatabaseFactory(string connectionString)
        {
            _connectionString = connectionString;
        }

        #region IDatabaseFactory Members

        public IDbConnection Get()
        {
            return _dataConnection ?? (_dataConnection = new T { ConnectionString = _connectionString });
        }

        #endregion

        protected override void DisposeCore()
        {
            if (_dataConnection != null)
                _dataConnection.Dispose();
        }
    }

オブジェクト参照がオブジェクト インスタンスに設定されていません。MySql.Data.MySqlClient.MySqlDataReader.Close() で MySql.Data.MySqlClient.MySqlConnection.Close() で MySql.Data.MySqlClient.MySqlConnection.Dispose(ブール値の破棄) で System.ComponentModel.Component.Dispose() で CL .NatGeo.Dashboard.Data.Infrastructure.DatabaseFactory 1.DisposeCore() at CL.NatGeo.Dashboard.Data.Infrastructure.Disposable.Dispose() at Ninject.Activation.Strategies.DisposableStrategy.<Deactivate>b__0(IDisposable x) at Ninject.Activation.InstanceReference.IfInstanceIs[T](Action1 アクション) at Ninject.Activation.Strategies.DisposableStrategy.Deactivate(IContext コンテキスト、InstanceReference 参照) at Ninject.Activation.Pipeline.<>c_ DisplayClass6.b _4(IActivationStrategy s) at Ninject .Infrastructure.Language.ExtensionsForIEnumerableOfT.Map[T](IEnumerable1 series, Action1 アクション) at Ninject.Activation.Pipeline.Deactivate(IContext コンテキスト、InstanceReference 参照) at Ninject.Activation.Caching.Cache.Forget(CacheEntry エントリ) at Ninject.Activation.Caching.Cache.Forget(IEnumerable 1 cacheEntries) at Ninject.Activation.Caching.Cache.Clear(Object scope) at Ninject.OnePerRequestModule.<>c__DisplayClass5.<DeactivateInstancesForCurrentHttpRequest>b__3(ICache cache) at Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map[T](IEnumerable1 シリーズ、Action`1アクション) で Ninject.OnePerRequestModule.DeactivateInstancesForCurrentHttpRequest() で Ninject.OnePerRequestModule.b__0(Object o, EventArgs e) で System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() で System.Web.HttpApplication. ExecuteStep(IExecutionStep ステップ、ブール値 & 完了した同期)

4

1 に答える 1

1

リクエスト中に生成されるスレッドの 1 つがデータベース接続を使用しようとしているように思えますが、その接続は Ninject (InRequestScope) のおかげで既に破棄されています。

私の提案は、アーキテクチャを再考することです。物事が特定の順序で起こることを期待しているという点で、高レベルの順次結合の罠に陥っています。しかし、スレッドのスポーンを開始するとすぐに、物事がどのような順序で行われているかを保証することはできません。なぜリクエストに時間がかかるので、スレッドをスポーンして処理することに決めたのでしょうか? それは改善できますか?複数のデータベース接続が発生することによるボトルネックは本当にありますか?

これは、InThreadScope バインディングを使用して結果が表示される理由も説明しています。Ninject は、生成したスレッドごとにデータベース ファクトリを保持しています。

于 2012-07-18T22:38:33.123 に答える