From bc0abfd4ef4339a5e651429d2234a454f9c9edd5 Mon Sep 17 00:00:00 2001 From: Gao Hongtao Date: Thu, 1 Dec 2016 15:10:57 +0800 Subject: [PATCH] fixed #203 Merge batch events --- .../rdb/sharding/executor/EventPostman.java | 24 +------- .../executor/PreparedStatementExecutor.java | 11 ++-- .../executor/event/ExecutionEvent.java | 42 ++++++++++++- ...BatchPreparedStatementExecutorWrapper.java | 42 ------------- .../PreparedStatementExecutorWrapper.java | 11 ++++ .../jdbc/ShardingPreparedStatement.java | 60 +++++++++++-------- .../jdbc/ShardingPreparedStatementTest.java | 20 ++++--- .../content/post/release_notes.md | 1 + .../impl/RdbTransactionLogStorage.java | 1 + .../bed/sync/BestEffortsDeliveryListener.java | 2 + 10 files changed, 108 insertions(+), 106 deletions(-) delete mode 100644 sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/wrapper/BatchPreparedStatementExecutorWrapper.java diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/EventPostman.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/EventPostman.java index 7397a44a82a52..bfac177859da8 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/EventPostman.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/EventPostman.java @@ -23,7 +23,6 @@ import com.dangdang.ddframe.rdb.sharding.executor.event.DQLExecutionEventBus; import com.dangdang.ddframe.rdb.sharding.executor.event.EventExecutionType; import com.dangdang.ddframe.rdb.sharding.executor.wrapper.AbstractExecutorWrapper; -import com.dangdang.ddframe.rdb.sharding.executor.wrapper.BatchPreparedStatementExecutorWrapper; import com.google.common.base.Optional; import lombok.RequiredArgsConstructor; @@ -43,9 +42,7 @@ class EventPostman { void postExecutionEvents() { for (AbstractExecutorWrapper each : statementExecutorWrappers) { - if (each instanceof BatchPreparedStatementExecutorWrapper) { - postBatchExecutionEvent((BatchPreparedStatementExecutorWrapper) each); - } else if (each.getDMLExecutionEvent().isPresent()) { + if (each.getDMLExecutionEvent().isPresent()) { DMLExecutionEventBus.post(each.getDMLExecutionEvent().get()); } else if (each.getDQLExecutionEvent().isPresent()) { DQLExecutionEventBus.post(each.getDQLExecutionEvent().get()); @@ -53,12 +50,6 @@ void postExecutionEvents() { } } - private void postBatchExecutionEvent(final BatchPreparedStatementExecutorWrapper batchPreparedStatementExecutorWrapper) { - for (DMLExecutionEvent each : batchPreparedStatementExecutorWrapper.getDmlExecutionEvents()) { - DMLExecutionEventBus.post(each); - } - } - void postExecutionEventsAfterExecution(final AbstractExecutorWrapper statementExecutorWrapper) { postExecutionEventsAfterExecution(statementExecutorWrapper, EventExecutionType.EXECUTE_SUCCESS, Optional.absent()); } @@ -76,17 +67,4 @@ void postExecutionEventsAfterExecution(final AbstractExecutorWrapper statementEx DQLExecutionEventBus.post(event); } } - - void postBatchExecutionEventsAfterExecution(final BatchPreparedStatementExecutorWrapper batchPreparedStatementExecutorWrapper) { - postBatchExecutionEventsAfterExecution(batchPreparedStatementExecutorWrapper, EventExecutionType.EXECUTE_SUCCESS, Optional.absent()); - } - - void postBatchExecutionEventsAfterExecution( - final BatchPreparedStatementExecutorWrapper batchPreparedStatementExecutorWrapper, final EventExecutionType eventExecutionType, final Optional exp) { - for (DMLExecutionEvent each : batchPreparedStatementExecutorWrapper.getDmlExecutionEvents()) { - each.setEventExecutionType(eventExecutionType); - each.setExp(exp); - DMLExecutionEventBus.post(each); - } - } } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/PreparedStatementExecutor.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/PreparedStatementExecutor.java index d0166b5680963..e70aeb53af5d5 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/PreparedStatementExecutor.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/PreparedStatementExecutor.java @@ -19,7 +19,6 @@ import com.codahale.metrics.Timer.Context; import com.dangdang.ddframe.rdb.sharding.executor.event.EventExecutionType; -import com.dangdang.ddframe.rdb.sharding.executor.wrapper.BatchPreparedStatementExecutorWrapper; import com.dangdang.ddframe.rdb.sharding.executor.wrapper.PreparedStatementExecutorWrapper; import com.dangdang.ddframe.rdb.sharding.metrics.MetricsContext; import com.google.common.base.Optional; @@ -213,14 +212,14 @@ public int[] executeBatch() { final Map dataMap = ExecutorDataMap.getDataMap(); try { if (1 == preparedStatementExecutorWrappers.size()) { - return executeBatchInternal((BatchPreparedStatementExecutorWrapper) preparedStatementExecutorWrappers.iterator().next(), isExceptionThrown, dataMap); + return executeBatchInternal(preparedStatementExecutorWrappers.iterator().next(), isExceptionThrown, dataMap); } return executorEngine.execute(preparedStatementExecutorWrappers, new ExecuteUnit() { @Override public int[] execute(final PreparedStatementExecutorWrapper input) throws Exception { synchronized (input.getPreparedStatement().getConnection()) { - return executeBatchInternal((BatchPreparedStatementExecutorWrapper) input, isExceptionThrown, dataMap); + return executeBatchInternal(input, isExceptionThrown, dataMap); } } }, new MergeUnit() { @@ -248,18 +247,18 @@ public int[] merge(final List results) { } } - private int[] executeBatchInternal(final BatchPreparedStatementExecutorWrapper batchPreparedStatementExecutorWrapper, final boolean isExceptionThrown, final Map dataMap) { + private int[] executeBatchInternal(final PreparedStatementExecutorWrapper batchPreparedStatementExecutorWrapper, final boolean isExceptionThrown, final Map dataMap) { int[] result; ExecutorExceptionHandler.setExceptionThrown(isExceptionThrown); ExecutorDataMap.setDataMap(dataMap); try { result = batchPreparedStatementExecutorWrapper.getPreparedStatement().executeBatch(); } catch (final SQLException ex) { - eventPostman.postBatchExecutionEventsAfterExecution(batchPreparedStatementExecutorWrapper, EventExecutionType.EXECUTE_FAILURE, Optional.of(ex)); + eventPostman.postExecutionEventsAfterExecution(batchPreparedStatementExecutorWrapper, EventExecutionType.EXECUTE_FAILURE, Optional.of(ex)); ExecutorExceptionHandler.handleException(ex); return null; } - eventPostman.postBatchExecutionEventsAfterExecution(batchPreparedStatementExecutorWrapper); + eventPostman.postExecutionEventsAfterExecution(batchPreparedStatementExecutorWrapper); return result; } } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/event/ExecutionEvent.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/event/ExecutionEvent.java index 40075a826783f..b62c752718648 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/event/ExecutionEvent.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/event/ExecutionEvent.java @@ -18,10 +18,12 @@ package com.dangdang.ddframe.rdb.sharding.executor.event; import com.google.common.base.Optional; +import com.google.common.collect.Lists; import lombok.Getter; import lombok.Setter; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; @@ -40,7 +42,7 @@ public class ExecutionEvent { private final String sql; - private final List parameters; + private final List> parameters = new ArrayList<>(); @Setter private EventExecutionType eventExecutionType = EventExecutionType.BEFORE_EXECUTE; @@ -57,6 +59,42 @@ public class ExecutionEvent { id = UUID.randomUUID().toString(); this.dataSource = dataSource; this.sql = sql; - this.parameters = parameters; + this.parameters.add(parameters); + } + + /** + * 获取参数. + * 调用该方法前需要调用{@linkplain #isBatch()}, + * 如果返回值为{@code false}那么可以调用该方法获取参数. + * + * @return 参数列表 + */ + public List getParameters() { + return parameters.get(0); + } + + /** + * 判断事件是否为批量操作事件. + * 如果返回值为{@code false}那么可以调用{@link #getParameters()}获取参数, + * 如果返回值为{@code true}那么可以调用{@link #getBatchParameters()}获取参数. + * + * @return {@code true}是批量操作事件,{@code false}不是批量操作事件 + */ + public boolean isBatch() { + return parameters.size() > 1; + } + + /** + * 获取批量参数. + * 不论{@linkplain #isBatch()}返回值是什么,该方法都可以获得所有的参数. + * + * @return 参数列表 + */ + public List> getBatchParameters() { + return parameters; + } + + public void addBatchParameters(final List parameters) { + this.parameters.add(Lists.newArrayList(parameters)); } } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/wrapper/BatchPreparedStatementExecutorWrapper.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/wrapper/BatchPreparedStatementExecutorWrapper.java deleted file mode 100644 index 31ce953ddc6e1..0000000000000 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/wrapper/BatchPreparedStatementExecutorWrapper.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 1999-2015 dangdang.com. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *

