【问题标题】:NHibernate stateless session cursor leakageNHibernate 无状态会话游标泄漏
【发布时间】:2012-11-06 13:27:54
【问题描述】:

我有一个带有线程静态会话的多线程应用程序,它对文件执行一些工作。它使用 NH 从服务中消费并在 oracle db 上运行,到目前为止一切顺利。

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

例如日志:

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

【问题讨论】:

标签: c# oracle nhibernate cursor


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多