Hi guys,
I'm facing the scenario coordinating multiple session factories in JTA with Weglogic 8.1 SP5, the database is sybase. In my case, there are multiple databaes existing, so I have to create multiple session factories per the databases. For coordinating them in JTA, I set up multiple xa style database pools in Weblogic and assign them to related session factory in multiple hibernate config files. And I have implemented a interceptor for catching the method needing JTA transaction, the pseudocodes like below:
=========================================================================================
try {
Context ctx = JndiHelper.instance().getContext();
String jtstransaction = "javax.transaction.UserTransaction";
if(JndiHelper.instance().getJndiParam("jta.UserTransaction")!=null){
jtstransaction = JndiHelper.instance().getJndiParam("jta.UserTransaction");
}
//Get the UserTransaction
tx = (UserTransaction)ctx.lookup(jtstransaction);
tx.begin();
Object retObject = method.invoke(target, args);
tx.commit();
return retObject;
}catch(Exception e){
if(tx!=null){
tx.rollback();
}
throw new Exception(e.getCause());
}
}else{
return method.invoke(target, args);
}
=========================================================================================
When I insert data in JTA, there are different exception thrown according to the different sybase XA drivers(one is Jconn another is bea build-in xa driver). When using Jconn driver, it seems like transaction timeout, but I test only with inserting one record, if it runs more than 30 seconds, maybe it's too boring. Then using Bea build-in driver, the exception is unsupported method: Connection.prepareStatement. Why hibernate will invoke it when saving a data? How can I avoid it in my case? Perhaps it's my misunderstanding on hibernate config, please give me some advice on them.
Also some basic information follow below:
Hibernate version:3.1.3
Mapping documents:http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
Name and version of the database you are using:Sybae 12.5
Below is the exception detail information for your reference.
1.Jconn:
[javax.transaction.TransactionRolledbackException: Transaction timed out after 31 seconds
BEA1-00002BA49E6EF4FB0348]
at weblogic.jdbc.rmi.internal.ConnectionImpl_weblogic_jdbc_wrapper_JTAConnection_weblogic_jdbc_wrapper_XAConnection_com_sybase_jdbc2_jdbc_SybConnectionProxy_815_WLStub.getAutoCommit(Unknown Source)
at weblogic.jdbc.rmi.SerialConnection_weblogic_jdbc_rmi_internal_ConnectionImpl_weblogic_jdbc_wrapper_JTAConnection_weblogic_jdbc_wrapper_XAConnection_com_sybase_jdbc2_jdbc_SybConnectionProxy_815_WLStub.getAutoCommit(Unknown Source)
at org.hibernate.jdbc.ConnectionManager.isAutoCommit(ConnectionManager.java:185)
at org.hibernate.jdbc.ConnectionManager.isAggressiveRelease(ConnectionManager.java:208)
at org.hibernate.jdbc.ConnectionManager.afterStatement(ConnectionManager.java:264)
at org.hibernate.jdbc.AbstractBatcher.closePreparedStatement(AbstractBatcher.java:480)
at org.hibernate.jdbc.AbstractBatcher.closeStatement(AbstractBatcher.java:218)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:1981)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2405)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:37)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:269)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:167)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:530)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
at efom.core.dao.GenericDaoImpl.create(GenericDaoImpl.java:57)
2.Bea build-in:
java.sql.SQLException: [BEA][Sybase JDBC Driver]Unsupported method: Connection.prepareStatement
at weblogic.jdbc.base.BaseExceptions.createException(Unknown Source)
at weblogic.jdbc.base.BaseExceptions.getException(Unknown Source)
at weblogic.jdbc.base.BaseConnection.prepareStatement(Unknown Source)
at weblogic.jdbcx.base.BasePooledConnection.prepareStatement(Unknown Source)
at weblogic.jdbcx.base.BaseConnectionWrapper.prepareStatement(Unknown Source)
at weblogic.jdbc.wrapper.XAConnection.prepareStatement(XAConnection.java:896)
at weblogic.jdbc.wrapper.JTAConnection_weblogic_jdbc_wrapper_XAConnection_weblogic_jdbcx_base_BaseConnectionWrapper.prepareStatement(Unknown Source)
at weblogic.jdbc.rmi.internal.ConnectionImpl_weblogic_jdbc_wrapper_JTAConnection_weblogic_jdbc_wrapper_XAConnection_weblogic_jdbcx_base_BaseConnectionWrapper.prepareStatement(Unknown Source)
at weblogic.jdbc.rmi.internal.ConnectionImpl_weblogic_jdbc_wrapper_JTAConnection_weblogic_jdbc_wrapper_XAConnection_weblogic_jdbcx_base_BaseConnectionWrapper_WLSkel.invoke(Unknown Source)
at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:492)
at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:435)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:147)
at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:430)
at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:35)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)
Thanks,
Amax
|