OracleConnection.ClearAllPools — операция недействительна из-за текущего состояния объекта

У меня есть следующий код в файле ashx - не спрашивайте, почему ;-)

<%@ WebHandler Language="C#" Class="Site.Pool" %>

using System;
using System.Data;
using System.IO;
using System.Web;
using System.Web.SessionState;

using Core.Database;
using Core.ITables;
using Online.Server.Busi;
using Online.Server.ITables;
using XactNet.Busi;

namespace Site
{
    public class Pool : IHttpHandler, IRequiresSessionState
    {
            public void ProcessRequest(HttpContext context)
            {
            try
            {
                Oracle.DataAccess.Client.OracleConnection.ClearAllPools();
                context.Response.Write("SUCCESS");
            }
            catch (Exception e)
            {
                context.Response.Write(e.ToString());
            }

        }

            public bool IsReusable
            {
                get { return false; }
        }
        }
}

При вызове исключение записывается:

System.InvalidOperationException: Operation is not valid due to the current state of the object. 
at Oracle.DataAccess.Client.OracleConnection.ClearAllPools() 
at Site.Pool.ProcessRequest(HttpContext context)

Любые предложения относительно того, в каком состоянии должны находиться пулы соединений, прежде чем пытаться их очистить?

Спасибо,


person ConsultUtah    schedule 17.08.2009    source источник


Ответы (1)


Это сообщение об ошибке по умолчанию для InvalidOperationException, поэтому не думайте, что оно имеет какое-то существенное значение в данном случае... очевидно, Oracle не удосужился написать явное сообщение об ошибке.

Вот код метода ClearAllPools, согласно Reflector:

public static void ClearAllPools()
{
    if (!OracleInit.bSetDllDirectoryInvoked)
    {
        OracleInit.Initialize();
    }
    if (((ConnectionDispenser.m_ConnectionPools == null) || (ConnectionDispenser.m_ConnectionPools.Count == 0)) && ((ConnectionDispenser.m_htSvcToRLB == null) || (ConnectionDispenser.m_htSvcToRLB.Count == 0)))
    {
        throw new InvalidOperationException();
    }
    ConnectionDispenser.ClearAllPools();
}

Так что, по-видимому, это исключение выдается, когда нет пула соединений, и я не вижу способа это проверить... так что в конечном итоге единственный вариант - поймать исключение

person Thomas Levesque    schedule 17.08.2009
comment
Да, я тоже открыл его в рефлекторе и увидел то же самое. Понятия не имею, почему у меня не было пула соединений в то время (возможно, приложение перезапустилось, когда я поместил туда файл ashx...) - person ConsultUtah; 17.08.2009