Răsfoiți Sursa

优化清空逻辑

AE86 2 ani în urmă
părinte
comite
a458593bba

+ 1 - 3
dbsyncer-common/src/main/java/org/dbsyncer/common/model/Paging.java

@@ -4,16 +4,14 @@ import java.util.Collection;
 import java.util.Collections;
 
 public class Paging {
-
     private long total;
     private int pageNum;
     private int pageSize;
-    private Collection data;
+    private Collection data = Collections.EMPTY_LIST;
 
     public Paging(int pageNum, int pageSize) {
         this.pageNum = pageNum;
         this.pageSize = pageSize;
-        this.data = Collections.EMPTY_LIST;
     }
 
     public long getTotal() {

+ 35 - 7
dbsyncer-storage/src/main/java/org/dbsyncer/storage/AbstractStorageService.java

@@ -14,6 +14,8 @@ import java.io.File;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * @author AE86
@@ -24,6 +26,10 @@ public abstract class AbstractStorageService implements StorageService, Disposab
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
+    private final Lock lock = new ReentrantLock(true);
+
+    private volatile boolean tryDeleteAll;
+
     @Autowired
     private Map<String, Strategy> map;
 
@@ -55,14 +61,27 @@ public abstract class AbstractStorageService implements StorageService, Disposab
 
     @Override
     public Paging query(Query query) {
+        if(tryDeleteAll){
+            return new Paging(query.getPageNum(), query.getPageSize());
+        }
+
+        boolean locked = false;
         try {
-            String collection = getCollection(query.getType(), query.getCollection());
-            query.setCollection(collection);
-            return select(query);
-        } catch (IOException e) {
+            locked = lock.tryLock();
+            if (locked) {
+                String collection = getCollection(query.getType(), query.getCollection());
+                query.setCollection(collection);
+                return select(query);
+            }
+        } catch (Exception e) {
             logger.error("query collectionId:{}, params:{}, failed:{}", query.getCollection(), query.getParams(), e.getMessage());
             throw new StorageException(e);
+        } finally {
+            if (locked) {
+                lock.unlock();
+            }
         }
+        return new Paging(query.getPageNum(), query.getPageSize());
     }
 
     @Override
@@ -143,12 +162,21 @@ public abstract class AbstractStorageService implements StorageService, Disposab
 
     @Override
     public void clear(StorageEnum type, String collectionId) {
+        boolean locked = false;
         try {
-            String collection = getCollection(type, collectionId);
-            deleteAll(type, collection);
-        } catch (IOException e) {
+            locked = lock.tryLock();
+            if (locked) {
+                tryDeleteAll = true;
+                deleteAll(type, getCollection(type, collectionId));
+            }
+        } catch (Exception e) {
             logger.error("clear collectionId:{}, failed:{}", collectionId, e.getMessage());
             throw new StorageException(e);
+        } finally {
+            if (locked) {
+                tryDeleteAll = false;
+                lock.unlock();
+            }
         }
     }
 

+ 0 - 1
dbsyncer-storage/src/main/java/org/dbsyncer/storage/lucene/Shard.java

@@ -127,7 +127,6 @@ public class Shard {
         Paging paging = new Paging(pageNum, pageSize);
         paging.setTotal(topDocs.totalHits);
         if(option.isQueryTotal()){
-            paging.setData(Collections.EMPTY_LIST);
             return paging;
         }
 

+ 24 - 30
dbsyncer-storage/src/main/java/org/dbsyncer/storage/support/MysqlStorageServiceImpl.java

@@ -61,7 +61,6 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
     private static final String TRUNCATE_TABLE = "TRUNCATE TABLE %s";
     private static final String TABLE_CREATE_TIME = "create_time";
     private static final String TABLE_UPDATE_TIME = "update_time";
-    private final Object LOCK = new Object();
 
     @Autowired
     private ConnectorFactory connectorFactory;
@@ -90,26 +89,23 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
 
     @Override
     public Paging select(Query query) {
-        synchronized (LOCK){
-            Executor executor = getExecutor(query.getType(), query.getCollection());
-            Paging paging = new Paging(query.getPageNum(), query.getPageSize());
-            List<Object> queryCountArgs = new ArrayList<>();
-            String queryCountSql = buildQueryCountSql(query, executor, queryCountArgs);
-            Long total = connectorMapper.execute(databaseTemplate -> databaseTemplate.queryForObject(queryCountSql, queryCountArgs.toArray(), Long.class));
-            if (query.isQueryTotal()) {
-                paging.setTotal(total);
-                paging.setData(Collections.EMPTY_LIST);
-                return paging;
-            }
-
-            List<Object> queryArgs = new ArrayList<>();
-            String querySql = buildQuerySql(query, executor, queryArgs);
-            List<Map<String, Object>> data = connectorMapper.execute(databaseTemplate -> databaseTemplate.queryForList(querySql, queryArgs.toArray()));
-            replaceHighLight(query, data);
-            paging.setData(data);
+        Paging paging = new Paging(query.getPageNum(), query.getPageSize());
+        Executor executor = getExecutor(query.getType(), query.getCollection());
+        List<Object> queryCountArgs = new ArrayList<>();
+        String queryCountSql = buildQueryCountSql(query, executor, queryCountArgs);
+        Long total = connectorMapper.execute(databaseTemplate -> databaseTemplate.queryForObject(queryCountSql, queryCountArgs.toArray(), Long.class));
+        if (query.isQueryTotal()) {
             paging.setTotal(total);
             return paging;
         }
+
+        List<Object> queryArgs = new ArrayList<>();
+        String querySql = buildQuerySql(query, executor, queryArgs);
+        List<Map<String, Object>> data = connectorMapper.execute(databaseTemplate -> databaseTemplate.queryForList(querySql, queryArgs.toArray()));
+        replaceHighLight(query, data);
+        paging.setData(data);
+        paging.setTotal(total);
+        return paging;
     }
 
     @Override
@@ -137,19 +133,17 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
 
     @Override
     public void deleteAll(StorageEnum type, String table) {
-        synchronized (LOCK){
-            Executor executor = getExecutor(type, table);
-            if (executor.isSystemType()) {
-                String sql = String.format(TRUNCATE_TABLE, PREFIX_TABLE.concat(table));
-                executeSql(sql);
-                return;
-            }
+        Executor executor = getExecutor(type, table);
+        if (executor.isSystemType()) {
+            String sql = String.format(TRUNCATE_TABLE, PREFIX_TABLE.concat(table));
+            executeSql(sql);
+            return;
+        }
 
-            if (tables.containsKey(table)) {
-                tables.remove(table);
-                String sql = String.format(DROP_TABLE, PREFIX_TABLE.concat(table));
-                executeSql(sql);
-            }
+        if (tables.containsKey(table)) {
+            tables.remove(table);
+            String sql = String.format(DROP_TABLE, PREFIX_TABLE.concat(table));
+            executeSql(sql);
         }
     }