weblogic XA 事务配置问题

环境: weblogic 8.1
DB: oralce 9.02
使用hibernate 配合jndi
当在控制台中选择
oracle.jdbc.xa.client.OracleXADataSource 驱动程序以支持XA
结果启动应用 出现错误


51964 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] ERROR net.sf.hibernate.util.JDBCExc
eptionReporter(38) - SQLException occurred
java.sql.SQLException: SQL operations are not allowed with no global transaction by default for XA d
rivers. If the XA driver supports performing SQL operations with no global transaction, explicitly a
llow it by setting "SupportsLocalTransaction" JDBC connection pool property to true. In this case, a
lso remember to complete the local transaction before using the connection again for global transact
ion, else a XAER_OUTSIDE XAException may result. To complete a local transaction, you can either set
auto commit to true or call Connection.commit() or Connection.rollback().
at weblogic.jdbc.wrapper.JTAConnection.checkIfLocalTxSupported(JTAConnection.java:85)
at weblogic.jdbc.wrapper.JTAConnection.checkConnection(JTAConnection.java:74)
at weblogic.jdbc.wrapper.Connection.prepareStatement(Connection.java:316)
at net.sf.hibernate.impl.BatcherImpl.getPreparedStatement(BatcherImpl.java:257)
at net.sf.hibernate.impl.BatcherImpl.getPreparedStatement(BatcherImpl.java:232)
at net.sf.hibernate.impl.BatcherImpl.prepareQueryStatement(BatcherImpl.java:65)
at net.sf.hibernate.loader.Loader.prepareQueryStatement(Loader.java:779)
at net.sf.hibernate.loader.Loader.doQuery(Loader.java:265)
at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:133)
at net.sf.hibernate.loader.Loader.doList(Loader.java:1033)
at net.sf.hibernate.loader.Loader.list(Loader.java:1024)
at net.sf.hibernate.loader.CriteriaLoader.list(CriteriaLoader.java:118)
at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:3613)
at net.sf.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:238)



如果配置 允许本地事务 则

ceptionReporter(46) - XA error: XAER_PROTO : Routine was invoked in an inproper context start() fail
ed on resource 'MyJDBC Connection Pool-1': XAER_PROTO : Routine was invoked in an inproper context
javax.transaction.xa.XAException
at oracle.jdbc.xa.OracleXAResource.disallowLocalTxnMode(OracleXAResource.java:1047)
at oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:153)



139540 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] ERROR net.sf.hibernate.util.JDBCEx
ceptionReporter(38) - Could not execute query
java.sql.SQLException: SQL operations are not allowed with no global transaction by default for XA d
rivers. If the XA driver supports performing SQL operations with no global transaction, explicitly a
llow it by setting "SupportsLocalTransaction" JDBC connection pool property to true. In this case, a
lso remember to complete the local transaction before using the connection again for global transact
ion, else a XAER_OUTSIDE XAException may result. To complete a local transaction, you can either set
auto commit to true or call Connection.commit() or Connection.rollback().

你程序是非ejb的吧?使用xa数据原,应该把程序放在事务内,比如:
UserTransaction ut = ....
ut.begin();
myoperations....
ut.commit()

是ejb{sessionbean} 采用的是容器管理事务

你是用hibernate作为数据访问层的啊,倒没注意。我没有试过session bean+hibernate的实际操作,但从抱错来看,应该是你使用hibernate的程序没有放到事务里了。