ファイルを処理するスレッド静的セッションを備えたマルチスレッド アプリケーションがあります。NHを使用してサービスから消費し、Oracle dbで実行していますが、これまでのところ非常に良好です。
すべてのスレッドには、より軽量にするためにステートレス セッションを使用する詳細なログがあります。ところで、いくつかのファイルが処理されると、多くのカーソルがログ セッション用に Oracle で管理されていることがわかります。
たとえば、ログ:
- 324 SPCログ
- 310 SPC_ログ
- 121 SPC_ログ
およびアプリケーション自体:
- 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(); }