![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| kostenko |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 27.9.2005 Репутация: нет Всего: нет |
Добрый день!
Столкнулся со следующей проблемой: Есть SessionBean (container-managment transactions) c неким методом :
Так вот после того как 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 |
|||
|
||||
| YuG |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 20.2.2006 Репутация: 3 Всего: 4 |
По всей видимости за время простоя в режиме дебаг сессия умирает по тайм-ауту.
Это нормально. Как перехватить: catch(Throwable....) |
|||
|
||||
| kostenko |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 27.9.2005 Репутация: нет Всего: нет |
Да, согласен, что ситуация нормальная - когда сессия может умереть. Но в блок catch - я все равно не попал. (Exception, Throwable - какая, кстати, разница ?) - ошибка я так понимаю возникает в то время когда контейнер пытается коммитить транзакцию - а это видать не всегда синхронизировано со временем выполнения кода ... Кстати, только что попробовал сделать Bean-transactions managment
Результат тот же ... после коммита в логах вижу java.sql.SQLException: ORA-00028: your session has been killed а в катч - не попадаю Это сообщение отредактировал(а) kostenko - 5.3.2007, 17:55 |
||||
|
|||||
| YuG |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 20.2.2006 Репутация: 3 Всего: 4 |
1. "Exception, Throwable - какая, кстати, разница ?"
Exception - это ребенок от Throwable. Любой Exception есть Throwable, но не наоборот. 2. Зачем вообще ставить точку остановки? Не ставь ее и нет проблемы. |
|||
|
||||
| kostenko |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 27.9.2005 Репутация: нет Всего: нет |
- это я в курсе
так то оно так - но точка останова - это скорее вынужденный шаг, а не моя прихоть.. похожая ситуация может возникнуть на любой действующей продакшн системе - допустим что вместо точки останова есть ещё какая то обработка, за время которой отпала оракловая сесия... в итоге клиенту ушло что всё в порядке, а на скамом деле запрос не отработал.... - неправильно это.. Это сообщение отредактировал(а) kostenko - 5.3.2007, 18:59 |
|||
|
||||
| YuG |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 20.2.2006 Репутация: 3 Всего: 4 |
Длительность транзакции - вещь настраиваемая.
Точно знаю, что в Orion AppServer есть накая настройка. (под рукой нет, точное месторасположение не приведу) В JBoss - тоже похоже (но не проверял) jboss-service.xml <attribute name="TransactionTimeout">300</attribute> А вот с Borland App Server не работал - поищи сам... |
|||
|
||||
| KostenkoSergey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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) может как то поможет следствию Добавлено @ 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) |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |