[jboss-user] [JCA] - AS400JDBCDataSource - getting started with two transactions
Esther Williams
do-not-reply at jboss.com
Tue May 11 14:14:55 EDT 2010
Esther Williams [http://community.jboss.org/people/esther_williams] created the discussion
"AS400JDBCDataSource - getting started with two transactions"
To view the discussion, visit: http://community.jboss.org/message/542386#542386
--------------------------------------------------------------
Hi,
This is the discussion started by Chris Weddell but hopefully without formatting issues.
*I am trying to get started with XA using JBOSS connected to two datasources (seperate applications) on the same AS400 (DB2) database.*
I have two datasources (see below) and have the following code...
**package
**
**
*
*
com.misys.equation.xa.test;
**import
**
**
*
*
java.sql.Connection;
**import
**
**
*
*
java.sql.Statement;
**import
**
**
*
*
javax.naming.InitialContext;
**import
**
**
*
*
javax.sql.DataSource;
**import
**
**
*
*
javax.transaction.UserTransaction;
**public
**
**
*
*
*class* Esther{
*public* *static* *void* main(String[] args){
UserTransaction utx;
*try*{
InitialContext initialContext =
*new* InitialContext();
utx = (UserTransaction) initialContext.lookup(
"UserTransaction");DataSource dataSource1 = (DataSource) initialContext.lookup(
"EQ-EQ4");DataSource dataSource2 = (DataSource) initialContext.lookup(
"EQ-EQ5");
// begin atrannie
utx.begin();
// ..
Connection connection1 = dataSource1.getConnection();
Statement statement1 = connection1.createStatement();
statement1.execute(
"INSERT INTO KFILEQ4/JVPF (JVHRC, JVHRD) VALUES('E01', 'EEE')");statement1.close();
connection1.close();
Connection connection2 = dataSource2.getConnection();
Statement statement2 = connection2.createStatement();
statement2.execute(
"INSERT INTO KFILEQ4/JVPF (JVHRC, JVHRD) VALUES('E02', 'EEE')");statement2.close();
connection2.close();
// unfortunately the following line fails
utx.commit();
System.
+out+.println(utx.getStatus());}
*catch* (Exception e){
e.printStackTrace();
}
}
}
unfortunately I get the following error when i execute the commit....
*14:53:50,076 INFO [STDOUT] Wed Apr 14 14:53:50:076 BST 2010 as400: XAResource B603382C-XA:RMID#49153 (30120272) : xa_end.*
*14:53:50,076 INFO [STDOUT] Wed Apr 14 14:53:50:076 BST 2010 as400: XAResource B603382C-XA:RMID#49153 (30120272) : xa error class = 0, return code = 0.*
*14:53:50,076 INFO [STDOUT] Wed Apr 14 14:53:50:076 BST 2010 as400: XAResource B603382C-XA:RMID#49153 (30120272) : xa_commit.*
*14:53:50,092 INFO [STDOUT] Wed Apr 14 14:53:50:092 BST 2010 as400: XAResource B603382C-XA:RMID#49153 (30120272) : xa error class = 9,* return code = -6.
14:53:50,092 ERROR [STDERR]
javax.transaction.RollbackException: [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] Could not commit transaction.
14:53:50,092 ERROR [STDERR] at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(
TransactionImple.java:1426)
14:53:50,092 ERROR [STDERR] at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(
BaseTransaction.java:135)
14:53:50,092 ERROR [STDERR] at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(
BaseTransactionManagerDelegate.java:75)
14:53:50,092 ERROR [STDERR] at org.jboss.tm.usertx.client.ServerVMClientUserTransaction.commit(
ServerVMClientUserTransaction.java:162)
14:53:50,092 ERROR [STDERR] at com.misys.equation.ui.services.ServiceDirectory.startXATransaction(
ServiceDirectory.java:1156)
14:53:50,092 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(
Native Method)
14:53:50,092 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
14:53:50,092 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
14:53:50,092 ERROR [STDERR] at java.lang.reflect.Method.invoke(Unknown Source)
14:53:50,092 ERROR [STDERR] at org.apache.axis.providers.java.RPCProvider.invokeMethod(
RPCProvider.java:397)
14:53:50,092 ERROR [STDERR] at org.apache.axis.providers.java.RPCProvider.processMessage(
RPCProvider.java:186)
14:53:50,092 ERROR [STDERR] at org.apache.axis.providers.java.JavaProvider.invoke(
JavaProvider.java:323)
14:53:50,092 ERROR [STDERR] at org.apache.axis.strategies.InvocationStrategy.visit(
InvocationStrategy.java:32)
14:53:50,092 ERROR [STDERR] at org.apache.axis.SimpleChain.doVisiting(
SimpleChain.java:118)
14:53:50,092 ERROR [STDERR] at org.apache.axis.SimpleChain.invoke(
SimpleChain.java:83)
14:53:50,092 ERROR [STDERR] at org.apache.axis.handlers.soap.SOAPService.invoke(
SOAPService.java:454)
14:53:50,092 ERROR [STDERR] at org.apache.axis.server.AxisServer.invoke(
AxisServer.java:281)
14:53:50,092 ERROR [STDERR] at org.apache.axis.transport.http.AxisServlet.doPost(
AxisServlet.java:699)
14:53:50,092 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(
HttpServlet.java:637)
14:53:50,092 ERROR [STDERR] at org.apache.axis.transport.http.AxisServletBase.service(
AxisServletBase.java:327)
14:53:50,092 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(
HttpServlet.java:717)
14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
ApplicationFilterChain.java:290)
14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(
ApplicationFilterChain.java:206)
14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(
ReplyHeaderFilter.java:96)
14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
ApplicationFilterChain.java:235)
14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(
ApplicationFilterChain.java:206)
14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.StandardWrapperValve.invoke(
StandardWrapperValve.java:235)
14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.StandardContextValve.invoke(
StandardContextValve.java:191)
14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(
SecurityAssociationValve.java:190)
14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.security.JaccContextValve.invoke(
JaccContextValve.java:92)
14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(
SecurityContextEstablishmentValve.java:126)
14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(
SecurityContextEstablishmentValve.java:70)
14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.StandardHostValve.invoke(
StandardHostValve.java:127)
14:53:50,092 ERROR [STDERR] at org.apache.catalina.valves.ErrorReportValve.invoke(
ErrorReportValve.java:102)
14:53:50,092 ERROR [STDERR] at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(
CachedConnectionValve.java:158)
14:53:50,092 ERROR [STDERR] at org.apache.catalina.core.StandardEngineValve.invoke(
StandardEngineValve.java:109)
14:53:50,092 ERROR [STDERR] at org.apache.catalina.connector.CoyoteAdapter.service(
CoyoteAdapter.java:330)
14:53:50,092 ERROR [STDERR] at org.apache.coyote.http11.Http11Processor.process(
Http11Processor.java:829)
14:53:50,092 ERROR [STDERR] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(
Http11Protocol.java:601)
14:53:50,092 ERROR [STDERR] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(
JIoEndpoint.java:447)
14:53:50,092 ERROR http://community.jboss.org/message/537429/l537429/STDERR http://community.jboss.org/message/537429#537429/STDERR at java.lang.Thread.run(Unknown Source)
*Now when i run the following code I don't get a problem....*
**package
**
**
*
*
com.misys.equation.xa.test;
**import
**
**
*
*
java.io.Serializable;
**import
**
**
*
*
java.sql.Connection;
**import
**
**
*
*
java.sql.SQLException;
**import
**
**
*
*
java.sql.Statement;
**import
**
**
*
*
java.util.Arrays;
**import
**
**
*
*
java.util.Random;
**import
**
**
*
*
javax.sql.XAConnection;
**import
**
**
*
*
javax.transaction.xa.XAException;
**import
**
**
*
*
javax.transaction.xa.XAResource;
**import
**
**
*
*
javax.transaction.xa.Xid;
**import
**
**
*
*
com.ibm.as400.access.AS400JDBCXADataSource;
**import
**
**
*
*
com.ibm.as400.access.AS400JDBCXAResource;
**import
**
**
*
*
com.misys.equation.common.utilities.Toolbox;
**public
**
**
*
*
*class* Esther2{
// This attribute is used to store cvs version information.
*public* *static* *final* String +_revision+ = "$Id: FileProcessor.java,v 1.6 2009/09/16 16:13:27 esther.williams Exp $";String
user1 = "whatever";String
password1 = "itmaybe";String
system1 = "machineA";String
user2 = "whatever";String
password2 = "itmaybe";String
system2 = "machineA";String
library = "*LIBL";AS400JDBCXADataSource
xaDataSource1 = *null*;XAConnection
xaConnection1 = *null*;XAResource
xaResource1 = *null*;XidImpl
xid = *null*;Connection
connection1 = *null*;Statement
statement1 = *null*;AS400JDBCXADataSource
xaDataSource2 = *null*;XAConnection
xaConnection2 = *null*;XAResource
xaResource2 = *null*;AS400JDBCXAResource
a;
// private XidImpl xid2 = null;
Connection
connection2 = *null*;Statement
statement2 = *null*;
*private* Esther2(){
}
*public* *static* *void* main(String[] args){
System.
+out+.println("Proceeding with test...");Esther2 test =
*new* Esther2();test.test();
}
*private* *void* test(){
*try*{
xaDataSource1 = *new* AS400JDBCXADataSource();
xaDataSource1.setServerName(system1);
xaDataSource1.setUser(user1);
xaDataSource1.setPassword(password1);
xaDataSource1.setLibraries(library);
xaDataSource1.setNaming("system");
xaDataSource1.setTranslateBinary(*false*);
xaDataSource1.setTrace(*true*);
xaDataSource2 = *new* AS400JDBCXADataSource();
xaDataSource2.setServerName(system2);
xaDataSource2.setUser(user2);
xaDataSource2.setPassword(password2);
xaDataSource2.setLibraries(library);
xaDataSource2.setNaming("system");
xaDataSource2.setTranslateBinary(*false*);
xaDataSource2.setTrace(*true*);
xaConnection1 = xaDataSource1.getXAConnection();
xaConnection2 = xaDataSource2.getXAConnection();
xaResource1 = xaConnection1.getXAResource();
xaResource2 = xaConnection2.getXAResource();
xid = *new* XidImpl(*new* *byte*[] { 0x0d }, *new* *byte*[] { 0x0b });
xaResource1.start(xid, XAResource.+TMNOFLAGS+);
// Need to decide whether to join based on whether the resources have the same resource manager
// if the are the same then the prepares, commits and rollbacks should only be executed on
// the first resource
*if* (xaResource1.isSameRM(xaResource2)){
xaResource2.start(xid, XAResource.+TMJOIN+);}
*else*{
xaResource2.start(xid, XAResource.+TMNOFLAGS+);}
// Do some SQL on connection 1
connection1 = xaConnection1.getConnection();
statement1 = connection1.createStatement();
statement1.executeUpdate("INSERT INTO KFILEQ4/JVPF (JVHRC, JVHRD) VALUES('X01', 'X01D')");
// Do some SQL on connection 2
connection2 = xaConnection2.getConnection();
statement2 = connection2.createStatement();
statement2.executeUpdate("INSERT INTO KFILEQ4/JVPF (JVHRC, JVHRD) VALUES('X02', 'X02D')");
// tell the resources that we have successfully finished doing the work,
// need to consider what to do if the SQL had gone wrong!
xaResource1.end(xid, XAResource.+TMSUCCESS+);
xaResource2.end(xid, XAResource.+TMSUCCESS+);
*if* (xaResource1.isSameRM(xaResource2)){
// only need to prepare on the first resource
*int* ret1 = xaResource1.prepare(xid);
// int ret2 = xaResource2.prepare(xid);
// only need to commit on the first resource
xaResource1.commit(xid, *false*);
// xaResource2.commit(xid, false);
}
*else*{
*int* ret1 = xaResource1.prepare(xid);
*int* ret2 = xaResource2.prepare(xid);
xaResource1.commit(xid, *false*);
xaResource2.commit(xid, *false*);}
}
*catch* (XAException e){
e.printStackTrace();
}
*catch* (SQLException e){
e.printStackTrace();
}
*finally*{
*try*{
statement1.close();
statement2.close();
connection1.close();
connection2.close();
xaConnection1.close();
xaConnection2.close();}
*catch* (Exception e2){
// *TODO*: handle exception
}
}
}
*public* *static* *class* XidImpl *implements* Serializable, Xid{
*private* *static* *final* *long* +serialVersionUID+ = 1L;
*private* *static* Random +random+ = *new* Random();
*private* *final* *int* formatId = 876;
*private* *final* *byte*[] globalTransactionId;
*private* *final* *byte*[] branchQualifier;
*private* *transient* String cachedToString;
*private* *transient* *int* cachedHashCode;
*public* XidImpl(){
globalTransactionId = *new* *byte*[10];
+random+.nextBytes(globalTransactionId);
branchQualifier = *new* *byte*[10];
+random+.nextBytes(branchQualifier);}
*public* XidImpl(*byte*[] globalTransactionId, *byte*[] branchQualifier){
*this*.globalTransactionId = globalTransactionId;
*this*.branchQualifier = branchQualifier;}
*public* *int* getFormatId(){
*return* formatId;}
*public* *byte*[] getGlobalTransactionId(){
*return* globalTransactionId;}
*public* *byte*[] getBranchQualifier(){
*return* branchQualifier;}
@Override
*public* *boolean* equals(Object object){
*if* (object == *this*)
*return* *true*;
*if* (object == *null* || object *instanceof* Xid == *false*)
*return* *false*;
Xid other = (Xid) object;
*return* (formatId == other.getFormatId() && Arrays.+equals+(globalTransactionId, other.getGlobalTransactionId()) && Arrays.+equals+(
branchQualifier, other.getBranchQualifier()));}
@Override
*public* *int* hashCode(){
*if* (cachedHashCode == 0){
cachedHashCode = formatId;
*for* (*int* j = 0; j < globalTransactionId.length; ++j)
cachedHashCode += globalTransactionId[j];}
*return* cachedHashCode;}
@Override
*public* String toString(){
*if* (cachedToString == *null*){
StringBuffer buffer =
*new* StringBuffer();buffer.append(
"XidImpl[FormatId=").append(getFormatId());buffer.append(
" GlobalId=x'").append(Toolbox.+cvtBytesToHexString+(getGlobalTransactionId()));buffer.append(
"' BranchQual=x'").append(Toolbox.+cvtBytesToHexString+(getBranchQualifier()));buffer.append(
"']");
cachedToString = buffer.toString();}
*return* cachedToString;}
}
}
*Note there is an extra "end" for the secound resource and a "prepare" that i don't see logged in the jboss example.*
*Any ideas?*
<?xml version="1.0" encoding="UTF-8" ?>
*-* <datasources>
*-* <xa-datasource>
** <jndi-name>*EQ-EQ5*</jndi-name>
** <use-java-context>*false*</use-java-context>
** <xa-datasource-class>*com.ibm.as400.access.AS400JDBCXADataSource*</xa-datasource-class>
** <xa-datasource-property name="*User*">*WHATEVER*</xa-datasource-property>
** <xa-datasource-property name="*Password*">*ITMAYBE*</xa-datasource-property>
** <xa-datasource-property name="*ServerName*">*MACHINEA*</xa-datasource-property>
** <xa-datasource-property name="*Libraries*">**LIBL*</xa-datasource-property>
** <xa-datasource-property name="*Naming*">*system*</xa-datasource-property>
** <track-connection-by-tx>*true*</track-connection-by-tx>
** <prepared-statement-cache-size>*100*</prepared-statement-cache-size>
** <isSameRM-override-value>*false*</isSameRM-override-value>
** <no-tx-separate-pools />
** <new-connection-sql />
** <check-valid-connection-sql />
*-* <!-- pooling parameters
** -->
** <min-pool-size>*1*</min-pool-size>
** <max-pool-size>*50*</max-pool-size>
** <blocking-timeout-millis>*50000*</blocking-timeout-millis>
** <idle-timeout-minutes>*5*</idle-timeout-minutes>
*-* <metadata>
** <type-mapping>*DB2/400*</type-mapping>
** </metadata>
** </xa-datasource>
** </datasources>
** <?xml version="1.0" encoding="UTF-8" ?>
*-* <datasources>
*-* <xa-datasource>
** <jndi-name>*EQ-EQ4*</jndi-name>
** <use-java-context>*false*</use-java-context>
** <xa-datasource-class>*com.ibm.as400.access.AS400JDBCXADataSource*</xa-datasource-class>
** <xa-datasource-property name="*User*">*WHATEVER*</xa-datasource-property>
** <xa-datasource-property name="*Password*">*ITMAYBE*</xa-datasource-property>
** <xa-datasource-property name="*ServerName*">*MACHINEA*</xa-datasource-property>
** <xa-datasource-property name="*Libraries*">**LIBL*</xa-datasource-property>
** <xa-datasource-property name="*Naming*">*system*</xa-datasource-property>
** <track-connection-by-tx>*true*</track-connection-by-tx>
** <prepared-statement-cache-size>*100*</prepared-statement-cache-size>
** <isSameRM-override-value>*false*</isSameRM-override-value>
** <no-tx-separate-pools />
** <new-connection-sql />
** <check-valid-connection-sql />
*-* <!-- pooling parameters
** -->
** <min-pool-size>*1*</min-pool-size>
** <max-pool-size>*50*</max-pool-size>
** <blocking-timeout-millis>*50000*</blocking-timeout-millis>
** <idle-timeout-minutes>*5*</idle-timeout-minutes>
*-* <metadata>
** <type-mapping>*DB2/400*</type-mapping>
** </metadata>
** </xa-datasource>
** </datasources>
--------------------------------------------------------------
Reply to this message by going to Community
[http://community.jboss.org/message/542386#542386]
Start a new discussion in JCA at Community
[http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2098]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20100511/60ef6f79/attachment-0001.html
More information about the jboss-user
mailing list