我将上述框架用于负载很重的Web应用程序。
但是,在进行SoapUI
负载测试时,我在执行简单的数据库操作(例如通过用户名获取用户)时发现了几种类型的错误,例如:
ExecuteReader需要一个开放且可用的连接。连接的当前状态已关闭。
我的配置如下:
DataAccessRegistry.cs:
For<ISessionFactory>().Singleton().Use(_ => ConfigureSessionFactory());
For<ISession>()
.LifecycleIs(new UniquePerRequestLifecycle()) // one session per request pattern
.Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession());
ControllerConvention.cs:
public void ScanTypes(TypeSet types, Registry registry)
{
foreach (var type in types.FindTypes(TypeClassification.Concretes).Where(type => type.CanBeCastTo<Controller>()))
{
registry.For(type).LifecycleIs(new UniquePerRequestLifecycle());
};
}
StructureMapScopeModule.cs:
public void Init(HttpApplication context) {
context.BeginRequest += (sender, e) =>
{
StructuremapMvc.StructureMapDependencyScope.CreateNestedContainer();
};
context.EndRequest += (sender, e) => {
var session = StructuremapMvc.StructureMapDependencyScope.CurrentNestedContainer.GetInstance<ISession>();
if (session.IsOpen) {
session.Flush(); // RLE: make sure everything is flushed to the DB before the HTTP request/context finishes as otherwise all writes seem to be lost
session.Close();
session.Dispose();
}
HttpContextLifecycle.DisposeAndClearAll();
StructuremapMvc.StructureMapDependencyScope.DisposeNestedContainer();
};
}
添加其他日志记录时,我注意到structmap将相同的Session注入多个控制器和请求: http://pastebin.com/mU7u67nP
因此,由于一个请求在另一个请求尝试使用之前关闭会话,整个事情就会分崩离析。
我已尝试过所有可能的不同生命周期,例如AlwaysUnique
,Transient
等,但它无法正常工作。
我是否错误地配置StructureMap
或者还有其他什么?