代码之家  ›  专栏  ›  技术社区  ›  ConsultUtah

OracleConnection.ClearAllPools-由于对象的当前状态,操作无效

  •  0
  • ConsultUtah  · 技术社区  · 15 年前

    我在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)
    

    在尝试清除连接池之前,是否有关于连接池需要处于何种状态的建议?

    谢谢,

    1 回复  |  直到 15 年前
        1
  •  4
  •   Thomas Levesque    15 年前

    这是InvalidOperationException的默认错误消息,因此在本例中不要假定它有任何重要意义…显然,甲骨文没有费心写一个明确的错误消息。

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

    所以很明显它在没有连接池的情况下抛出了这个异常,我看不到任何检查方法…所以最终唯一的选择是捕获异常