List of usage examples for javax.sql XAConnection getXAResource
javax.transaction.xa.XAResource getXAResource() throws SQLException;
From source file:org.bytesoft.bytejta.supports.serialize.XAResourceDeserializerImpl.java
private XAResource deserializeResource(String identifier, Object bean) throws Exception { if (DataSourceHolder.class.isInstance(bean)) { DataSourceHolder holder = (DataSourceHolder) bean; RecoveredResource xares = new RecoveredResource(); xares.setDataSource(holder.getDataSource()); return xares; } else if (javax.sql.DataSource.class.isInstance(bean)) { javax.sql.DataSource dataSource = (javax.sql.DataSource) bean; RecoveredResource xares = new RecoveredResource(); xares.setDataSource(dataSource); return xares; } else if (XADataSource.class.isInstance(bean)) { XADataSource xaDataSource = (XADataSource) bean; XAConnection xaConnection = null; try {//from ww w . j a v a 2 s . c o m xaConnection = xaDataSource.getXAConnection(); return xaConnection.getXAResource(); } finally { this.closeQuietly(xaConnection); } } else if (XAConnectionFactory.class.isInstance(bean)) { XAConnectionFactory connectionFactory = (XAConnectionFactory) bean; javax.jms.XAConnection xaConnection = null; XASession xaSession = null; try { xaConnection = connectionFactory.createXAConnection(); xaSession = xaConnection.createXASession(); return xaSession.getXAResource(); } finally { this.closeQuietly(xaSession); this.closeQuietly(xaConnection); } } else if (ManagedConnectionFactory.class.isInstance(bean)) { ManagedConnectionFactory connectionFactory = (ManagedConnectionFactory) bean; ManagedConnection managedConnection = null; try { managedConnection = connectionFactory.createManagedConnection(null, null); return managedConnection.getXAResource(); } finally { this.closeQuietly(managedConnection); } } else { return null; } }
From source file:org.enhydra.jdbc.pool.StandardXAPoolDataSource.java
/** * Invoked when the application calls close() * on its representation of the connection *//* www . j a v a 2s . co m*/ public void connectionClosed(ConnectionEvent event) { Object obj = event.getSource(); log.debug("StandardXAPoolDataSource:connectionClosed"); XAConnection xac = (XAConnection) obj; // cast it into an xaConnection Transaction tx = null; try { if (transactionManager == null) { TransactionManager tm = ((StandardXADataSource) xads).getTransactionManager(); if (tm == null) { throw new NullPointerException("TM is null"); } else // here we use tm instead to setup transactionManager = tm // if the current transactionManager property is null, it stays // there, and we continue to use the TM from the XADataSource tx = tm.getTransaction(); } else { tx = transactionManager.getTransaction(); } log.debug("StandardXAPoolDataSource:connectionClosed get a transaction"); } catch (NullPointerException n) { // current is null: we are not in EJBServer. log.error("StandardXAPoolDataSource:connectionClosed should not be used outside an EJBServer"); } catch (SystemException e) { log.error("StandardXAPoolDataSource:connectionClosed getTransaction failed:" + e); } // delist Resource if in transaction // We must keep the connection till commit or rollback if ((tx != null) && (((StandardXAConnection) xac).connectionHandle.isReallyUsed)) { try { tx.delistResource(xac.getXAResource(), XAResource.TMSUCCESS); // delist the xaResource log.debug("StandardXAPoolDataSource:connectionClosed the resourse is delisted"); } catch (Exception e) { log.error("StandardXAPoolDataSource:connectionClosed Exception in connectionClosed:" + e); } } log.debug("StandardXAPoolDataSource:connectionClosed checkIn an object to the pool"); pool.checkIn(obj); // return the connection to the pool }
From source file:org.apache.hadoop.hive.metastore.MyXid.java
public boolean createDatabaseByDistributeTransaction(Database db) throws MetaException { if (db.getMetastore() == null) { String slaveURL = getSegmentUrlByDbNameHashCode(db.getName()); db.setMetastore(slaveURL);/* w w w. ja va 2s. c o m*/ } int hashcode = getHashForDb(db.getName()); db.setName(db.getName().toLowerCase()); boolean success = false; Connection masterConn = null; Connection slaveConn = null; PGXADataSource masterDS = null; PGXADataSource slaveDS = null; masterDS = getXADataSource(globalDbUrl, user, passwd); slaveDS = getXADataSource(db.getMetastore(), user, passwd); XAConnection masterDSXaConn = null; XAConnection slaveDSXaConn = null; XAResource masterSaRes = null; XAResource slaveSaRes = null; int formatID = genFormatID(); Xid masterXid = new MyXid(formatID, new byte[] { 0x01 }, new byte[] { 0x02 }); Xid slaveXid = new MyXid(formatID, new byte[] { 0x11 }, new byte[] { 0x12 }); PreparedStatement masterStmt = null; PreparedStatement slaveStmt = null; try { masterDSXaConn = masterDS.getXAConnection(); slaveDSXaConn = slaveDS.getXAConnection(); masterSaRes = masterDSXaConn.getXAResource(); slaveSaRes = slaveDSXaConn.getXAResource(); masterConn = masterDSXaConn.getConnection(); slaveConn = slaveDSXaConn.getConnection(); masterStmt = masterConn .prepareStatement("insert into router(db_name, seg_addr,hashcode, owner) values(?,?,?,?)"); slaveStmt = slaveConn .prepareStatement("insert into dbs(name, hdfs_schema, description, owner) VALUES(?,?,?,?)"); try { masterSaRes.start(masterXid, XAResource.TMNOFLAGS); masterStmt.setString(1, db.getName()); masterStmt.setString(2, db.getMetastore()); masterStmt.setInt(3, hashcode); masterStmt.setString(4, db.getOwner()); masterStmt.executeUpdate(); masterSaRes.end(masterXid, XAResource.TMSUCCESS); slaveSaRes.start(slaveXid, XAResource.TMNOFLAGS); slaveStmt.setString(1, db.getName()); slaveStmt.setString(2, db.getHdfsscheme()); slaveStmt.setString(3, db.getDescription()); slaveStmt.setString(4, db.getOwner()); slaveStmt.executeUpdate(); slaveSaRes.end(slaveXid, XAResource.TMSUCCESS); int masterRet = masterSaRes.prepare(masterXid); int slaveRet = slaveSaRes.prepare(slaveXid); Warehouse wh = new Warehouse(hiveConf); Path databasePath = wh.getDefaultDatabasePath(db.getName(), db.getHdfsscheme()); if (masterRet == XAResource.XA_OK && slaveRet == XAResource.XA_OK && wh.mkdirs(databasePath)) { masterSaRes.commit(masterXid, false); slaveSaRes.commit(slaveXid, false); success = true; } } catch (XAException e) { LOG.error("XAException create database error, db=" + db.getName() + ", msg=" + e.getMessage()); e.printStackTrace(); throw new MetaException(e.getMessage()); } } catch (SQLException e) { LOG.error("SQLException create database error, db=" + db.getName() + ", msg=" + e.getMessage()); e.printStackTrace(); throw new MetaException(e.getMessage()); } finally { if (!success) { try { masterSaRes.rollback(masterXid); } catch (Exception x) { } try { slaveSaRes.rollback(slaveXid); } catch (Exception x) { } } closeStatement(masterStmt); closeStatement(slaveStmt); closeConnection(masterConn); closeConnection(slaveConn); closeXAConnection(masterDSXaConn); closeXAConnection(slaveDSXaConn); } return success; }
From source file:org.apache.hadoop.hive.metastore.MyXid.java
public boolean dropDatabaseByDistributeTransaction(String name) throws MetaException { boolean success = false; name = name.toLowerCase();/* ww w. ja v a2 s . c o m*/ Connection masterConn = null; Connection slaveConn = null; PGXADataSource masterDS = null; PGXADataSource slaveDS = null; masterDS = getXADataSource(globalDbUrl, user, passwd); String slaveURL = getSegmentDBURL(name); slaveDS = getXADataSource(slaveURL, user, passwd); XAConnection masterDSXaConn = null; XAConnection slaveDSXaConn = null; int formatID = genFormatID(); Xid masterXid = new MyXid(formatID, new byte[] { 0x01 }, new byte[] { 0x02 }); Xid slaveXid = new MyXid(formatID, new byte[] { 0x11 }, new byte[] { 0x12 }); XAResource masterSaRes = null; XAResource slaveSaRes = null; Statement masterStmt = null; Statement slaveStmt = null; try { masterDSXaConn = masterDS.getXAConnection(); slaveDSXaConn = slaveDS.getXAConnection(); masterSaRes = masterDSXaConn.getXAResource(); slaveSaRes = slaveDSXaConn.getXAResource(); masterConn = masterDSXaConn.getConnection(); slaveConn = slaveDSXaConn.getConnection(); masterStmt = masterConn.createStatement(); slaveStmt = slaveConn.createStatement(); try { masterSaRes.start(masterXid, XAResource.TMNOFLAGS); masterStmt.executeUpdate("delete from router where db_name='" + name + "'"); masterStmt.executeUpdate("delete from dbpriv where db_name='" + name + "'"); masterStmt.executeUpdate("delete from tblpriv where db_name='" + name + "'"); masterSaRes.end(masterXid, XAResource.TMSUCCESS); slaveSaRes.start(slaveXid, XAResource.TMNOFLAGS); slaveStmt.executeUpdate("delete from dbs where name='" + name + "'"); slaveSaRes.end(slaveXid, XAResource.TMSUCCESS); int masterRet = masterSaRes.prepare(masterXid); int slaveRet = slaveSaRes.prepare(slaveXid); Warehouse wh = new Warehouse(hiveConf); if (masterRet == XAResource.XA_OK && slaveRet == XAResource.XA_OK && wh.deleteDir(wh.getDefaultDatabasePath(name), true)) { masterSaRes.commit(masterXid, false); slaveSaRes.commit(slaveXid, false); success = true; } } catch (XAException e) { LOG.error("drop database error, db=" + name + ", msg=" + e.getMessage()); throw new MetaException(e.getMessage()); } } catch (Exception e) { LOG.error("create database error, db=" + name + ", msg=" + e.getMessage()); throw new MetaException(e.getMessage()); } finally { if (!success) { try { masterSaRes.rollback(masterXid); } catch (Exception x) { } try { slaveSaRes.rollback(slaveXid); } catch (Exception x) { } } closeStatement(masterStmt); closeStatement(slaveStmt); closeConnection(masterConn); closeConnection(slaveConn); closeXAConnection(masterDSXaConn); closeXAConnection(slaveDSXaConn); } if (success) { Statement stmt = null; Connection con = null; try { con = getGlobalConnection(); stmt = con.createStatement(); String sql = "delete from dbsensitivity where db_name='" + name + "'"; stmt.executeUpdate(sql); sql = "delete from tblsensitivity where db_name='" + name + "'"; stmt.executeUpdate(sql); } catch (Exception e1) { LOG.error("update tblsenstivity table error, db=" + name + ", msg=" + e1.getMessage()); } finally { closeStatement(stmt); closeConnection(con); } } return success; }
From source file:org.apache.hadoop.hive.metastore.MyXid.java
public void renameTableByDistributeTrans(String dbName, String tblName, String modifyUser, String newName) throws InvalidOperationException, MetaException { dbName = dbName.toLowerCase();/*w ww . j av a2 s. c om*/ tblName = tblName.toLowerCase(); modifyUser = modifyUser.toLowerCase(); newName = newName.toLowerCase(); boolean success = false; Connection masterConn = null; Connection slaveConn = null; PGXADataSource masterDS = null; PGXADataSource slaveDS = null; String slaveUrl = getSegmentDBURL(dbName); masterDS = getXADataSource(globalDbUrl, user, passwd); slaveDS = getXADataSource(slaveUrl, user, passwd); XAConnection masterDSXaConn = null; XAConnection slaveDSXaConn = null; XAResource masterSaRes = null; XAResource slaveSaRes = null; int formatID = genFormatID(); Xid masterXid = new MyXid(formatID, new byte[] { 0x01 }, new byte[] { 0x02 }); Xid slaveXid = new MyXid(formatID, new byte[] { 0x11 }, new byte[] { 0x12 }); Statement masterStmt = null; Statement slaveStmt = null; boolean isMoved = false; Path newPath = null; Path oldPath = null; FileSystem oldFs = null; FileSystem newFs = null; Warehouse wh = null; String newLocation = null; try { masterDSXaConn = masterDS.getXAConnection(); slaveDSXaConn = slaveDS.getXAConnection(); masterSaRes = masterDSXaConn.getXAResource(); slaveSaRes = slaveDSXaConn.getXAResource(); masterConn = masterDSXaConn.getConnection(); slaveConn = slaveDSXaConn.getConnection(); masterStmt = masterConn.createStatement(); slaveStmt = slaveConn.createStatement(); try { masterSaRes.start(masterXid, XAResource.TMNOFLAGS); String sql = "update tblpriv set tbl_name='" + newName + "' where db_name='" + dbName + "' and tbl_name='" + tblName + "'"; masterStmt.executeUpdate(sql); masterSaRes.end(masterXid, XAResource.TMSUCCESS); slaveSaRes.start(slaveXid, XAResource.TMNOFLAGS); sql = "select tbl_id, tbl_type, tbl_location, serde_lib from tbls " + "where db_name='" + dbName + "' and tbl_name='" + tblName + "'"; boolean isTblFind = false; long tblID = 0; ResultSet tblSet = slaveStmt.executeQuery(sql); String tblType = null; String oldLocation = null; String serdeLib = null; while (tblSet.next()) { isTblFind = true; tblID = tblSet.getLong(1); tblType = tblSet.getString(2); oldLocation = tblSet.getString(3); serdeLib = tblSet.getString(4); break; } tblSet.close(); if (!isTblFind) { throw new MetaException("can not find table " + dbName + ":" + tblName); } if (!tblType.equalsIgnoreCase("MANAGED_TABLE")) { throw new MetaException("only manage table can rename "); } if (serdeLib.equals(ProtobufSerDe.class.getName())) { throw new MetaException( "Renaming table is not supported for protobuf table. SerDe may be incompatible"); } Map<String, String> tblParamMap = new HashMap<String, String>(); sql = "select param_key, param_value from table_params where tbl_id=" + tblID + " and param_type='TBL'"; ResultSet paramSet = slaveStmt.executeQuery(sql); while (paramSet.next()) { tblParamMap.put(paramSet.getString(1), paramSet.getString(2)); } paramSet.close(); boolean containTime = false; boolean contailUser = false; if (tblParamMap.containsKey("last_modified_time")) containTime = true; if (tblParamMap.containsKey("last_modified_by")) contailUser = true; if (containTime && contailUser) { slaveStmt.executeUpdate("update table_params set param_value='" + String.valueOf(System.currentTimeMillis() / 1000) + "' where tbl_id=" + tblID + " and param_type='TBL' and param_key='last_modified_time'"); slaveStmt.executeUpdate("update table_params set param_value='" + modifyUser + "' where tbl_id=" + tblID + " and param_type='TBL' and param_key='last_modified_by'"); } else if (!containTime && !contailUser) { slaveStmt.executeUpdate( "insert into table_params(tbl_id, param_type, param_key, param_value) values(" + tblID + ", 'TBL', 'last_modified_time', '" + String.valueOf(System.currentTimeMillis() / 1000) + "')"); slaveStmt.executeUpdate( "insert into table_params(tbl_id, param_type, param_key, param_value) values(" + tblID + ", 'TBL', 'last_modified_by', '" + modifyUser + "')"); } else if (containTime && !contailUser) { slaveStmt.executeUpdate("update table_params set param_value='" + String.valueOf(System.currentTimeMillis() / 1000) + "' where tbl_id=" + tblID + " and param_type='TBL' and param_key='last_modified_time'"); slaveStmt.executeUpdate( "insert into table_params(tbl_id, param_type, param_key, param_value) values(" + tblID + ", 'TBL', 'last_modified_by', '" + modifyUser + "')"); } else { slaveStmt.executeUpdate( "insert into table_params(tbl_id, param_type, param_key, param_value) values(" + tblID + ", 'TBL', 'last_modified_time', '" + String.valueOf(System.currentTimeMillis() / 1000) + "')"); slaveStmt.executeUpdate("update table_params set param_value='" + modifyUser + "' where tbl_id=" + tblID + " and param_type='TBL' and param_key='last_modified_by'"); } wh = new Warehouse(hiveConf); // newLocation = wh.getDefaultTablePath(dbName, newName).toString(); newLocation = oldLocation.substring(0, oldLocation.length() - tblName.length()) + newName; sql = "update tbls set tbl_name='" + newName + "', tbl_location='" + newLocation + "'" + " where tbl_id=" + tblID; slaveStmt.executeUpdate(sql); slaveSaRes.end(slaveXid, XAResource.TMSUCCESS); int masterRet = masterSaRes.prepare(masterXid); int slaveRet = slaveSaRes.prepare(slaveXid); oldPath = new Path(oldLocation); oldFs = wh.getFs(oldPath); newPath = new Path(newLocation); newFs = wh.getFs(newPath); if (oldFs != newFs) { throw new InvalidOperationException( "table new location " + oldFs + " is on a different file system than the old location " + newFs + ". This operation is not supported"); } try { oldFs.exists(oldPath); if (newFs.exists(newPath)) { throw new InvalidOperationException("New location for this table " + dbName + "." + tblName + " already exists : " + newPath); } } catch (IOException e) { throw new InvalidOperationException( "Unable to access new location " + newPath + " for table " + dbName + "." + tblName); } try { if (oldFs.exists(oldPath)) { oldFs.rename(oldPath, newPath); } isMoved = true; } catch (IOException e) { throw new InvalidOperationException( "Unable to access old location " + oldPath + " for table " + dbName + "." + tblName); } if (masterRet == XAResource.XA_OK && slaveRet == XAResource.XA_OK) { masterSaRes.commit(masterXid, false); slaveSaRes.commit(slaveXid, false); success = true; } } catch (XAException e) { LOG.error("XAException rename table error, db=" + dbName + ", tbl=" + tblName + ", new tbl=" + newName + ", msg=" + e.getMessage()); e.printStackTrace(); throw new MetaException(e.getMessage()); } } catch (SQLException e) { LOG.error("XAException rename table error, db=" + dbName + ", tbl=" + tblName + ", new tbl=" + newName + ", msg=" + e.getMessage()); e.printStackTrace(); throw new MetaException(e.getMessage()); } finally { if (!success) { try { masterSaRes.rollback(masterXid); } catch (Exception x) { } try { slaveSaRes.rollback(slaveXid); } catch (Exception x) { } if (isMoved) { try { if (oldFs.exists(oldPath)) { oldFs.rename(newPath, oldPath); } } catch (IOException e) { throw new InvalidOperationException("Unable to access old location " + oldPath + " for table " + dbName + "." + tblName); } } } closeStatement(masterStmt); closeStatement(slaveStmt); closeConnection(masterConn); closeConnection(slaveConn); closeXAConnection(masterDSXaConn); closeXAConnection(slaveDSXaConn); } if (success) { Statement stmt = null; Connection con = null; try { con = getGlobalConnection(); stmt = con.createStatement(); String sql = "update tblsensitivity set tbl_name='" + newName + "' where db_name='" + dbName + "' and tbl_name='" + tblName + "'"; stmt.executeUpdate(sql); } catch (Exception e1) { LOG.error("update tblsenstivity table error, db=" + dbName + ", tbl=" + tblName + ", msg=" + e1.getMessage()); } finally { closeStatement(stmt); closeConnection(con); } } }
From source file:org.apache.hadoop.hive.metastore.MyXid.java
public boolean dropUserByDistributeTransaction(String userName) throws NoSuchObjectException, MetaException { boolean success = false; Connection masterConn = null; PGXADataSource masterDS = null;/*from w ww.ja va 2 s. c o m*/ masterDS = getXADataSource(globalDbUrl, user, passwd); Set<String> slaveURLSet = getAllSegments(); int size = slaveURLSet.size(); PGXADataSource[] slaveDSArray = new PGXADataSource[size]; XAConnection[] slaveDSXaConnArray = new XAConnection[size]; XAResource[] slaveSaResArray = new XAResource[size]; Connection[] slaveConArray = new Connection[size]; Statement[] slaveStmtArray = new Statement[size]; Xid[] slaveXidArray = new Xid[size]; int index = 0; for (String slaveURL : slaveURLSet) { slaveDSArray[index] = getXADataSource(slaveURL, user, passwd); index++; } XAConnection masterDSXaConn = null; int formatID = genFormatID(); try { masterDSXaConn = masterDS.getXAConnection(); for (int i = 0; i < size; i++) { slaveDSXaConnArray[i] = slaveDSArray[i].getXAConnection(); slaveSaResArray[i] = slaveDSXaConnArray[i].getXAResource(); slaveConArray[i] = slaveDSXaConnArray[i].getConnection(); slaveStmtArray[i] = slaveConArray[i].createStatement(); byte id1 = (byte) ((i + 2) * 2); byte id2 = (byte) (id1 + 1); slaveXidArray[i] = new MyXid(formatID, new byte[] { id1 }, new byte[] { id2 }); } XAResource masterSaRes = masterDSXaConn.getXAResource(); masterConn = masterDSXaConn.getConnection(); Statement masterStmt = masterConn.createStatement(); Xid masterXid = new MyXid(formatID, new byte[] { 0x01 }, new byte[] { 0x02 }); try { masterSaRes.start(masterXid, XAResource.TMNOFLAGS); masterStmt.executeUpdate("delete from tdwuser where user_name='" + userName.toLowerCase() + "'"); masterSaRes.end(masterXid, XAResource.TMSUCCESS); for (int i = 0; i < size; i++) { slaveSaResArray[i].start(slaveXidArray[i], XAResource.TMNOFLAGS); slaveStmtArray[i] .executeUpdate("delete from dbpriv where user_name='" + userName.toLowerCase() + "'"); slaveStmtArray[i] .executeUpdate("delete from tblpriv where user_name='" + userName.toLowerCase() + "'"); slaveSaResArray[i].end(slaveXidArray[i], XAResource.TMSUCCESS); } boolean isAllPred = true; int masterRet = masterSaRes.prepare(masterXid); if (masterRet == XAResource.XA_OK) { int[] slaveRetArray = new int[size]; for (int i = 0; i < size; i++) { slaveRetArray[i] = slaveSaResArray[i].prepare(slaveXidArray[i]); if (slaveRetArray[i] == XAResource.XA_OK) { continue; } else { isAllPred = false; break; } } if (isAllPred) { masterSaRes.commit(masterXid, false); for (int i = 0; i < size; i++) { slaveSaResArray[i].commit(slaveXidArray[i], false); } success = true; } } } catch (XAException e) { LOG.error("drop user error, user=" + userName + ", msg=" + e.getMessage()); throw new MetaException(e.getMessage()); } } catch (SQLException e) { LOG.error("drop user error, user=" + userName + ", msg=" + e.getMessage()); throw new MetaException(e.getMessage()); } finally { closeConnection(masterConn); closeXAConnection(masterDSXaConn); for (int i = 0; i < size; i++) { closeConnection(slaveConArray[i]); closeXAConnection(slaveDSXaConnArray[i]); } } return success; }
From source file:org.apache.hadoop.hive.metastore.MyXid.java
public boolean dropRoleByDistributeTransaction(String roleName) throws MetaException, NoSuchObjectException { Connection con = null;/*from w w w .j a va 2 s . co m*/ ; PreparedStatement ps = null; boolean success = false; roleName = roleName.toLowerCase(); try { con = getGlobalConnection(); } catch (MetaStoreConnectException e1) { LOG.error("drop role error, role=" + roleName + ", msg=" + e1.getMessage()); throw new MetaException(e1.getMessage()); } catch (SQLException e1) { LOG.error("drop role error, role=" + roleName + ", msg=" + e1.getMessage()); throw new MetaException(e1.getMessage()); } try { con.setAutoCommit(false); con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); ps = con.prepareStatement("select role_name from tdwrole where role_name=?"); ps.setString(1, roleName.toLowerCase()); boolean isRoleFind = false; ResultSet roleSet = ps.executeQuery(); while (roleSet.next()) { isRoleFind = true; break; } if (!isRoleFind) { throw new NoSuchObjectException("can not find role:" + roleName); } con.commit(); success = true; } catch (SQLException sqlex) { LOG.error("drop role error, role=" + roleName + ", msg=" + sqlex.getMessage()); throw new MetaException(sqlex.getMessage()); } finally { if (!success) { try { con.rollback(); } catch (SQLException e) { } } closeStatement(ps); closeConnection(con); } success = false; Connection masterConn = null; PGXADataSource masterDS = null; masterDS = getXADataSource(globalDbUrl, user, passwd); Set<String> slaveURLSet = getAllSegments(); int size = slaveURLSet.size(); PGXADataSource[] slaveDSArray = new PGXADataSource[size]; XAConnection[] slaveDSXaConnArray = new XAConnection[size]; XAResource[] slaveSaResArray = new XAResource[size]; Connection[] slaveConArray = new Connection[size]; Statement[] slaveStmtArray = new Statement[size]; Xid[] slaveXidArray = new Xid[size]; int index = 0; for (String slaveURL : slaveURLSet) { slaveDSArray[index] = getXADataSource(slaveURL, user, passwd); index++; } XAConnection masterDSXaConn = null; int formatID = genFormatID(); try { masterDSXaConn = masterDS.getXAConnection(); for (int i = 0; i < size; i++) { slaveDSXaConnArray[i] = slaveDSArray[i].getXAConnection(); slaveSaResArray[i] = slaveDSXaConnArray[i].getXAResource(); slaveConArray[i] = slaveDSXaConnArray[i].getConnection(); slaveStmtArray[i] = slaveConArray[i].createStatement(); byte id1 = (byte) ((i + 2) * 2); byte id2 = (byte) (id1 + 1); slaveXidArray[i] = new MyXid(formatID, new byte[] { id1 }, new byte[] { id2 }); } XAResource masterSaRes = masterDSXaConn.getXAResource(); masterConn = masterDSXaConn.getConnection(); Statement masterStmt = masterConn.createStatement(); Xid masterXid = new MyXid(formatID, new byte[] { 0x01 }, new byte[] { 0x02 }); try { masterSaRes.start(masterXid, XAResource.TMNOFLAGS); masterStmt.executeUpdate("delete from tdwrole where role_name='" + roleName.toLowerCase() + "'"); masterSaRes.end(masterXid, XAResource.TMSUCCESS); for (int i = 0; i < size; i++) { slaveSaResArray[i].start(slaveXidArray[i], XAResource.TMNOFLAGS); slaveStmtArray[i] .executeUpdate("delete from dbpriv where user_name='" + roleName.toLowerCase() + "'"); slaveStmtArray[i] .executeUpdate("delete from tblpriv where user_name='" + roleName.toLowerCase() + "'"); slaveSaResArray[i].end(slaveXidArray[i], XAResource.TMSUCCESS); } boolean isAllPred = true; int masterRet = masterSaRes.prepare(masterXid); if (masterRet == XAResource.XA_OK) { int[] slaveRetArray = new int[size]; for (int i = 0; i < size; i++) { slaveRetArray[i] = slaveSaResArray[i].prepare(slaveXidArray[i]); if (slaveRetArray[i] == XAResource.XA_OK) { continue; } else { isAllPred = false; break; } } if (isAllPred) { masterSaRes.commit(masterXid, false); for (int i = 0; i < size; i++) { slaveSaResArray[i].commit(slaveXidArray[i], false); } success = true; } } } catch (XAException e) { LOG.error("drop role error, role=" + roleName + ", msg=" + e.getMessage()); throw new MetaException(e.getMessage()); } } catch (SQLException e) { LOG.error("drop role error, role=" + roleName + ", msg=" + e.getMessage()); throw new MetaException(e.getMessage()); } finally { closeConnection(masterConn); closeXAConnection(masterDSXaConn); for (int i = 0; i < size; i++) { closeConnection(slaveConArray[i]); closeXAConnection(slaveDSXaConnArray[i]); } } return success; }
From source file:org.apache.ofbiz.entity.transaction.TransactionUtil.java
/** Enlists the given XAConnection and if a transaction is active in the current thread, returns a plain JDBC Connection */ public static Connection enlistConnection(XAConnection xacon) throws GenericTransactionException { if (xacon == null) { return null; }//from w ww. jav a 2 s . c o m try { XAResource resource = xacon.getXAResource(); TransactionUtil.enlistResource(resource); return xacon.getConnection(); } catch (SQLException e) { throw new GenericTransactionException( "SQL error, could not enlist connection in transaction even though transactions are available", e); } }
From source file:org.openadaptor.auxil.connector.jdbc.JDBCConnection.java
/** * Create connection and set transactional resource from XADataSource * @throws SQLException/*from w w w. j a v a 2 s . c o m*/ */ private void connectViaXADataSource() throws SQLException { XAConnection xaConnection = xaDataSource.getXAConnection(); setConnection(xaConnection.getConnection()); transactionalResource = xaConnection.getXAResource(); connection.setAutoCommit(false); }