You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Knut Anders Hatlen (JIRA)" <ji...@apache.org> on 2009/05/15 09:32:45 UTC

[jira] Commented: (DERBY-4232) Call XAResource.setTransactionTimeout() makes XAResource.start() fail with the client dirver

    [ https://issues.apache.org/jira/browse/DERBY-4232?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12709744#action_12709744 ] 

Knut Anders Hatlen commented on DERBY-4232:
-------------------------------------------

I haven't looked at the posted code yet, but I just thought I'd mention that setTransactionTimeout() was a no-op in Derby 10.2 and earlier, which probably explains why reverting to 10.2.2.0 has the same effect as commenting out the call.

> Call XAResource.setTransactionTimeout() makes XAResource.start() fail with the client dirver
> --------------------------------------------------------------------------------------------
>
>                 Key: DERBY-4232
>                 URL: https://issues.apache.org/jira/browse/DERBY-4232
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.4.2.0
>            Reporter: Simon Meng
>
> Got below error message when running an XA prolgram with derby. 
> org.apache.derby.client.am.XaException: XAER_PROTO : Error executing a XAResource.start(), server returned XAER_PROTO.
> 	at org.apache.derby.client.net.NetXAResource.throwXAException(Unknown Source)
> 	at org.apache.derby.client.net.NetXAResource.start(Unknown Source)
> 	at TestDerbyXA.process(TestDerbyXA.java:186)
> 	at TestDerbyXA.main(TestDerbyXA.java:43)
> Caused by: org.apache.derby.client.am.SqlException: Error executing a XAResource.start(), server returned XAER_PROTO.
> 	at org.apache.derby.client.net.NetXAResource.xaRetValErrorAccumSQL(Unknown Source)
> 	... 3 more
> Below is the example program I used. Note: The program will succeed if comment out line 147 - setTransactionTimeout. Does that means call XAResource.setTransactionTimeout() caused the failure?
> I use Apache Derby Network Server - 10.4.2.0 - (689064). The same program works fine with another version Apache Derby Network Server - 10.2.2.0 - (485682). It looks like there is a regression between the two versions.
> import java.sql.Connection;
> import java.sql.PreparedStatement;
> import java.sql.SQLException;
> import java.sql.Statement;
> import javax.sql.XAConnection;
> import javax.transaction.xa.XAException;
> import javax.transaction.xa.XAResource;
> import javax.transaction.xa.Xid;
> import org.apache.derby.jdbc.ClientXADataSource;
> public class TestDerbyXA {
> 	ClientXADataSource xaDSLocal = null;
> 	ClientXADataSource xaDSRemote = null;
> 	public TestDerbyXA() {
> 		// Create two XA data sources.
> 		xaDSLocal = new ClientXADataSource();
> 		xaDSLocal.setServerName("localhost");
> 		xaDSLocal.setPortNumber(1527);
> 		xaDSLocal.setDatabaseName("testdb");
> 		xaDSLocal.setUser("app");
> 		xaDSLocal.setPassword("derby");
> 		xaDSRemote = new ClientXADataSource();
> 		xaDSRemote.setServerName("localhost");
> 		xaDSRemote.setPortNumber(1527);
> 		xaDSRemote.setDatabaseName("testdb");
> 		xaDSRemote.setUser("app");
> 		xaDSRemote.setPassword("derby");
> 		// xaDSRemote = xaDSLocal;
> 	}
> 	public static void main(String[] args) throws Exception {
> 		TestDerbyXA testObj = new TestDerbyXA();
> 		testObj.dropTable("tablea");
> 		testObj.createTable("CREATE TABLE tablea (col1 INT, col2 VARCHAR(32))");
> 		testObj.dropTable("tableb");
> 		testObj.createTable("CREATE TABLE tableb (col1 INT, col2 VARCHAR(32))");
> 		testObj.process();
> 	}
> 	public void dropTable(String tableName) throws Exception {
> 		Connection conn = null;
> 		Statement stmt = null;
> 		try {
> 			conn = xaDSLocal.getConnection();
> 			stmt = conn.createStatement();
> 			stmt.executeUpdate("DROP TABLE " + tableName);
> 			System.out.println("Drop table " + tableName + " succeed.");
> 		} catch (SQLException sqle) {
> 			System.out.println("Drop table " + tableName + " failed.");
> 			sqle.printStackTrace();
> 		} finally {
> 			// ============ Close JDBC objects, including the connection =======
> 			if (stmt != null) {
> 				try {
> 					stmt.close();
> 					stmt = null;
> 				} catch (SQLException e) {
> 				}
> 			}
> 			if (conn != null) {
> 				try {
> 					conn.close();
> 					conn = null;
> 				} catch (SQLException e) {
> 				}
> 			}
> 		}
> 	}
> 	public void createTable(String DDL) throws Exception {
> 		Connection conn = null;
> 		Statement stmt = null;
> 		try {
> 			conn = xaDSLocal.getConnection();
> 			stmt = conn.createStatement();
> 			stmt.executeUpdate(DDL);
> 			System.out.println(DDL + " succeed.");
> 		} catch (SQLException sqle) {
> 			System.out.println(DDL + " failed.");
> 			sqle.printStackTrace();
> 		} finally {
> 			// ============ Close JDBC objects, including the connection =======
> 			if (stmt != null) {
> 				try {
> 					stmt.close();
> 					stmt = null;
> 				} catch (SQLException e) {
> 				}
> 			}
> 			if (conn != null) {
> 				try {
> 					conn.close();
> 					conn = null;
> 				} catch (SQLException e) {
> 				}
> 			}
> 		}
> 	}
> 	public void process() throws Exception {
> 		Connection connLocal = null;
> 		Connection connRemote = null;
> 		int rows = 0;
> 		PreparedStatement pstmtLocal = null;
> 		PreparedStatement pstmtRemote = null;
> 		XAConnection xaConnLocal = null;
> 		XAConnection xaConnRemote = null;
> 		XAResource xarLocal = null;
> 		XAResource xarRemote = null;
> 		Xid xidLocal = null;
> 		Xid xidRemote = null;
> 		try {
> 			xaConnLocal = xaDSLocal.getXAConnection();
> 			xaConnRemote = xaDSRemote.getXAConnection();
> 			connLocal = xaConnLocal.getConnection();
> 			connRemote = xaConnRemote.getConnection();
> 			xarLocal = xaConnLocal.getXAResource();
> 			xarRemote = xaConnRemote.getXAResource();
> 			// Create the Xids
> 			// Create the global ID
> 			byte[] globalTransactionId1 = new byte[64];
> 			globalTransactionId1[0] = (byte) 1;
> 			byte[] globalTransactionId2 = new byte[64];
> 			globalTransactionId2[0] = (byte) 2;
> 			// Create the local branch ID
> 			byte[] branchQualifierLocal = new byte[64];
> 			branchQualifierLocal[0] = (byte) 1;
> 			xidLocal = new XidImpl(globalTransactionId1, branchQualifierLocal, 0x1234);
> 			// Create the remote branch ID
> 			byte[] branchQualifierRemote = new byte[64];
> 			branchQualifierRemote[0] = (byte) 2;
> 			xidRemote = new XidImpl(globalTransactionId2, branchQualifierRemote, 0x1234);
> 			// Database operations on the local branch, suspend local branch
> 			xarLocal.setTransactionTimeout(500);  //!!! The failure will disappear if comment out this line.
> 			connLocal.setAutoCommit(false);
> 			xarLocal.start(xidLocal, XAResource.TMNOFLAGS);
> 			pstmtLocal = connLocal
> 					.prepareStatement("INSERT INTO tablea (col1, col2) VALUES (?, ?)");
> 			pstmtLocal.setInt(1, 1);
> 			pstmtLocal.setString(2, "insert first rec to tablea");
> 			rows = pstmtLocal.executeUpdate();
> 			System.out.println(rows + " rows inserted to tablea");
> 			pstmtLocal.close();
> 			pstmtLocal = null;
> 			xarLocal.end(xidLocal, XAResource.TMSUCCESS);
> 			connLocal.setAutoCommit(true);
> 			// Database operation on the remote branch, commit remote branch
> 			xarRemote.setTransactionTimeout(500);
> 			connRemote.setAutoCommit(false);
> 			xarRemote.start(xidRemote, XAResource.TMNOFLAGS);
> 			pstmtRemote = connRemote
> 					.prepareStatement("INSERT INTO tableb (col1, col2) VALUES (?, ?)");
> 			pstmtRemote.setInt(1, 2);
> 			pstmtRemote.setString(2, "insert second rec to tableb");
> 			rows = pstmtRemote.executeUpdate();
> 			System.out.println(rows + " rows inserted to tableb");
> 			pstmtRemote.close();
> 			pstmtRemote = null;
> 			xarRemote.end(xidRemote, XAResource.TMSUCCESS);
> 			connRemote.setAutoCommit(true);
> 			System.out.println("commit remote branch");
> 			xarRemote.commit(xidRemote, true);
> 			// Resume the local branch and do some database operation, commit local branch
> 			xarLocal.setTransactionTimeout(500);
> 			connLocal.setAutoCommit(false);
> 			xarLocal.start(xidLocal, XAResource.TMJOIN);
> 			pstmtLocal = connLocal
> 					.prepareStatement("INSERT INTO tablea (col1, col2) VALUES (?, ?)");
> 			pstmtLocal.setInt(1, 3);
> 			pstmtLocal.setString(2, "insert third rec to tablea");
> 			rows = pstmtLocal.executeUpdate();
> 			System.out.println(rows + " rows inserted to tablea");
> 			pstmtLocal.close();
> 			pstmtLocal = null;
> 			xarLocal.end(xidLocal, XAResource.TMSUCCESS);
> 			connLocal.setAutoCommit(true);
> 			System.out.println("commit local branch");
> 			xarLocal.commit(xidLocal, true);
> 			// Close the resources
> 			connLocal.close();
> 			connLocal = null;
> 			connRemote.close();
> 			connRemote = null;
> 			xaConnLocal.close();
> 			xaConnLocal = null;
> 			xaConnRemote.close();
> 			xaConnRemote = null;
> 		} catch (SQLException e) {
> 			System.err.println("SQL Error: " + e.getMessage());
> 			e.printStackTrace();
> 		} catch (XAException e) {
> 			System.err.println("XA Error: " + e.getMessage());
> 			e.printStackTrace();
> 		} finally {
> 			if (pstmtLocal != null)
> 				try {
> 					pstmtLocal.close();
> 					pstmtLocal = null;
> 				} catch (SQLException ignore) {
> 				}
> 			if (pstmtRemote != null)
> 				try {
> 					pstmtRemote.close();
> 					pstmtRemote = null;
> 				} catch (SQLException ignore) {
> 				}
> 			if (connLocal != null)
> 				try {
> 					connLocal.close();
> 					connLocal = null;
> 				} catch (SQLException ignore) {
> 				}
> 			if (connRemote != null)
> 				try {
> 					connRemote.close();
> 					connRemote = null;
> 				} catch (SQLException ignore) {
> 				}
> 			if (xaConnLocal != null)
> 				try {
> 					xaConnLocal.close();
> 					xaConnLocal = null;
> 				} catch (SQLException ignore) {
> 				}
> 			if (xaConnRemote != null)
> 				try {
> 					xaConnRemote.close();
> 					xaConnRemote = null;
> 				} catch (SQLException ignore) {
> 				}
> 		}
> 	}
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.