我有一个带线程静态会话的多线程应用程序,它可以处理文件。它使用NH来从服务中消耗并在oracle db上运行,到目前为止一直很好。
每个线程都有一个详细日志,使用无状态会话更轻量级。顺便说一句,当处理一些文件时,我可以看到在oracle中管理了很多游标用于日志会话。
例如log:
和申请本身:
这让我用完了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();
}
答案 0 :(得分:1)
对于记录,问题的原因是使用MS Oracle客户端( System.Data.OracleClient )而不是Oracle数据提供程序( Oracle.DataAccess )。由于第一个是 OracleClientConfiguration 和ODP.Net OracleDataClientConfiguration ,因为我们知道MS客户端已停止使用,因此流利的内容很容易混淆。
目前,数据库性能已经提高了400%,并且根本没有光标泄漏。所以从我的观点来看,永远不要使用MS客户端。