Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прблема с transactions managment, что то не так как надо :) 
:(
    Опции темы
kostenko
Дата 5.3.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 27.9.2005

Репутация: нет
Всего: нет



Добрый день!
Столкнулся со следующей проблемой:
Есть SessionBean (container-managment transactions) c неким методом :
Код

public void myTestRollback() throws ... {
try {
-- полный цикл jdbc-операций
-- (!) тут ставлю точку останова для дебага
} catch(Exception e){
e.printStackTrace();
-- посылаю ошибку клиенту.
}
}


Так вот после того как jdbc-операци были успешно выполнены, убиваю оракловую сессию.
В итоге: операции в оракле не закоммитились и в блок катч не попадаю, а в логах контейнера вижу:

2007-03-05 12:49:40,921 ERROR - Error while closing connection=>
java.sql.SQLException: ORA-00028: your session has been killed
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:283)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:278)
at oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:141)
at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:464)
at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1175)
at oracle.jdbc.pool.OraclePooledConnection.close(OraclePooledConnection.java:246)
at com.inprise.visitransact.jdbc2.PooledConnectionHolder.discardInstance(PooledCon nectionHolder.java:3
at com.inprise.visitransact.jdbc2.PooledConnectionHolder.doExpireCheck(PooledConne ctionHolder.java:729
at com.inprise.visitransact.jdbc2.GenericPool.expireFreeElements(GenericPool.java: 307)
at com.inprise.visitransact.jdbc2.GenericPool.callme(GenericPool.java:259)
at com.visigenic.services.CosTransactions.TimeoutEntry.callback(Timer.java:51)
at com.visigenic.services.CosTransactions.Timer.run(Timer.java:138)
2007-03-05 12:49:41,156 WARN - JDBC 2 Pool Monitoring Exception
java.lang.NullPointerException

Кто-то с пододбным сталкивался ? Как побороть и перехватить подобного рода ошибку?

Использую Oracle10g, Borland App Server 6.0

Спасибо

Это сообщение отредактировал(а) kostenko - 5.3.2007, 15:55
PM MAIL   Вверх
YuG
Дата 5.3.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 20.2.2006

Репутация: 3
Всего: 4



По всей видимости за время простоя в режиме дебаг сессия умирает по тайм-ауту.
Это нормально.

Как перехватить: catch(Throwable....)
PM WWW ICQ Skype   Вверх
kostenko
Дата 5.3.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 27.9.2005

Репутация: нет
Всего: нет



Цитата(YuG @  5.3.2007,  16:46 Найти цитируемый пост)
По всей видимости за время простоя в режиме дебаг сессия умирает по тайм-ауту.
Это нормально.

Как перехватить: catch(Throwable....) 


Да, согласен, что ситуация нормальная - когда сессия может умереть.

Но в блок catch - я все равно не попал. (Exception, Throwable - какая, кстати, разница ?) - ошибка я так понимаю возникает в то время когда контейнер пытается коммитить транзакцию - а это видать не всегда синхронизировано со временем выполнения кода ...  smile 

Кстати, только что попробовал сделать Bean-transactions managment
Код

    try {
      // --- Определяем и выполняем операцию:
      this.sessionContext.getUserTransaction().begin();
      response = opSelector.selectAndExecuteOperations(_inputNode,_connectInfo);
      this.sessionContext.getUserTransaction().commit();      
      
      System.out.println(":)");
    }
    catch (Throwable  ex) {
      this.sessionContext.setRollbackOnly();
      ex.printStackTrace();
      throw new RUException(this, 105, ex.toString(),  _connectInfo);
    }
    return response;


Результат тот же ... после коммита в логах вижу java.sql.SQLException: ORA-00028: your session has been killed
а в катч - не попадаю  smile 

Это сообщение отредактировал(а) kostenko - 5.3.2007, 17:55
PM MAIL   Вверх
YuG
Дата 5.3.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 20.2.2006

Репутация: 3
Всего: 4



1. "Exception, Throwable - какая, кстати, разница ?"
Exception - это ребенок от Throwable.
Любой Exception есть Throwable, но не наоборот.

2. Зачем вообще ставить точку остановки?
Не ставь ее и нет проблемы.
PM WWW ICQ Skype   Вверх
kostenko
Дата 5.3.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 27.9.2005

Репутация: нет
Всего: нет



Цитата(YuG @  5.3.2007,  18:40 Найти цитируемый пост)
Exception - это ребенок от Throwable
 - это я в курсе smile, а имел ввиду "какая разница" в контексте моего примера ... но то такое ..


Цитата(YuG @  5.3.2007,  18:40 Найти цитируемый пост)
2. Зачем вообще ставить точку остановки?
Не ставь ее и нет проблемы. 

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


Это сообщение отредактировал(а) kostenko - 5.3.2007, 18:59
PM MAIL   Вверх
YuG
Дата 5.3.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 20.2.2006

Репутация: 3
Всего: 4



Длительность транзакции - вещь настраиваемая.

Точно знаю, что в Orion AppServer есть накая настройка.
(под рукой нет, точное месторасположение не приведу)

В JBoss - тоже похоже (но не проверял)
jboss-service.xml
<attribute name="TransactionTimeout">300</attribute>

А вот с Borland App Server не работал - поищи сам...

PM WWW ICQ Skype   Вверх
KostenkoSergey
Дата 16.3.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



попроббовал повторить ситуацию с подробным логирование ejb-контейнера и транзакций получил:
2007-03-06 12:40:06,843 DEBUG  - commit(): committing transaction = [jts.Transaction[0]]
2007-03-06 12:40:06,859 ERROR  - java.sql.SQLException: ORA-00028: your session has been killed

2007-03-06 12:40:06,875 DEBUG  - HeuristicHazard in commit_one_phase
exception org.omg.CosTransactions.HeuristicHazard {}
       at com.inprise.visitransact.jdbc2.PooledConnectionHolder$InpriseLocalResource.commit_one_phase(PooledConnectionHo
       at org.omg.CosTransactions._ResourceStub.commit_one_phase(_ResourceStub.java:191)
       at com.inprise.ejb.jts.Transaction.commit(Transaction.java:454)
       at org.omg.CosTransactions._TerminatorStub.commit(_TerminatorStub.java:27)
       at com.inprise.ejb.jts.gen._TxStub.commit(_TxStub.java:46)
       at com.visigenic.services.CosTransactions.CurrentImpl.commit(CurrentImpl.java:254)
       at com.visigenic.services.CosTransactions.TSCurrentManager.commit(TSCurrentManager.java:87)
       at com.inprise.visitransact.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java:198)
       at com.inprise.visitransact.jta.UserTransactionImpl.commit(UserTransactionImpl.java:80)
       at ua.nadra.ru.bobj.OperationSessionFassade.processNode(OperationSessionFassade.java:33)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:324)
       at com.inprise.ejb.ConcreteMethod.invoke(ConcreteMethod.java:32)
       at com.inprise.ejb.EJBContext.invoke(EJBContext.java:166)
       at com.inprise.ejb.Dispatcher.doInvoke(Dispatcher.java:1354)
       at com.inprise.ejb.Dispatcher.invokeSecurityCheck(Dispatcher.java:1062)
       at com.inprise.ejb.Dispatcher.invoke(Dispatcher.java:824)
       at com.inprise.ejb.Dispatcher.invoke(Dispatcher.java:603)
       at com.inprise.ejb.EJBHome.dispatcherInvokeBeanMethod(EJBHome.java:60)
       at com.inprise.ejb.EJBHome$ComponentInterfaceMethodCache.invokeDispatcherMethod(EJBHome.java:1519)
       at com.inprise.ejb.EJBHome.invokeDispatcherMethod(EJBHome.java:38)
       at com.inprise.ejb.Dispatcher.invoke(Dispatcher.java:429)


может как то поможет следствию smile

Добавлено @ 13:26 
Пробовал обойти проблему использованием bean-managment transactions:
try {
     // --- Определяем и выполняем операцию:
     this.sessionContext.getUserTransaction().begin();
     response = opSelector.selectAndExecuteOperations(_inputNode,_connectInfo);
     this.sessionContext.getUserTransaction().commit();      
     
     System.out.println(":)");
   }
   catch (Throwable  ex) {
     this.sessionContext.setRollbackOnly();
     ex.printStackTrace();
     throw new RUException(this, 105, ex.toString(),  _connectInfo);
   }
   return response;

Оракловую сессию рубил непосредственно перед коммитом - результат при комите в лог сервера :
java.sql.SQLException: ORA-00028: your session has been killed
А в catch - опять не попал.

Кто-то с пододбным сталкивался ? Ведь в принципе нормальная ситуация, если умерла сессия с БД ... Как побороть и перехватить подобного рода ошибку именно с использованием Transaction Managerа?

Пробовал повторить ситуацию использованием OTS - помогло, - ошибку вернуло:
Transaction Service Error:javax.transaction.SystemException: org.omg.CORBA.TRANSIENT:   vmcid: 0x0  minor code: 0  completed: No; nested exception is:   javax.transaction.SystemException: org.omg.CORBA.TRANSIENT:   vmcid: 0x0  minor code: 0  completed: No; nested exception is: javax.transaction.SystemException: org.omg.CORBA.TRANSIENT:   vmcid: 0x0  minor code: 0  completed: No

Но, насколько я знаю, ots-гораздо медлительнее и его рекомендуется использовать при 2Pc транзакциях..

Использовал Oracle10g, Borland App Server 6.0 (Allow unrecoverable completion = true)

PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0809 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.