Ninject,数据库连接和相同网站的单独应用程序池

时间:2012-07-18 21:47:14

标签: asp.net-mvc-3 iis database-connection ninject dispose

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

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()at   MySql.Data.MySqlClient.MySqlConnection.Close()at   MySql.Data.MySqlClient.MySqlConnection.Dispose(布尔处理)at   System.ComponentModel.Component.Dispose()at   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](Action 1   行动)   Ninject.Activation.Strategies.DisposableStrategy.Deactivate(IContext   context,InstanceReference reference)at   Ninject.Activation.Pipeline&LT;&GT; C_ DisplayClass6.b _4(IActivationStrategy   s)at   Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map [T](IEnumerable 1 series, Action 1 action)at at   Ninject.Activation.Pipeline.Deactivate(IContext context,   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](IEnumerable 1   系列,Action`1动作)at   Ninject.OnePerRequestModule.DeactivateInstancesForCurrentHttpRequest()   在Ninject.OnePerRequestModule.b__0(Object o,EventArgs e)at   System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,   布尔和放大器; completedSynchronously)

1 个答案:

答案 0 :(得分:1)

听起来像我在请求期间产生的一个线程试图使用数据库连接 - 但是由于Ninject(InRequestScope),该连接已被处理掉。

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

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