- */ - -package com.dangdang.ddframe.rdb.sharding.executor.wrapper; - -import com.dangdang.ddframe.rdb.sharding.executor.event.DMLExecutionEvent; -import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit; -import lombok.Getter; - -import java.sql.PreparedStatement; -import java.util.LinkedList; -import java.util.List; - -/** - * 批量操作执行上下文. - * 批量操作只支持DML语句,故只包含DML操作的事件. - * - * @author gaohongtao - */ -@Getter -public class BatchPreparedStatementExecutorWrapper extends PreparedStatementExecutorWrapper { - - private final List dmlExecutionEvents = new LinkedList<>(); - - public BatchPreparedStatementExecutorWrapper(final PreparedStatement preparedStatement, final List parameters, final SQLExecutionUnit sqlExecutionUnit) { - super(preparedStatement, parameters, sqlExecutionUnit); - } -} diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/wrapper/PreparedStatementExecutorWrapper.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/wrapper/PreparedStatementExecutorWrapper.java index 3a486705326a0..51e4ceb2fd072 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/wrapper/PreparedStatementExecutorWrapper.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/wrapper/PreparedStatementExecutorWrapper.java @@ -21,6 +21,7 @@ import com.dangdang.ddframe.rdb.sharding.executor.event.DQLExecutionEvent; import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit; import com.google.common.base.Optional; +import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import lombok.Getter; @@ -66,4 +67,14 @@ public Optional getDMLExecutionEvent() { public Optional getDQLExecutionEvent() { return dqlExecutionEvent; } + + /** + * 增加批量参数. + * + * @param parameters 参数列表 + */ + public void addBatchParameters(final List parameters) { + Preconditions.checkArgument(isDML() && dmlExecutionEvent.isPresent()); + dmlExecutionEvent.get().addBatchParameters(Lists.newArrayList(parameters)); + } } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java index e6f5f63730e2a..5a2ac3ab77f8e 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java @@ -18,7 +18,6 @@ package com.dangdang.ddframe.rdb.sharding.jdbc; import com.dangdang.ddframe.rdb.sharding.executor.PreparedStatementExecutor; -import com.dangdang.ddframe.rdb.sharding.executor.wrapper.BatchPreparedStatementExecutorWrapper; import com.dangdang.ddframe.rdb.sharding.executor.wrapper.PreparedStatementExecutorWrapper; import com.dangdang.ddframe.rdb.sharding.jdbc.adapter.AbstractPreparedStatementAdapter; import com.dangdang.ddframe.rdb.sharding.merger.ResultSetFactory; @@ -26,15 +25,17 @@ import com.dangdang.ddframe.rdb.sharding.router.PreparedSQLRouter; import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit; import com.dangdang.ddframe.rdb.sharding.router.SQLRouteResult; +import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterators; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; +import java.util.Objects; /** * 支持分片的预编译语句对象. @@ -46,7 +47,7 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd private final PreparedSQLRouter preparedSQLRouter; - private final Map cachedRoutePreparedStatementMap = new HashMap<>(); + private final List cachedPreparedStatementWrappers = new ArrayList<>(); private Integer autoGeneratedKeys; @@ -116,8 +117,13 @@ public boolean execute() throws SQLException { } protected void clearRouteContext() throws SQLException { - super.clearRouteContext(); - clearParameters(); + resetBatch(); + cachedPreparedStatementWrappers.clear(); + } + + @Override + public void clearBatch() throws SQLException { + clearRouteContext(); } @Override @@ -125,40 +131,28 @@ public void addBatch() throws SQLException { try { for (PreparedStatementExecutorWrapper each : routeSQL()) { each.getPreparedStatement().addBatch(); - BatchPreparedStatementExecutorWrapper wrapper; - if (cachedRoutePreparedStatementMap.containsKey(each.getPreparedStatement())) { - wrapper = (BatchPreparedStatementExecutorWrapper) cachedRoutePreparedStatementMap.get(each.getPreparedStatement()); - } else { - wrapper = new BatchPreparedStatementExecutorWrapper(each.getPreparedStatement(), getParameters(), each.getSqlExecutionUnit()); - cachedRoutePreparedStatementMap.put(each.getPreparedStatement(), wrapper); - } - if (each.getDMLExecutionEvent().isPresent()) { - wrapper.getDmlExecutionEvents().add(each.getDMLExecutionEvent().get()); - } } getGeneratedKeyContext().addRow(); } finally { - clearRouteContext(); + resetBatch(); } } - @Override - public void clearBatch() throws SQLException { - cachedRoutePreparedStatementMap.clear(); - clearRouteContext(); + private void resetBatch() throws SQLException { + super.clearRouteContext(); + clearParameters(); } @Override public int[] executeBatch() throws SQLException { try { - return new PreparedStatementExecutor(getShardingConnection().getShardingContext().getExecutorEngine(), cachedRoutePreparedStatementMap.values()).executeBatch(); + return new PreparedStatementExecutor(getShardingConnection().getShardingContext().getExecutorEngine(), cachedPreparedStatementWrappers).executeBatch(); } finally { - clearBatch(); + clearRouteContext(); } } private List routeSQL() throws SQLException { - List parameters = getParameters(); List result = new ArrayList<>(); SQLRouteResult sqlRouteResult = preparedSQLRouter.route(getParameters()); MergeContext mergeContext = sqlRouteResult.getMergeContext(); @@ -168,8 +162,24 @@ private List routeSQL() throws SQLException { PreparedStatement preparedStatement = (PreparedStatement) getStatement(getShardingConnection().getConnection(each.getDataSource(), sqlRouteResult.getSqlStatementType()), each.getSql()); replayMethodsInvocation(preparedStatement); getParameters().replayMethodsInvocation(preparedStatement); - result.add(new PreparedStatementExecutorWrapper(preparedStatement, parameters, each)); + result.add(wrap(preparedStatement, each)); + } + return result; + } + + private PreparedStatementExecutorWrapper wrap(final PreparedStatement preparedStatement, final SQLExecutionUnit sqlExecutionUnit) { + Optional wrapperOptional = Iterators.tryFind(cachedPreparedStatementWrappers.iterator(), new Predicate() { + @Override + public boolean apply(final PreparedStatementExecutorWrapper input) { + return Objects.equals(input.getPreparedStatement(), preparedStatement); + } + }); + if (wrapperOptional.isPresent()) { + wrapperOptional.get().addBatchParameters(getParameters()); + return wrapperOptional.get(); } + PreparedStatementExecutorWrapper result = new PreparedStatementExecutorWrapper(preparedStatement, getParameters(), sqlExecutionUnit); + cachedPreparedStatementWrappers.add(result); return result; } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatementTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatementTest.java index cc0dbe7f0e51e..9ceb9c36fb32c 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatementTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatementTest.java @@ -32,8 +32,10 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.ArrayList; +import java.util.List; +import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -228,9 +230,10 @@ public void assertExecuteQueryWithColumnNames() throws SQLException { @Test public void assertAddBatch() throws SQLException { - final AtomicInteger beforeEventSum = new AtomicInteger(); - final AtomicInteger successEventSum = new AtomicInteger(); DMLExecutionEventBus.register(new DMLExecutionEventListener() { + + private List beforeEvents = new ArrayList<>(); + @Override public String getName() { return "test"; @@ -239,10 +242,12 @@ public String getName() { @Subscribe @AllowConcurrentEvents public void subscribe(final DMLExecutionEvent event) { + assertTrue(event.isBatch()); + assertThat(event.getBatchParameters().size(), is(2)); if (event.getEventExecutionType().equals(EventExecutionType.BEFORE_EXECUTE)) { - beforeEventSum.incrementAndGet(); + beforeEvents.add(event); } else if (event.getEventExecutionType().equals(EventExecutionType.EXECUTE_SUCCESS)) { - successEventSum.incrementAndGet(); + assertThat(beforeEvents, hasItem(event)); } } }); @@ -270,10 +275,9 @@ public void subscribe(final DMLExecutionEvent event) { for (int each : result) { assertThat(each, is(1)); } + } finally { + DMLExecutionEventBus.clearListener(); } - assertThat(beforeEventSum.get(), is(4)); - assertThat(successEventSum.get(), is(4)); - DMLExecutionEventBus.clearListener(); } @Test diff --git a/sharding-jdbc-doc/content/post/release_notes.md b/sharding-jdbc-doc/content/post/release_notes.md index cc370bade9139..a3aa6d7ac2990 100644 --- a/sharding-jdbc-doc/content/post/release_notes.md +++ b/sharding-jdbc-doc/content/post/release_notes.md @@ -13,6 +13,7 @@ weight = 1 1. [ISSUE #194](https://github.com/dangdangdotcom/sharding-jdbc/issues/194) jdbc接口中资源释放错误 1. [ISSUE #199](https://github.com/dangdangdotcom/sharding-jdbc/issues/199) 分表且复用PreparedStatement对象造成数据路由错误 1. [ISSUE #201](https://github.com/dangdangdotcom/sharding-jdbc/issues/201) 批量操作执行前事件发送缺失 +1. [ISSUE #203](https://github.com/dangdangdotcom/sharding-jdbc/issues/201) 合并batch操作发送的事件 ## 1.4.0 diff --git a/sharding-jdbc-transaction-parent/sharding-jdbc-transaction-storage/src/main/java/com/dangdang/ddframe/rdb/transaction/soft/storage/impl/RdbTransactionLogStorage.java b/sharding-jdbc-transaction-parent/sharding-jdbc-transaction-storage/src/main/java/com/dangdang/ddframe/rdb/transaction/soft/storage/impl/RdbTransactionLogStorage.java index 580f4fcf263b6..b0afd4252eea8 100644 --- a/sharding-jdbc-transaction-parent/sharding-jdbc-transaction-storage/src/main/java/com/dangdang/ddframe/rdb/transaction/soft/storage/impl/RdbTransactionLogStorage.java +++ b/sharding-jdbc-transaction-parent/sharding-jdbc-transaction-storage/src/main/java/com/dangdang/ddframe/rdb/transaction/soft/storage/impl/RdbTransactionLogStorage.java @@ -89,6 +89,7 @@ public List findEligibleTransactionLogs(final int size, final in try (ResultSet rs = preparedStatement.executeQuery()) { while (rs.next()) { Gson gson = new Gson(); + //TODO 对于批量执行的参数需要解析成两层列表 List parameters = gson.fromJson(rs.getString(5), new TypeToken>() { }.getType()); result.add(new TransactionLog(rs.getString(1), "", SoftTransactionType.valueOf(rs.getString(2)), rs.getString(3), rs.getString(4), parameters, rs.getLong(6), rs.getInt(7))); } diff --git a/sharding-jdbc-transaction-parent/sharding-jdbc-transaction/src/main/java/com/dangdang/ddframe/rdb/transaction/soft/bed/sync/BestEffortsDeliveryListener.java b/sharding-jdbc-transaction-parent/sharding-jdbc-transaction/src/main/java/com/dangdang/ddframe/rdb/transaction/soft/bed/sync/BestEffortsDeliveryListener.java index a741610408bdd..015b32a90c6cf 100644 --- a/sharding-jdbc-transaction-parent/sharding-jdbc-transaction/src/main/java/com/dangdang/ddframe/rdb/transaction/soft/bed/sync/BestEffortsDeliveryListener.java +++ b/sharding-jdbc-transaction-parent/sharding-jdbc-transaction/src/main/java/com/dangdang/ddframe/rdb/transaction/soft/bed/sync/BestEffortsDeliveryListener.java @@ -56,6 +56,7 @@ public void listen(final DMLExecutionEvent event) { 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; @@ -79,6 +80,7 @@ public void listen(final DMLExecutionEvent event) { 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)); }