2013-12-03 3 views
9

На производственном сервере иногда случайным образом соединение не удается получить в базе данных ORACLE. Я получаю много
Oracle.DataAccess.Client.OracleException запроса складочного соединения истекло на Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32 ERRCODE, OracleConnection Коннах, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx ЦСИ объекта, процедура строковой Логические bCheck, Int32 isRecoverable) на Oracle.DataAccess.Client.OracleException.HandleError (Int32 ERRCODE, OracleConnection Конн, IntPtr opsErrCtx, Src объекта) на Oracle.DataAccess.Client.OracleConnection.Open() в ws.DataConnection() в пути.

Я искал некоторые решения, но не повезло. Странно, что в Exception нет идентификатора, такого как Ora-123 ... Я использую клиент OracleDataAccess. Иногда эта проблема возникает в течение 5-10 секунд, иногда мне приходится перезапускать IIS (6.1, Windows Server 2008 R2) для решения проблемы. Это расстраивает ... Я не могу установить пул = ложь, потому что у нас огромный веб-сайт. Любые решения?время соединения с пулом

ответ

8

Наиболее распространенной причиной этого, о котором я знаю, является неправильная обработка IDisposable объектов, связанных с Oracle.DataAccess.Client.

Существует, вероятно, некоторый код, который у вас есть, который не правильно распоряжается некоторыми объектами. Это приведет к тому, что Oracle будет придерживаться подключений, которые на самом деле не используются, что приведет к тому, что у вас не будет доступных подключений в пуле. Перезапуск IIS решает его, потому что он убивает все эти соединения.

Внимательно просмотрите свой код и убедитесь, что все объекты IDisposable правильно удалены или инкапсулированы с помощью операторов.

4

Наиболее распространенные проблемы подключения, которые я видел, являются:

  • Приложение покидают открытые соединения. Это использует все доступные соединения, и поэтому соединения произвольно отклоняются. Самое простое решение для этого кода - убедиться, что приложение закрывает соединения как можно быстрее (вместо того, чтобы ждать, пока переменные покинут область). Оператор «using» в .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/

1

Ключ назвать .Dispose() на вашем DbContext и/или убедитесь, что ваш контейнер звонит .Dispose() для вас (путем переопределения и обеспечения того, что для каждого нового DbContext у вас есть соответствующий вызов .Dispose()).

Возможно, вы захотите использовать деструктор ~ MyDbContext() в качестве быстрого взлома, чтобы проверить, что вызов Dispose() устранит проблему, когда ваше приложение покидает соединения (т. Е. Не вызывает Dispose() в вашем DbContext).

Похоже, что с провайдером Oracle вы MUST вызов Dispose себя (или есть контейнер сделать это для вас), в противном случае вы будете течь/бежать из соединений.

Я могу предоставить код примера, если хотите?

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 
}