|
11 | 11 | import io.tapdata.entity.event.dml.TapUpdateRecordEvent; |
12 | 12 | import io.tapdata.entity.logger.Log; |
13 | 13 | import io.tapdata.entity.schema.TapTable; |
| 14 | +import io.tapdata.kit.DbKit; |
14 | 15 | import io.tapdata.kit.EmptyKit; |
15 | 16 | import io.tapdata.pdk.apis.entity.ConnectionOptions; |
16 | 17 | import io.tapdata.pdk.apis.entity.WriteListResult; |
@@ -86,6 +87,35 @@ public void write(List<TapRecordEvent> tapRecordEvents, Consumer<WriteListResult |
86 | 87 | } |
87 | 88 | } |
88 | 89 | //insert,update,delete events must consecutive, so execute the other two first |
| 90 | + writePart(tapRecordEvents, listResult, isAlive); |
| 91 | + //release resource |
| 92 | + |
| 93 | + } catch (SQLException e) { |
| 94 | + exceptionCollector.collectViolateUnique(toJson(tapTable.primaryKeys(true)), null, null, e); |
| 95 | + exceptionCollector.collectWritePrivileges("writeRecord", Collections.emptyList(), e); |
| 96 | + exceptionCollector.collectWriteType(null, null, null, e); |
| 97 | + exceptionCollector.collectWriteLength(null, null, null, e); |
| 98 | + exceptionCollector.revealException(e); |
| 99 | + throw e; |
| 100 | + } finally { |
| 101 | + insertRecorder.releaseResource(); |
| 102 | + updateRecorder.releaseResource(); |
| 103 | + deleteRecorder.releaseResource(); |
| 104 | + if (!isTransaction) { |
| 105 | + if (needCloseIdentity) { |
| 106 | + openIdentity(); |
| 107 | + } |
| 108 | + connection.close(); |
| 109 | + } |
| 110 | + writeListResultConsumer.accept(listResult |
| 111 | + .insertedCount(insertRecorder.getAtomicLong().get()) |
| 112 | + .modifiedCount(updateRecorder.getAtomicLong().get()) |
| 113 | + .removedCount(deleteRecorder.getAtomicLong().get())); |
| 114 | + } |
| 115 | + } |
| 116 | + |
| 117 | + protected void writePart(List<TapRecordEvent> tapRecordEvents, WriteListResult<TapRecordEvent> listResult, Supplier<Boolean> isAlive) { |
| 118 | + try { |
89 | 119 | for (TapRecordEvent recordEvent : tapRecordEvents) { |
90 | 120 | if (null != isAlive && !isAlive.get()) { |
91 | 121 | break; |
@@ -124,39 +154,19 @@ public void write(List<TapRecordEvent> tapRecordEvents, Consumer<WriteListResult |
124 | 154 | if (!connection.getAutoCommit() && !isTransaction) { |
125 | 155 | connection.commit(); |
126 | 156 | } |
127 | | - //release resource |
128 | | - |
129 | 157 | } catch (SQLException e) { |
130 | 158 | try { |
131 | 159 | connection.rollback(); |
132 | 160 | } catch (Exception ignore) { |
133 | 161 | } |
134 | | - exceptionCollector.collectTerminateByServer(e); |
135 | | - exceptionCollector.collectViolateNull(null, e); |
136 | | - TapRecordEvent errorEvent = null; |
137 | | - if (EmptyKit.isNotNull(listResult.getErrorMap())) { |
138 | | - errorEvent = listResult.getErrorMap().keySet().stream().findFirst().orElse(null); |
| 162 | + exceptionCollector.collectViolateUnique(toJson(tapTable.primaryKeys(true)), null, null, e); |
| 163 | + if (tapRecordEvents.size() == 1) { |
| 164 | + throw new RuntimeException(String.format("Error occurred when retrying write record: %s", tapRecordEvents.get(0)), e); |
| 165 | + } else { |
| 166 | + int eachPieceSize = Math.max(tapRecordEvents.size() / 10, 1); |
| 167 | + tapLogger.warn("writeRecord failed, dismantle them, size: {}", eachPieceSize); |
| 168 | + DbKit.splitToPieces(tapRecordEvents, eachPieceSize).forEach(pieces -> writePart(pieces, listResult, isAlive)); |
139 | 169 | } |
140 | | - exceptionCollector.collectViolateUnique(toJson(tapTable.primaryKeys(true)), errorEvent, null, e); |
141 | | - exceptionCollector.collectWritePrivileges("writeRecord", Collections.emptyList(), e); |
142 | | - exceptionCollector.collectWriteType(null, null, errorEvent, e); |
143 | | - exceptionCollector.collectWriteLength(null, null, errorEvent, e); |
144 | | - exceptionCollector.revealException(e); |
145 | | - throw e; |
146 | | - } finally { |
147 | | - insertRecorder.releaseResource(); |
148 | | - updateRecorder.releaseResource(); |
149 | | - deleteRecorder.releaseResource(); |
150 | | - if (!isTransaction) { |
151 | | - if (needCloseIdentity) { |
152 | | - openIdentity(); |
153 | | - } |
154 | | - connection.close(); |
155 | | - } |
156 | | - writeListResultConsumer.accept(listResult |
157 | | - .insertedCount(insertRecorder.getAtomicLong().get()) |
158 | | - .modifiedCount(updateRecorder.getAtomicLong().get()) |
159 | | - .removedCount(deleteRecorder.getAtomicLong().get())); |
160 | 170 | } |
161 | 171 | } |
162 | 172 |
|
|
0 commit comments