Browse Source

优化sql执行

zhou-hao 7 năm trước cách đây
mục cha
commit
7303b5938a

+ 2 - 0
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/SqlExecuteResult.java

@@ -18,4 +18,6 @@ public class SqlExecuteResult {
 
     private Object result;
 
+    private boolean success;
+
 }

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

@@ -182,8 +182,12 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
                                 }
                                 //执行sql
                                 return sqlRequestExecutor.apply(sqlExecutor, sqlInfo);
-                            } catch (SQLException e) {
-                                throw new SqlExecuteException(e.getMessage(), e, sqlInfo.getSql());
+                            } catch (Exception e) {
+                                return SqlExecuteResult.builder()
+                                        .result(e.getMessage())
+                                        .sqlInfo(sqlInfo)
+                                        .success(false)
+                                        .build();
                             }
                         })
                         .collect(Collectors.toList());
@@ -207,7 +211,6 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
         List<SqlExecuteResult> results = new ArrayList<>();
 
         //异常信息
-        Exception[] exceptions = new Exception[1];
         Execution execution = new Execution();
         execution.datasourceId = DataSourceHolder.switcher().currentDataSourceId();
 
@@ -218,7 +221,6 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
             countDownLatch.countDown();
         };
         execution.onError = (e) -> {
-            exceptions[0] = e;
             countDownLatch.countDown();
         };
         logger.debug("submit sql execute job {}", transactionId);
@@ -229,13 +231,6 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor {
         }
         //等待sql执行完毕
         countDownLatch.await();
-        //判断是否有异常
-        Exception exception;
-        if ((exception = exceptions[0]) != null) {
-
-            //rollback();
-            throw exception;
-        }
         return results;
     }
 

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

@@ -19,18 +19,18 @@ public class NonTransactionSqlExecutor implements SqlExecutor {
     }
 
     @Override
