我正在使用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](IEnumerable1 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)
答案 0 :(得分:1)
听起来像我在请求期间产生的一个线程试图使用数据库连接 - 但是由于Ninject(InRequestScope),该连接已被处理掉。
我的建议是重新考虑您的架构。你陷入了某种高级顺序凝聚力的陷阱,因为你期望事情以某种顺序发生;但是一旦你开始产生线程,你就永远无法保证发生了什么命令。请求花了这么长时间你决定产生一个线程来处理它?可以改善吗?是否存在超过1个数据库连接发生的瓶颈?
这也解释了为什么你使用InThreadScope绑定看到结果--Ninject为你产生的每个线程保留一个数据库工厂。