NHibernate无状态会话游标泄漏

时间:2012-11-18 12:19:02

标签: c# oracle nhibernate cursor

我有一个带线程静态会话的多线程应用程序,它可以处理文件。它使用NH来从服务中消耗并在oracle db上运行,到目前为止一直很好。

每个线程都有一个详细日志,使用无状态会话更轻量级。顺便说一句,当处理一些文件时,我可以看到在oracle中管理了很多游标用于日志会话。

例如log:

  • 324 SPC_LOG
  • 310 SPC_LOG
  • 121 SPC_LOG

和申请本身:

  • 31 SPC_PRODUCTION_LINE_TEST
  • 27 SPC_PRODUCTION_LINE_TEST
  • 21 SPC_PRODUCTION_LINE_TEST

这让我用完了Oracle游标ORA-01000。

有人知道可能导致这种情况的原因吗?游标是否与插入相关或仅更新?我想,生命结束时的每一个主题都会关闭所有会话,常规和无状态。

仅供参考我以这种方式写日志:

  • 在会话工厂

    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];
        }
    }
    
  • 并在日志中写道:

            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();
            }
    

1 个答案:

答案 0 :(得分:1)

对于记录,问题的原因是使用MS Oracle客户端( System.Data.OracleClient )而不是Oracle数据提供程序( Oracle.DataAccess )。由于第一个是 OracleClientConfiguration 和ODP.Net OracleDataClientConfiguration ,因为我们知道MS客户端已停止使用,因此流利的内容很容易混淆。

目前,数据库性能已经提高了400%,并且根本没有光标泄漏。所以从我的观点来看,永远不要使用MS客户端。