【问题标题】:pooled connection timed out池连接超时
【发布时间】:2013-12-19 14:24:21
【问题描述】:

在生产服务器上,与 ORacle 数据库的连接有时会随机失败。我得到了很多

Oracle.DataAccess.Client.OracleException 
Pooled connection request timed out
   at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck, Int32 isRecoverable)
   at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
   at Oracle.DataAccess.Client.OracleConnection.Open()
   at ws.DataConnection() in path. 



我搜索了一些解决方案,但没有运气。奇怪的是,异常没有像 Ora-123 这样的标识符......我使用 OracleDataAccess 客户端。有时这个问题会持续 5-10 秒,有时我必须重新启动 IIS(6.1,Windows Server 2008 R2)才能解决问题。令人沮丧...我无法设置 pooling=false 因为我们有一个巨大的网站。有什么解决办法吗?

【问题讨论】:

    标签: database oracle connection data-access


    【解决方案1】:

    确保您没有反复连接到数据库。如:

    // collection to wrap several db records
    private List<YourClassItems> list
    get
    {
        if (Session["FOO"] == null)
        {
            // this method connect to the database
            List<YourClass> lst = GetItems();
            Session["FOO"] = lst;
            return lst;
        }
        return (List<YourClass>)Session["FOO"];
    }
    
    // then we have the GetItems() method
    private List<YourClass> GetItems()
    {
        // get several items from database.
        while (read())
        {
            // assume this row is an item
            RowItem i = read.Row;
            // THIS might be your problem. It will recursively call this method
            yourClassItems.Add(i); 
        }
    
        //to solve this, create a List<YourClass> tempList and then
        //yourClassItems = tempList outside the loop
    }
    

    【讨论】:

      【解决方案2】:

      关键是在您的 DbContext 上调用 .Dispose() 和/或确保您的容器正在为您调用 .Dispose() (通过覆盖 dispose 并确保对于每个新的 DbContext 您都有相应的 .Dispose 调用())。

      您可能想使用析构函数 ~MyDbContext() 作为快速破解,以检查调用 Dispose() 是否可以解决您的应用程序保持连接打开的问题(即不在您的 DbContext 上调用 Dispose())。

      您似乎必须调用 Oracle 提供程序 Dispose 自己(或让容器为您完成),否则您将泄漏/耗尽连接。

      如果你愿意,我可以提供一些示例代码吗?

      【讨论】:

        【解决方案3】:

        我见过的最常见的连接问题是:

        • 应用程序使连接保持打开状态。这会用完所有可用的连接,因此会随机拒绝连接。最简单的代码解决方案是确保应用程序尽快关闭连接(而不是等待变量离开作用域)。 .NET 中的“使用”语句可以很好地解决这个问题。
        • 您的连接池可能需要回收。您可以参考这个网站了解更多信息:http://docs.oracle.com/cd/E11882_01/java.112/e12265/manage.htm#BABICIII
        • 您可能只是没有足够大的连接池(默认最大大小为 100)。尝试增加这个。

        另一个可能有帮助的网站是这个:http://blog.ilab8.com/2011/09/02/odp-net-pooling-and-connection-request-timed-out/

        【讨论】:

          【解决方案4】:

          据我所知,最常见的原因是未能正确处理与 Oracle.DataAccess.Client 关联的 IDisposable 对象。

          您可能有一些代码没有正确处理某些对象。这将导致 Oracle 保留实际未使用的连接,从而导致您用完池中的可用连接。重新启动 IIS 解决了这个问题,因为它会终止所有这些连接。

          仔细检查您的代码,并确保所有 IDisposable 对象都被正确处理或封装在 using 语句中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-14
            • 1970-01-01
            • 2012-07-03
            • 2021-12-13
            • 1970-01-01
            • 1970-01-01
            • 2020-12-26
            • 1970-01-01
            相关资源
            最近更新 更多