1515import java .util .concurrent .Future ;
1616import java .util .function .Function ;
1717
18- import javax .sql .DataSource ;
19-
2018import org .apache .commons .lang .StringUtils ;
2119import org .slf4j .Logger ;
2220import org .slf4j .LoggerFactory ;
2321
22+ import com .alibaba .druid .pool .DruidDataSource ;
2423import com .alibaba .fastjson2 .JSON ;
2524import com .alibaba .fastjson2 .JSONWriter .Feature ;
2625import com .alibaba .otter .canal .client .adapter .rdb .config .MappingConfig ;
@@ -41,6 +40,7 @@ public class RdbSyncService {
4140
4241 private static final Logger logger = LoggerFactory .getLogger (RdbSyncService .class );
4342
43+ private DruidDataSource dataSource ;
4444 // 源库表字段类型缓存: instance.schema.table -> <columnName, jdbcType>
4545 private Map <String , Map <String , Integer >> columnsTypeCache ;
4646
@@ -59,13 +59,14 @@ public Map<String, Map<String, Integer>> getColumnsTypeCache() {
5959 return columnsTypeCache ;
6060 }
6161
62- public RdbSyncService (DataSource dataSource , Integer threads , boolean skipDupException ){
62+ public RdbSyncService (DruidDataSource dataSource , Integer threads , boolean skipDupException ){
6363 this (dataSource , threads , new ConcurrentHashMap <>(), skipDupException );
6464 }
6565
6666 @ SuppressWarnings ("unchecked" )
67- public RdbSyncService (DataSource dataSource , Integer threads , Map <String , Map <String , Integer >> columnsTypeCache ,
67+ public RdbSyncService (DruidDataSource dataSource , Integer threads , Map <String , Map <String , Integer >> columnsTypeCache ,
6868 boolean skipDupException ){
69+ this .dataSource = dataSource ;
6970 this .columnsTypeCache = columnsTypeCache ;
7071 this .skipDupException = skipDupException ;
7172 try {
@@ -251,15 +252,15 @@ private void insert(BatchExecutor batchExecutor, MappingConfig config, SingleDml
251252 }
252253
253254 DbMapping dbMapping = config .getDbMapping ();
254-
255+ String backtick = SyncUtil . getBacktickByDbType ( dataSource . getDbType ());
255256 Map <String , String > columnsMap = SyncUtil .getColumnsMap (dbMapping , data );
256257
257258 StringBuilder insertSql = new StringBuilder ();
258- insertSql .append ("INSERT INTO " ).append (SyncUtil .getDbTableName (dbMapping )).append (" (" );
259+ insertSql .append ("INSERT INTO " ).append (SyncUtil .getDbTableName (dbMapping , dataSource . getDbType () )).append (" (" );
259260
260- columnsMap .forEach ((targetColumnName , srcColumnName ) -> insertSql .append ("`" )
261+ columnsMap .forEach ((targetColumnName , srcColumnName ) -> insertSql .append (backtick )
261262 .append (targetColumnName )
262- .append ("`" )
263+ .append (backtick )
263264 .append ("," ));
264265 int len = insertSql .length ();
265266 insertSql .delete (len - 1 , len ).append (") VALUES (" );
@@ -323,13 +324,13 @@ private void update(BatchExecutor batchExecutor, MappingConfig config, SingleDml
323324 }
324325
325326 DbMapping dbMapping = config .getDbMapping ();
326-
327+ String backtick = SyncUtil . getBacktickByDbType ( dataSource . getDbType ());
327328 Map <String , String > columnsMap = SyncUtil .getColumnsMap (dbMapping , data );
328329
329330 Map <String , Integer > ctype = getTargetColumnType (batchExecutor .getConn (), config );
330331
331332 StringBuilder updateSql = new StringBuilder ();
332- updateSql .append ("UPDATE " ).append (SyncUtil .getDbTableName (dbMapping )).append (" SET " );
333+ updateSql .append ("UPDATE " ).append (SyncUtil .getDbTableName (dbMapping , dataSource . getDbType () )).append (" SET " );
333334 List <Map <String , ?>> values = new ArrayList <>();
334335 boolean hasMatched = false ;
335336 for (String srcColumnName : old .keySet ()) {
@@ -342,7 +343,7 @@ private void update(BatchExecutor batchExecutor, MappingConfig config, SingleDml
342343 if (!targetColumnNames .isEmpty ()) {
343344 hasMatched = true ;
344345 for (String targetColumnName : targetColumnNames ) {
345- updateSql .append ("`" ).append (targetColumnName ).append ("`" ).append ("=?, " );
346+ updateSql .append (backtick ).append (targetColumnName ).append (backtick ).append ("=?, " );
346347 Integer type = ctype .get (Util .cleanColumn (targetColumnName ).toLowerCase ());
347348 if (type == null ) {
348349 throw new RuntimeException ("Target column: " + targetColumnName + " not matched" );
@@ -379,11 +380,10 @@ private void delete(BatchExecutor batchExecutor, MappingConfig config, SingleDml
379380 }
380381
381382 DbMapping dbMapping = config .getDbMapping ();
382-
383383 Map <String , Integer > ctype = getTargetColumnType (batchExecutor .getConn (), config );
384384
385385 StringBuilder sql = new StringBuilder ();
386- sql .append ("DELETE FROM " ).append (SyncUtil .getDbTableName (dbMapping )).append (" WHERE " );
386+ sql .append ("DELETE FROM " ).append (SyncUtil .getDbTableName (dbMapping , dataSource . getDbType () )).append (" WHERE " );
387387
388388 List <Map <String , ?>> values = new ArrayList <>();
389389 // 拼接主键
@@ -402,7 +402,7 @@ private void delete(BatchExecutor batchExecutor, MappingConfig config, SingleDml
402402 private void truncate (BatchExecutor batchExecutor , MappingConfig config ) throws SQLException {
403403 DbMapping dbMapping = config .getDbMapping ();
404404 StringBuilder sql = new StringBuilder ();
405- sql .append ("TRUNCATE TABLE " ).append (SyncUtil .getDbTableName (dbMapping ));
405+ sql .append ("TRUNCATE TABLE " ).append (SyncUtil .getDbTableName (dbMapping , dataSource . getDbType () ));
406406 batchExecutor .execute (sql .toString (), new ArrayList <>());
407407 if (logger .isTraceEnabled ()) {
408408 logger .trace ("Truncate target table, sql: {}" , sql );
@@ -426,7 +426,7 @@ private Map<String, Integer> getTargetColumnType(Connection conn, MappingConfig
426426 if (columnType == null ) {
427427 columnType = new LinkedHashMap <>();
428428 final Map <String , Integer > columnTypeTmp = columnType ;
429- String sql = "SELECT * FROM " + SyncUtil .getDbTableName (dbMapping ) + " WHERE 1=2" ;
429+ String sql = "SELECT * FROM " + SyncUtil .getDbTableName (dbMapping , dataSource . getDbType () ) + " WHERE 1=2" ;
430430 Util .sqlRS (conn , sql , rs -> {
431431 try {
432432 ResultSetMetaData rsd = rs .getMetaData ();
@@ -455,14 +455,16 @@ private void appendCondition(MappingConfig.DbMapping dbMapping, StringBuilder sq
455455
456456 private void appendCondition (MappingConfig .DbMapping dbMapping , StringBuilder sql , Map <String , Integer > ctype ,
457457 List <Map <String , ?>> values , Map <String , Object > d , Map <String , Object > o ) {
458+ String backtick = SyncUtil .getBacktickByDbType (dataSource .getDbType ());
459+
458460 // 拼接主键
459461 for (Map .Entry <String , String > entry : dbMapping .getTargetPk ().entrySet ()) {
460462 String targetColumnName = entry .getKey ();
461463 String srcColumnName = entry .getValue ();
462464 if (srcColumnName == null ) {
463465 srcColumnName = Util .cleanColumn (targetColumnName );
464466 }
465- sql .append ("`" ).append (targetColumnName ).append ("`" ).append ("=? AND " );
467+ sql .append (backtick ).append (targetColumnName ).append (backtick ).append ("=? AND " );
466468 Integer type = ctype .get (Util .cleanColumn (targetColumnName ).toLowerCase ());
467469 if (type == null ) {
468470 throw new RuntimeException ("Target column: " + targetColumnName + " not matched" );
0 commit comments