Ver Fonte

优化sql执行逻辑

zhou-hao há 7 anos atrás
pai
commit
b4a7e8b6c7

+ 0 - 18
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/pom.xml

@@ -17,23 +17,5 @@
             <artifactId>hsweb-system-database-manager-api</artifactId>
             <version>${project.version}</version>
         </dependency>
-
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>druid</artifactId>
-            <version>1.0.26</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-tests</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 </project>

+ 18 - 6
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DefaultLocalTransactionExecutor.java

@@ -18,6 +18,7 @@ import java.util.List;
 import java.util.Queue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
@@ -46,7 +47,7 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
 
     private TransactionTemplate transactionTemplate;
 
-    private boolean commit = false;
+    private volatile boolean commit = false;
 
     private volatile boolean running = false;
 
@@ -95,10 +96,16 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
 
     @Override
     public void rollback() {
-        shutdown = true;
+        tryRollback();
         waitToClose();
     }
 
+    private void tryRollback() {
+        running = false;
+        shutdown = true;
+        commit = false;
+    }
+
     public void setSqlExecutor(SqlExecutor sqlExecutor) {
         this.sqlExecutor = sqlExecutor;
     }
@@ -124,13 +131,17 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
             }
             while (!shutdown) {
                 logger.debug("wait sql execute request {}", transactionId);
-                waitToReady.await();//等待有新的sql进来
+                if (transactionTemplate.getTimeout() > 0) {
+                    waitToReady.await(transactionTemplate.getTimeout(), TimeUnit.MILLISECONDS);//等待有新的sql进来
+                } else {
+                    waitToReady.await();
+                }
                 waitToReady.reset();//重置,下一次循环继续等待
                 //执行sql
                 doExecute();
             }
         } catch (Exception e) {
-            rollback();//回滚
+            tryRollback();//回滚
             logger.error("execute sql error {}", transactionId, e);
         } finally {
             try {
@@ -175,8 +186,8 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
                 //通过回调返回执行结果
                 execution.callback.accept(requests);
             } catch (Exception e) {
-                rollback();
                 execution.onError.accept(e);
+                return;
             }
         }
         running = false;
@@ -194,7 +205,7 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
         //异常信息
         Exception[] exceptions = new Exception[1];
         Execution execution = new Execution();
-        execution.datasourceId=DataSourceHolder.switcher().currentDataSourceId();
+        execution.datasourceId = DataSourceHolder.switcher().currentDataSourceId();
 
         execution.request = request;
         execution.callback = sqlExecuteResults -> {
@@ -217,6 +228,7 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
         //判断是否有异常
         Exception exception;
         if ((exception = exceptions[0]) != null) {
+            rollback();
             throw exception;
         }
         return results;

+ 18 - 0
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/pom.xml

@@ -22,5 +22,23 @@
             <artifactId>hsweb-system-database-manager-web</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.0.26</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-tests</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

+ 3 - 1
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/test/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerServiceTest.java

@@ -8,6 +8,8 @@ import org.hswebframework.web.database.manager.SqlInfo;
 import org.hswebframework.web.tests.SimpleWebApplicationTests;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
 
 import java.sql.SQLException;
 import java.util.Arrays;
@@ -58,7 +60,7 @@ public class SimpleDatabaseManagerServiceTest extends SimpleWebApplicationTests
         countDownLatch.await();
 
         sqlInfo = new SqlInfo();
-        sqlInfo.setSql("select * from t_test");
+        sqlInfo.setSql("select * from t_test ");
         sqlInfo.setType("select");
 
         request.setSql(Arrays.asList(sqlInfo));

+ 1 - 1
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/test/resources/application.yml

@@ -9,7 +9,7 @@ spring:
        driver-class-name : org.h2.Driver
 hsweb:
     app:
-      name: 数据字典测试
+      name: 数据库管理测试
       version: 3.0.0
 logging:
   level: