if (showHelp) {
showHelp();
return;
}
DatabaseResource replicaDB = null;
DatabaseResource masterDB = null;
Connection replicaConn = null;
Connection masterConn = null;
UserTransaction utx = null;
RefreshMode executeMode;
String result;
boolean refreshed = false;
try {
Subscription subs = null;
Subscriber suber = null;
long maxMlogID = SyncDatabaseDAO.MLOG_RECORD_NOT_FOUND;
// get replica server connection
replicaDB = new DatabaseResource(server);
replicaConn = replicaDB.getConnection();
// begin transaction
utx = replicaDB.getUserTransaction();
utx.begin();
// get subscription data
subs = SyncDatabaseDAO.getSubscription(replicaConn, schema, table);
if (subs.getSchema() == null || subs.getTable() == null) {
throw new SyncDatabaseException("error.replica.dropped",
SyncDatabaseDAO.getTablePrint(schema, table));
}
// get master server connection
masterDB = new DatabaseResource(subs.getSrvname());
masterConn = masterDB.getConnection();
if (subs.getSubsID() != Subscription.NOT_HAVE_SUBSCRIBER) {
Connection masterLockConn = null;
// get subscriber data
suber = SyncDatabaseDAO.getSubscriber(masterConn, subs
.getSubsID());
if (suber.getNspName() == null || suber.getRelName() == null) {
throw new SyncDatabaseException("error.master.dropped",
suber.getSubsID());
}
try {
masterLockConn = SyncDatabaseDAO.lockTable(subs
.getSrvname(), suber.getMasterTableName());
// reset transaction
utx.rollback();
utx.setTransactionTimeout(DatabaseResource.DEFAULT_TIMEOUT);
utx.begin();
masterConn
.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
// first query
maxMlogID = SyncDatabaseDAO.getMaxMlogID(masterConn, suber
.getMlogName());
masterLockConn.rollback();
} finally {
// close connection
if (masterLockConn != null) {
masterLockConn.close();
}
}
if (maxMlogID == SyncDatabaseDAO.MLOG_RECORD_NOT_FOUND) {
if (suber.getLastMlogID() == Subscriber.NO_REFRESH) {
maxMlogID = 0;
} else {
maxMlogID = suber.getLastMlogID();
}
}
if (maxMlogID < suber.getLastMlogID()) {
log.debug("max mlog ID:" + maxMlogID + " / last mlog ID:"
+ suber.getLastMlogID());
throw new SyncDatabaseException("error.mlog_illegal");
}
}
// get execute refresh mode
executeMode = getExecuteMode(masterConn, suber, subs, mode);
if (executeMode == RefreshMode.FULL) {
// full-refresh
result = fullRefresh(masterConn, replicaConn, suber, subs,
concurrent);
} else {
// incremental-refresh
result = incrementalRefresh(masterConn, replicaConn, suber,
subs);
}
/* update subscription */
SyncDatabaseDAO.setSubscription(replicaConn, subs);
/* update subscriber */
if (suber != null) {
suber.setLastMlogID(maxMlogID);
SyncDatabaseDAO.setSubscriber(masterConn, suber);
}
// commit transaction
utx.commit();
log.info(result);
refreshed = true;
// purge
if (suber != null) {
utx.setTransactionTimeout(DatabaseResource.DEFAULT_TIMEOUT);
utx.begin();
SyncDatabaseDAO.purgeMlog(masterConn, suber.getNspName(), suber
.getRelName());
// commit transaction
utx.commit();
}
} catch (final Exception e) {
// rollback transaction
if (utx != null && utx.getStatus() != Status.STATUS_NO_TRANSACTION) {
utx.rollback();
}
if (!refreshed) {
throw e;
}
log.warn(e.getMessage());
} finally {
// release resources
if (replicaConn != null) {
replicaConn.close();
}
if (replicaDB != null) {
replicaDB.stop();
}
if (masterConn != null) {
masterConn.close();
}
if (masterDB != null) {
masterDB.stop();
}
}
}