0

我使用 Ninject 为每个请求使用相同的数据库连接。我们有一个名为 RosterProcess 的路由,它是根内部的另一个 Web 应用程序,但使用相同的代码库,因此我们可以拥有两个不同的应用程序池。我相信应用程序池会导致线程问题,因为我们在此过程中抛出了一些线程。InThreadScope 可以工作,但这会在数据库中打开多个连接,而不是只使用一个。我收到以下错误,不知道为什么?

全球.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(Boolean disposing) 在 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 action) 在 Ninject.Activation.Strategies.DisposableStrategy.Deactivate(IContext context, InstanceReference reference) 在 Ninject.Activation.Pipeline.<>c_ DisplayClass6.b _4(IActivationStrategy s) 在 Ninject .Infrastructure.Language.ExtensionsForIEnumerableOfT.Map[T](IEnumerable1 series, Action1 个动作)在 Ninject.Activation.Pipeline.Deactivate(IContext 上下文,InstanceReference 参考)在 Ninject.Activation.Caching.Cache.Forget(CacheEntry 条目)在 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() 在 System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.IExecutionStep.Execute() 在 Ninject.OnePerRequestModule.b__0(Object o, EventArgs e) 在 System.Web.HttpApplication。 ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

4

1 回答 1

1

在我看来,您在请求期间产生的一个线程正在尝试使用数据库连接 - 但是由于 Ninject (InRequestScope),该连接已经被处理掉了。

我的建议是重新考虑你的架构。你掉进了一些高级顺序凝聚的陷阱,因为你期望事情以某种顺序发生;但是一旦你开始产生线程,你将永远无法保证事情发生的顺序。是什么让请求花费这么长时间,你决定产生一个线程来处理它?可以改进吗?发生超过 1 个数据库连接真的存在瓶颈吗?

这也解释了为什么您使用 InThreadScope 绑定看到结果 - Ninject 为您生成的每个线程保留一个数据库工厂。

于 2012-07-18T22:38:33.123 回答