Я пытаюсь диагностировать это исключение:
System.Runtime.InteropServices.COMException (0x80070008): Not enough storage is available to process this command. (Exception from HRESULT: 0x80070008)
at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType)
at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(Type objectType)
at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(Type serverType)
at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(Type serverType, Object[] props, Boolean bNewObj)
at Oracle.DataAccess.Client.CThreadPool..ctor()
at Oracle.DataAccess.Client.OracleCommand.set_CommandTimeout(Int32 value)
...
Похоже, что ни один из нормальных типов «хранилищ» не достиг каких-либо ограничений. Приложение использует около 400 МБ памяти, 70 потоков, 2000 дескрипторов, а на жестком диске много свободных ГБ. На компьютере установлена 32-разрядная ОС Windows 2003 Enterprise Server с 16 ГБ ОЗУ, поэтому проблема с памятью не должна быть.
Приложение работает как служба Windows, поэтому объекты GDI не используются. Нехватка дескрипторов GDI является распространенной причиной этого исключения.
Все соединения с базой данных, команды и читатели упакованы с использованием блоков, поэтому они должны быть очищены правильно.
ОБНОВЛЕНИЕ: Уменьшение количества потоков, которые мы использовали с 12 до 4, похоже, решило проблему. Нам удалось работать без ошибок более 24 часов, прежде чем мы продержались от 4 до 8 часов.
ОБНОВЛЕНИЕ2: Я так и не понял, из какого ресурса у нас заканчивается, но уменьшение количества потоков, похоже, решило проблему. Или, по крайней мере, скрыл это.