汇总连接超时

时间:2013-12-03 13:38:10

标签: database oracle connection data-access

在生产服务器上,有时随机连接失败到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. 


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

4 个答案:

答案 0 :(得分:9)

我所知道的最常见的原因是无法正确处理与Oracle.DataAccess.Client关联的IDisposable对象。

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

仔细检查您的代码,确保使用语句正确处理或封装所有IDisposable对象。

答案 1 :(得分:4)

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

  • 应用程序正在打开连接。这会耗尽所有可用的连接,因此连接被随机拒绝。最简单的代码解决方案是确保应用程序尽快关闭连接(而不是等待变量离开范围)。 .NET中的“using”语句适用于此。
  • 您的连接池可能需要回收。您可以参考此网站以获取更多信息: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/

答案 2 :(得分:2)

关键是在你的DbContext上调用.Dispose()和/或确保你的容器为你调用.Dispose()(通过重写dispose并确保为每个新的DbContext你有相应的调用.Dispose ())。

您可能希望使用析构函数~MyDbContext()作为快速入侵,只是为了检查调用Dispose()将解决您的应用程序保持连接打开的问题(即不在DbContext上调用Dispose())。 / p>

似乎对于Oracle提供商,您 必须 调用自己处理(或让容器为您执行此操作),否则您将泄漏/用完连接。

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

答案 3 :(得分:0)

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

// 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
}