db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Knut Anders Hatlen (JIRA)" <j...@apache.org>
Subject [jira] Updated: (DERBY-4232) XAResource.setTransactionTimeout() makes XAResource.start() fail with the client driver
Date Fri, 26 Jun 2009 12:31:07 GMT

     [ https://issues.apache.org/jira/browse/DERBY-4232?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Knut Anders Hatlen updated DERBY-4232:
--------------------------------------

       Derby Info: [Regression]  (was: [Regression, Patch Available])
    Fix Version/s: 10.6.0.0
          Summary: XAResource.setTransactionTimeout() makes XAResource.start() fail with the
client driver  (was: Call XAResource.setTransactionTimeout() makes XAResource.start() fail
with the client dirver)

Thanks for testing the patch, Dag. Committed to trunk with revision 788674. I'll leave the
issue open until the fix has been back-ported to 10.5.

> XAResource.setTransactionTimeout() makes XAResource.start() fail with the client driver
> ---------------------------------------------------------------------------------------
>
>                 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
>            Assignee: Knut Anders Hatlen
>             Fix For: 10.6.0.0
>
>         Attachments: d4232-1a.diff, test.diff
>
>
> 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.


Mime
View raw message