1

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

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

例如日志:

  • 第324章
  • 第310章
  • 第121章

和应用程序本身:

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

1 回答 1

1

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

现在数据库性能提高了 400%,而且完全没有游标泄漏。所以从我的角度来看,永远不要使用 MS 客户端。

于 2012-12-17T09:17:40.030 回答