-    public List<SqlExecuteResult> execute(SqlExecuteRequest request)throws Exception {
+    public List<SqlExecuteResult> execute(SqlExecuteRequest request) throws Exception {
         return request.getSql().stream().map(this::doExecute).collect(Collectors.toList());
     }
 
-    public SqlExecuteResult doExecute(SqlInfo sqlInfo)   {
+    public SqlExecuteResult doExecute(SqlInfo sqlInfo) {
         SqlExecuteResult result = new SqlExecuteResult();
         Object executeResult = null;
         try {
             switch (sqlInfo.getType().toUpperCase()) {
                 case "SELECT":
-                    QueryResultWrapper wrapper=new QueryResultWrapper();
-                    executor.list(sqlInfo.getSql(),wrapper);
+                    QueryResultWrapper wrapper = new QueryResultWrapper();
+                    executor.list(sqlInfo.getSql(), wrapper);
                     executeResult = wrapper.getResult();
                     break;
                 case "INSERT":
@@ -43,8 +43,9 @@ public class NonTransactionSqlExecutor implements SqlExecutor {
                 default:
                     executor.exec(sqlInfo.getSql());
             }
-        }catch (SQLException e){
-            throw new SqlExecuteException(e.getMessage(),e,sqlInfo.getSql());
+            result.setSuccess(true);
+        } catch (SQLException e) {
+            throw new SqlExecuteException(e.getMessage(), e, sqlInfo.getSql());
         }
         result.setResult(executeResult);
         result.setSqlInfo(sqlInfo);

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

@@ -60,7 +60,7 @@ public class SimpleDatabaseManagerServiceTest extends SimpleWebApplicationTests
         countDownLatch.await();
 
         sqlInfo = new SqlInfo();
-        sqlInfo.setSql("select *,name as \"NAME\",1 as \"NAME\" from t_test ");
+        sqlInfo.setSql("select *,name as \"NAME\",1 as \"\" from t_test ");
         sqlInfo.setType("select");
 
         request.setSql(Arrays.asList(sqlInfo));

+ 26 - 6
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-web/src/main/java/org/hswebframework/web/database/manager/web/DataBaseManagerController.java

@@ -4,8 +4,10 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.hswebframework.web.Sqls;
+import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.Permission;
 import org.hswebframework.web.authorization.annotation.Authorize;
+import org.hswebframework.web.authorization.exception.AccessDenyException;
 import org.hswebframework.web.controller.message.ResponseMessage;
 import org.hswebframework.web.database.manager.DatabaseManagerService;
 import org.hswebframework.web.database.manager.SqlExecuteRequest;
@@ -55,9 +57,9 @@ public class DataBaseManagerController {
     public ResponseMessage<List<SqlExecuteResult>> execute(
             @PathVariable @ApiParam("数据源ID") String datasourceId,
             @RequestBody @ApiParam("SQL脚本") String sqlLines) throws Exception {
-
+        DataSourceHolder.switcher().use(datasourceId);
         return ResponseMessage.ok(databaseManagerService.execute(SqlExecuteRequest.builder()
-                .sql(parseSql(sqlLines,datasourceId))
+                .sql(parseSql(sqlLines, datasourceId))
                 .build()));
 
     }
@@ -69,7 +71,7 @@ public class DataBaseManagerController {
                                                            @ApiParam("SQL脚本") String sqlLines) throws Exception {
         return ResponseMessage.ok(databaseManagerService
                 .execute(SqlExecuteRequest.builder()
-                        .sql(parseSql(sqlLines,null))
+                        .sql(parseSql(sqlLines, null))
                         .build()));
     }
 
@@ -79,7 +81,7 @@ public class DataBaseManagerController {
     public ResponseMessage<List<SqlExecuteResult>> executeTransactional(@PathVariable @ApiParam("事务ID") String transactionalId,
                                                                         @ApiParam("SQL脚本") @RequestBody String sqlLines) throws Exception {
         return ResponseMessage.ok(databaseManagerService.execute(transactionalId, SqlExecuteRequest.builder()
-                .sql(parseSql(sqlLines,null))
+                .sql(parseSql(sqlLines, null))
                 .build()));
     }
 
@@ -89,8 +91,9 @@ public class DataBaseManagerController {
     public ResponseMessage<List<SqlExecuteResult>> executeTransactional(@PathVariable @ApiParam("事务ID") String transactionalId,
                                                                         @PathVariable @ApiParam("数据源ID") String dataSourceId,
                                                                         @ApiParam("SQL脚本") @RequestBody String sqlLines) throws Exception {
+        DataSourceHolder.switcher().use(dataSourceId);
         return ResponseMessage.ok(databaseManagerService.execute(transactionalId, SqlExecuteRequest.builder()
-                .sql(parseSql(sqlLines,dataSourceId))
+                .sql(parseSql(sqlLines, dataSourceId))
                 .build()));
     }
 
@@ -101,6 +104,14 @@ public class DataBaseManagerController {
         return ResponseMessage.ok(databaseManagerService.newTransaction());
     }
 
+    @GetMapping("/transactional/new/{dataSourceId}")
+    @Authorize(action = "execute", description = "执行SQL")
+    @ApiOperation("指定数据源新建事务")
+    public ResponseMessage<String> newTransaction(@PathVariable String dataSourceId) throws Exception {
+        DataSourceHolder.switcher().use(dataSourceId);
+        return ResponseMessage.ok(databaseManagerService.newTransaction(dataSourceId));
+    }
+
 
     @GetMapping("/transactional")
     @Authorize(action = "execute", description = "执行SQL")
@@ -125,13 +136,22 @@ public class DataBaseManagerController {
         return ResponseMessage.ok();
     }
 
-    private List<SqlInfo> parseSql(String sqlText,String datasourceId) {
+
+    private List<SqlInfo> parseSql(String sqlText, String datasourceId) {
+      //  Authentication authentication = Authentication.current().orElse(null);
+
         List<String> sqlList = Sqls.parse(sqlText);
         return sqlList.stream().map(sql -> {
             SqlInfo sqlInfo = new SqlInfo();
             sqlInfo.setSql(sql);
             sqlInfo.setDatasourceId(datasourceId);
             sqlInfo.setType(sql.split("[ ]")[0].toLowerCase());
+//            if (authentication != null) {
+//                if (!authentication.hasPermission("database-manager", sqlInfo.getType())) {
+//
+//                   // throw new AccessDenyException("权限不足");
+//                }
+//            }
             return sqlInfo;
         }).collect(Collectors.toList());
     }