我使用Spring.NET AOP与NHibernate进行事务和会话管理。当用户提出的请求太快时 - 延迟加载失败,例外情况是“没有会话或会话关闭”。
我在NHibernate配置中使用SpringSessionContext作为CurrentSessionContext
public class FluentSessionFactory : LocalSessionFactoryObject
{
protected override ISessionFactory NewSessionFactory(Configuration config)
{
var conf = Fluently
.Configure()
.Database(
MsSqlConfiguration
.MsSql2008
.ConnectionString(c => c.FromConnectionStringWithKey("MyConnection"))
// TODO: use ExposeConfiguration method
.CurrentSessionContext<SpringSessionContext>()
)
.Mappings(
m => m.FluentMappings
.AddFromAssembly(this.GetType().Assembly)
)
.BuildSessionFactory();
return conf;
}
}
在xml配置中:
<object id="SessionFactory" type="IndustryTracker.NHibernateRepository.FluentSessionFactory, IndustryTracker.NHibernateRepository">
<property name="DbProvider" ref="DbProvider" />
</object>
和OpenSessionInView模块
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate31"/>
</modules>
</system.webServer>
Application实现了从db获取实体的下一个工作流:View - &gt;控制器 - &gt;经理 - &gt;存储库和其他方面相同。因此,每个请求创建会话,事务 - 每次调用经理。
<object id="TransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate31">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref="SessionFactory"/>
</object>
<tx:advice id="TxAdvice" transaction-manager="TransactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<object id="Pointcut" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
<property name="patterns">
<list>
<value>MyAppication.Managers.AccountManager</value>
<value>MyAppication.Managers.CompanyManager</value>
</list>
</property>
</object>
<aop:config>
<aop:advisor advice-ref="TxAdvice" pointcut-ref="Pointcut"/>
</aop:config>
此类行为的可能原因是什么?如何解决此问题(Not.LazyLoad()和NHibernateUtil.Initialize()在我的上下文中是不可接受的变体)?
答案 0 :(得分:1)
1。会话工厂已配置为OpenSessionInViewModule
?
您可能忘记为OpenSessionInViewModule
配置会话工厂:
<appSettings>
<add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName"
value="SessionFactory"/>
</appSettings>
这必须在应用设置中完成。
2。正确的FluentNHibernate春季会议工厂?
您似乎在代码中配置会话工厂。您是否尝试过配置session factory like described in the docs和BennyM 's blog?您的NewSessionFactory
方法直接从Fluent NHibernate返回会话工厂,绕过所有spring.net支持。
3。您的会话工厂事务是否可识别?
<object id="SessionFactory"
type="IndustryTracker.NHibernateRepository.FluentSessionFactory, IndustryTracker.NHibernateRepository">
<property name="DbProvider" ref="DbProvider" />
<!-- provides integation with Spring's declarative transaction management features -->
<property name="ExposeTransactionAwareSessionFactory" value="true" />
</object>
4。您的控制器是否具有scope="application"
或没有范围定义的依赖项?
我可能在这里看错了方向。如果您的控制器具有application
范围的依赖关系,则意味着快速请求可能会产生干扰。默认值为"scope="application"
;所以你想要检查没有范围定义的协作者。请参阅web scopes上的文档。
答案 1 :(得分:1)
经过一番搜索,我发现问题在于配置。在配置中有春天的WebSupportModule缺少http模块,所以正确的是:
<httpModules>
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate31"/>
</httpModules>
所以Marijn是正确的 - 弹簧布线很弱。