C# NHibernate无状态会话游标泄漏
我有一个带有threadstatic会话的多线程应用程序,它可以处理文件。它使用NH从服务中消费,并在oracle数据库上运行,到目前为止还不错 每个线程都有一个详细的日志,它使用无状态会话来实现更轻量级。顺便说一句,当处理一些文件时,我可以看到很多游标在oracle中进行日志会话管理 例如,日志:C# NHibernate无状态会话游标泄漏,c#,oracle,nhibernate,cursor,C#,Oracle,Nhibernate,Cursor,我有一个带有threadstatic会话的多线程应用程序,它可以处理文件。它使用NH从服务中消费,并在oracle数据库上运行,到目前为止还不错 每个线程都有一个详细的日志,它使用无状态会话来实现更轻量级。顺便说一句,当处理一些文件时,我可以看到很多游标在oracle中进行日志会话管理 例如,日志: 324 SPC_日志 310 SPC_日志 121程控测井 以及应用程序本身: 31 SPC\u生产线\u测试 27 SPC\u生产线\u测试 21 SPC\u生产线\u测试 这让我耗尽了O
- 324 SPC_日志
- 310 SPC_日志
- 121程控测井
- 31 SPC\u生产线\u测试
- 27 SPC\u生产线\u测试
- 21 SPC\u生产线\u测试
- 会话工厂
public IStatelessSession GetUserStatelessContext(ConnectionStringSettings connection) { lock (Padlock) { string key = GetConnectionKey(connection); if (StatelessSessions == null) { StatelessSessions = new Dictionary<string, IStatelessSession>(); } if (!StatelessSessions.ContainsKey(key)) { StatelessSessions.Add(key, Factories[connection.ConnectionString].OpenStatelessSession()); } return StatelessSessions[key]; } }
现在数据库性能已经提高了400%,并且根本没有游标泄漏。因此,从我的观点来看,永远不要使用MS客户端。对于记录,问题的原因是使用MS Oracle客户端(System.Data.OracleClient)而不是Oracle数据提供程序(Oracle.DataAccess)。在fluent中很容易混淆,因为第一个是OracleClientConfiguration和ODP.Net OracleDataClientConfiguration,因为我们知道MS客户端已中断
现在数据库性能已经提高了400%,并且根本没有游标泄漏。因此,在我看来,永远不要使用MS客户端。猜测:尝试使用ConcurrentDictionary和TryGetValue而不是Dictionary@据我所知,JamieIDE与并发列表无关,我使用锁来避免并发问题。与Oracle驱动程序、数据库或NH行为有关。猜测:尝试使用ConcurrentDictionary和TryGetValue而不是Dictionary@据我所知,JamieIDE与并发列表无关,我使用锁来避免并发问题。更多的是与Oracle驱动程序、数据库或NH行为相关的内容。
using (ITransaction tx = this.LogProcessErrorRepository.BeginTransaction())
{
this.LogProcessErrorRepository.Add(log);
if (log.Informations != null)
{
foreach (AdditionalInformation info in log.Informations)
{
info.Text = this.OracleCLOBHack(info.Text);
this.AdditionalInformationRepository.Add(info);
}
}
tx.Commit();
}