Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate无状态会话游标泄漏_C#_Oracle_Nhibernate_Cursor - Fatal编程技术网

C# NHibernate无状态会话游标泄漏

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

我有一个带有threadstatic会话的多线程应用程序,它可以处理文件。它使用NH从服务中消费,并在oracle数据库上运行,到目前为止还不错

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

例如,日志:

  • 324 SPC_日志
  • 310 SPC_日志
  • 121程控测井
以及应用程序本身:

  • 31 SPC\u生产线\u测试
  • 27 SPC\u生产线\u测试
  • 21 SPC\u生产线\u测试
这让我耗尽了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];
        }
    }
    

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


现在数据库性能已经提高了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();
        }