|
26 | 26 | import io.tapdata.pdk.apis.entity.TapFilter; |
27 | 27 | import io.tapdata.pdk.apis.functions.connector.target.CreateTableOptions; |
28 | 28 |
|
| 29 | +import java.io.IOException; |
29 | 30 | import java.sql.Connection; |
30 | 31 | import java.sql.ResultSet; |
31 | 32 | import java.sql.SQLException; |
| 33 | +import java.sql.SQLRecoverableException; |
32 | 34 | import java.util.*; |
33 | 35 | import java.util.concurrent.ConcurrentHashMap; |
34 | 36 | import java.util.concurrent.CountDownLatch; |
@@ -646,24 +648,35 @@ protected void batchReadWithHashSplit(TapConnectorContext tapConnectorContext, T |
646 | 648 | for (int ii = threadIndex; ii < commonDbConfig.getMaxSplit(); ii += commonDbConfig.getBatchReadThreadSize()) { |
647 | 649 | String splitSql = sql + " WHERE " + getHashSplitModConditions(tapTable, commonDbConfig.getMaxSplit(), ii); |
648 | 650 | tapLogger.info("batchRead, splitSql[{}]: {}", ii + 1, splitSql); |
649 | | - jdbcContext.query(splitSql, resultSet -> { |
650 | | - List<TapEvent> tapEvents = list(); |
651 | | - //get all column names |
652 | | - List<String> columnNames = DbKit.getColumnsFromResultSet(resultSet); |
653 | | - while (isAlive() && resultSet.next()) { |
654 | | - DataMap dataMap = DbKit.getRowFromResultSet(resultSet, columnNames); |
655 | | - processDataMap(dataMap, tapTable); |
656 | | - tapEvents.add(insertRecordEvent(dataMap, tapTable.getId())); |
657 | | - if (tapEvents.size() == eventBatchSize) { |
658 | | - syncEventSubmit(tapEvents, eventsOffsetConsumer); |
659 | | - tapEvents = list(); |
| 651 | + int retry = 20; |
| 652 | + while (retry-- > 0 && isAlive()) { |
| 653 | + try { |
| 654 | + jdbcContext.query(splitSql, resultSet -> { |
| 655 | + List<TapEvent> tapEvents = list(); |
| 656 | + //get all column names |
| 657 | + List<String> columnNames = DbKit.getColumnsFromResultSet(resultSet); |
| 658 | + while (isAlive() && resultSet.next()) { |
| 659 | + DataMap dataMap = DbKit.getRowFromResultSet(resultSet, columnNames); |
| 660 | + processDataMap(dataMap, tapTable); |
| 661 | + tapEvents.add(insertRecordEvent(dataMap, tapTable.getId())); |
| 662 | + if (tapEvents.size() == eventBatchSize) { |
| 663 | + syncEventSubmit(tapEvents, eventsOffsetConsumer); |
| 664 | + tapEvents = list(); |
| 665 | + } |
| 666 | + } |
| 667 | + //last events those less than eventBatchSize |
| 668 | + if (EmptyKit.isNotEmpty(tapEvents)) { |
| 669 | + syncEventSubmit(tapEvents, eventsOffsetConsumer); |
| 670 | + } |
| 671 | + }); |
| 672 | + break; |
| 673 | + } catch (Exception e) { |
| 674 | + if (retry == 0 || !(e instanceof SQLRecoverableException || e instanceof IOException)) { |
| 675 | + throw e; |
660 | 676 | } |
| 677 | + tapLogger.warn("batchRead, splitSql[{}]: {} failed, retrying...", ii + 1, splitSql); |
661 | 678 | } |
662 | | - //last events those less than eventBatchSize |
663 | | - if (EmptyKit.isNotEmpty(tapEvents)) { |
664 | | - syncEventSubmit(tapEvents, eventsOffsetConsumer); |
665 | | - } |
666 | | - }); |
| 679 | + } |
667 | 680 | } |
668 | 681 | } catch (Exception e) { |
669 | 682 | throwable.set(e); |
|
0 commit comments