둘러보기 생략.
 

hibernate & weblogic jta transaction manager 사용시의 이상한점..

안녕하세요.

hibernate에 weblogic jta txmanager를 사용하고 있습니다.

설정은 다음과 같습니다.

hibernate 설정

bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
property name="dataSource" ref="dataSource" />
property name="mappingDirectoryLocations">
value>classpath:/hibernate
/property>
property name="hibernateProperties">
props>
prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect
prop key="hibernate.format_sql">true
prop key="hibernate.use_sql_comments">true
prop key="hibernate.jdbc.batch_size">100
/props>
/property>
/bean>

datasource 설정 (실제는 datasource spy로 겉을 쌌는데 그부분은 생략하였습니다.)

bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
property name="jndiName" value="jdbc.mes"/>
property name="jndiTemplate" ref="jndiDataSourceTemplate"/>
property name="proxyInterface" value="javax.sql.DataSource" />
/bean>

bean id="jndiDataSourceTemplate" class="org.springframework.jndi.JndiTemplate">
property name="environment">
props>
prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory
prop key="java.naming.provider.url">t3://localhost:7001
/props>
/property>
/bean>

tx 설정 (weblogic jta 사용)

bean id="txManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager">
property name="transactionManagerName" value="javax.transaction.TransactionManager" />
property name="jndiTemplate" ref="jndiDataSourceTemplate" />
/bean>

에러로그는 다음과 같습니다.

2009-11-24 19:04:38,000 [ERROR] [pool-1-thread-1] [jdbc.audit] 15. Connection.clearWarnings()
java.sql.SQLException: The transaction is no longer active - status: 'Committed'. No further JDBC access is allowed within this transaction.

at weblogic.jdbc.wrapper.JTSConnection.checkIfRolledBack(JTSConnection.java:178)
at weblogic.jdbc.wrapper.JTSConnection.checkConnection(JTSConnection.java:188)
at weblogic.jdbc.wrapper.Connection.preInvocationHandler(Connection.java:92)
at weblogic.jdbc.wrapper.Connection.clearWarnings(Connection.java:632)
at net.sf.log4jdbc.ConnectionSpy.clearWarnings(ConnectionSpy.java:303)
at org.hibernate.util.JDBCExceptionReporter.logAndClearWarnings(JDBCExceptionReporter.java:54)
at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:472)
at org.hibernate.jdbc.ConnectionManager.cleanup(ConnectionManager.java:408)
at org.hibernate.jdbc.ConnectionManager.close(ConnectionManager.java:347)
at org.hibernate.impl.SessionImpl.close(SessionImpl.java:325)
at org.springframework.orm.hibernate3.SessionFactoryUtils.closeSession(SessionFactoryUtils.java:791)
at org.springframework.orm.hibernate3.SessionFactoryUtils.closeSessionOrRegisterDeferredClose(SessionFactoryUtils.java:777)
at org.springframework.orm.hibernate3.SpringSessionSynchronization.afterCompletion(SpringSessionSynchronization.java:220)
at org.springframework.transaction.support.TransactionSynchronizationUtils.invokeAfterCompletion(TransactionSynchronizationUtils.jav
a:157)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.invokeAfterCompletion(AbstractPlatformTransactionManag
er.java:974)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCompletion(AbstractPlatformTransactionMana
ger.java:949)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:
777)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.jav
a:321)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:42)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:50)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy53.execute(Unknown Source)
at com.samsung.smes.controlframework.dispatch.RuleTask.run(RuleTask.java:50)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)

한가지 신기한점은 txManager를 weblogic jta가 아닌 hibernate sessionFactory로 바꾸게 되면 위와 같은 에러메세지가 표시되지 않습니다.

bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
property name="sessionFactory" ref="sessionFactory" />
/bean>

혹시 weblogic JTA 사용시에는 datasource를 XA로 설정해야만 하는지도 궁금합니다.

감사합니다.