2012-06-06 2 views
0

Я начал использовать NHibernate то же время я начал использовать замок ActiveRecord поэтому у меня есть эти перепутали вопросы иногдакогда замок ActiveRecord закрывает соединение

Я задавался вопросом, когда ActiveRecord (или NHibernate) закрывает соединение при выполнении следующего кода :

Dim entity = TABLE_Y.TryFind(id) 
if not entity is nothing then 
    'long running process here 
    response.redirect("...") 
end if 

Я спрашиваю это, потому что это долго работает процесс занимает более одного часа, чтобы закончить и всякий раз, когда код перенаправляет на другую страницу, я получаю ORA-03135 (соединение потерял контакт) рассказывала мне связь была потеряна , эта другая страница имеет следующий активный запрос записи:

Dim entity = TABLE_X.FindAll(Order.Desc(...), _ 
    Expression.Eq(...) And _ 
    Expression.Eq(...)).FirstOrDefault 

, который затем возвращает ор-03135

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

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

это смешно, потому что я начинаю новый запрос на завершении ely другая таблица, является activerecord, пытаясь повторно использовать существующее соединение, которое истекло? Я пытался добавить «Пулы = False» и «Подтвердить подключение = True» не повезло

заранее спасибо

ответ

1

соединение будет закрыто, когда сеанс утилизирован, где это происходит, зависит от вашего приложения. Если вы используете модуль, который поставляется с ActiveRecord, тогда это произойдет, когда событие Application.EndRequest запускается (т. Е. В конце вашего запроса), если вы этого не сделаете, то вам нужно увидеть, где SessionScope или TransactionScope создано и расположено (в распоряжении есть место, где соединение закрыто).

Если вы хотите запустить долгосрочную задачу и перенаправить ее до ее завершения, вам нужно будет запустить ее в другом потоке (например, с помощью ThreadPool или Tasks). Вам также необходимо настроить ActiveRecord для использования HybridWebThreadScopeInfo, чтобы он сохранял сеанс в потоке локальный, когда HttpContext недоступен (что и происходит в фоновом потоке).

<activerecord threadinfotype="Castle.ActiveRecord.Framework.Scopes.HybridWebThreadScopeInfo, Castle.ActiveRecord"> 

Затем в задаче, завернуть его в TransactionScope или SessionScope (я предпочитаю бывший):

using(var trans = new TransactionScope()) { 
    // do your stuff here... 
    trans.VoteCommit(); 
} 
+0

спасибо, это то, что я ожидал, в настоящее время я не я использую SessionScopeWebModule так что нет так что связь будет оставаться открытой при перенаправлении. Я думаю, –

+0

обновленный ответ для вашей ситуации –