在Atomikos中使用JDBC的XAResource实现,在AtomikosTransaction的createCompositeTransaction()方法中,我们可以使用AtomikosTransactionalResource的getXAResource()方法获取到JDBC的XAResource。接着我们可以在AtomikosTransactionalResource中重写prepare()方法并在其中执行connection.prepareStatement()和connection.execute()来实现类似于Hikari的connection-init-sql的功能。以下是示例代码:
public class AtomikosTransactionalResource implements javax.transaction.xa.XAResource {
private Connection connection;
private PreparedStatement preparedStatement;
private String connectionInitSql;
public AtomikosTransactionalResource(Connection connection,String connectionInitSql) {
this.connection = connection;
this.connectionInitSql = connectionInitSql;
}
@Override
public void prepare(Xid xid) throws XAException {
try {
preparedStatement = connection.prepareStatement(connectionInitSql);
preparedStatement.execute();
} catch (SQLException e) {
throw new XAException();
}
}
@Override
public void commit(Xid xid, boolean b) throws XAException {
// commit transaction
}
@Override
public void rollback(Xid xid) throws XAException {
// rollback transaction
}
// other methods here
}
然后在createCompositeTransaction()方法中获取AtomikosTransactionalResource并执行prepare()方法即可:
public Transaction createCompositeTransaction( Transaction tx1, Transaction tx2) throws SysException { // prepare AtomikosTransactionalResource AtomikosTransactionalResource resource = new AtomikosTransactionalResource(connection,connectionInitSql); resource.prepare(xid);
// create CompositeTransaction
CompositeTransaction ct = new CompositeTransaction(xid, root, parallel);
ct.registerSynchronization(new AtomikosTransactionSynchronization(ct, resource));
return ct;
}