use of com.dangdang.ddframe.rdb.transaction.soft.storage.TransactionLog in project sharding-jdbc by dangdangdotcom.
the class BestEffortsDeliveryListener method listen.
@Subscribe
@AllowConcurrentEvents
public void listen(final DMLExecutionEvent event) {
if (!isProcessContinuously()) {
return;
}
SoftTransactionConfiguration transactionConfig = SoftTransactionManager.getCurrentTransactionConfiguration().get();
TransactionLogStorage transactionLogStorage = TransactionLogStorageFactory.createTransactionLogStorage(transactionConfig.buildTransactionLogDataSource());
BEDSoftTransaction bedSoftTransaction = (BEDSoftTransaction) SoftTransactionManager.getCurrentTransaction().get();
switch(event.getEventExecutionType()) {
case BEFORE_EXECUTE:
//TODO 对于批量执行的SQL需要解析成两层列表
transactionLogStorage.add(new TransactionLog(event.getId(), bedSoftTransaction.getTransactionId(), bedSoftTransaction.getTransactionType(), event.getDataSource(), event.getSql(), event.getParameters(), System.currentTimeMillis(), 0));
return;
case EXECUTE_SUCCESS:
transactionLogStorage.remove(event.getId());
return;
case EXECUTE_FAILURE:
boolean deliverySuccess = false;
for (int i = 0; i < transactionConfig.getSyncMaxDeliveryTryTimes(); i++) {
if (deliverySuccess) {
return;
}
boolean isNewConnection = false;
Connection conn = null;
PreparedStatement preparedStatement = null;
try {
conn = bedSoftTransaction.getConnection().getConnection(event.getDataSource(), SQLStatementType.UPDATE);
if (!isValidConnection(conn)) {
bedSoftTransaction.getConnection().releaseBrokenConnection(conn);
conn = bedSoftTransaction.getConnection().getConnection(event.getDataSource(), SQLStatementType.UPDATE);
isNewConnection = true;
}
preparedStatement = conn.prepareStatement(event.getSql());
//TODO 对于批量事件需要解析成两层列表
for (int parameterIndex = 0; parameterIndex < event.getParameters().size(); parameterIndex++) {
preparedStatement.setObject(parameterIndex + 1, event.getParameters().get(parameterIndex));
}
preparedStatement.executeUpdate();
deliverySuccess = true;
transactionLogStorage.remove(event.getId());
} catch (final SQLException ex) {
log.error(String.format("Delivery times %s error, max try times is %s", i + 1, transactionConfig.getSyncMaxDeliveryTryTimes()), ex);
} finally {
close(isNewConnection, conn, preparedStatement);
}
}
return;
default:
throw new UnsupportedOperationException(event.getEventExecutionType().toString());
}
}
use of com.dangdang.ddframe.rdb.transaction.soft.storage.TransactionLog in project sharding-jdbc by dangdangdotcom.
the class RdbTransactionLogStorageTest method assertAddTransactionLogStorage.
@Test
public void assertAddTransactionLogStorage() throws SQLException {
String id = UUID.randomUUID().toString();
String transactionId = UUID.randomUUID().toString();
TransactionLog transactionLog = buildTransactionLog(id, transactionId);
storage.add(transactionLog);
assertThat(storage.findEligibleTransactionLogs(1, 1, 1L).size(), is(1));
storage.remove(id);
}
use of com.dangdang.ddframe.rdb.transaction.soft.storage.TransactionLog in project sharding-jdbc by dangdangdotcom.
the class AbstractTransactionLogStorageOperationsTest method assertTransactionLogStorageOperations.
protected void assertTransactionLogStorageOperations(final TransactionLogStorage storage) {
String id = UUID.randomUUID().toString();
String transactionId = UUID.randomUUID().toString();
TransactionLog transactionLog = new TransactionLog(id, transactionId, SoftTransactionType.BestEffortsDelivery, "ds_1", "UPDATE t_order_0 SET not_existed_column = 1 WHERE user_id = 1 AND order_id = ?", Lists.newArrayList(), 1461062858701L, 0);
storage.add(transactionLog);
storage.increaseAsyncDeliveryTryTimes(id);
assertThat(storage.findEligibleTransactionLogs(1, 2, 0L).get(0).getAsyncDeliveryTryTimes(), is(1));
storage.remove(id);
assertThat(storage.findEligibleTransactionLogs(1, 2, 0L).size(), is(0));
}
Aggregations