Commit c7e6d1d8 by inrgihc

修正分页查询错误

parent d68dc957
...@@ -28,4 +28,5 @@ public class ProductContext { ...@@ -28,4 +28,5 @@ public class ProductContext {
private boolean hasCatalogAndSchema; private boolean hasCatalogAndSchema;
private Function<String, Pair<String, String>> adapter; private Function<String, Pair<String, String>> adapter;
private String pageSql; private String pageSql;
private ThreeConsumer<Integer, Integer, List<Object>> pageConsumer;
} }
package com.gitee.sqlrest.common.dto;
@FunctionalInterface
public interface ThreeConsumer<X, Y, Z> {
void accept(X arg1, Y arg2, Z arg3);
}
package com.gitee.sqlrest.core.exec.engine.impl; package com.gitee.sqlrest.core.exec.engine.impl;
import cn.hutool.core.util.NumberUtil;
import com.gitee.sqlrest.common.consts.Constants;
import com.gitee.sqlrest.common.enums.NamingStrategyEnum; import com.gitee.sqlrest.common.enums.NamingStrategyEnum;
import com.gitee.sqlrest.common.enums.ProductTypeEnum; import com.gitee.sqlrest.common.enums.ProductTypeEnum;
import com.gitee.sqlrest.core.exec.engine.AbstractExecutorEngine; import com.gitee.sqlrest.core.exec.engine.AbstractExecutorEngine;
import com.gitee.sqlrest.core.util.PageSizeUtils;
import com.gitee.sqlrest.core.util.SqlJdbcUtils; import com.gitee.sqlrest.core.util.SqlJdbcUtils;
import com.gitee.sqlrest.persistence.entity.ApiContextEntity; import com.gitee.sqlrest.persistence.entity.ApiContextEntity;
import com.gitee.sqlrest.template.Configuration; import com.gitee.sqlrest.template.Configuration;
...@@ -35,12 +34,8 @@ public class SqlExecutorService extends AbstractExecutorEngine { ...@@ -35,12 +34,8 @@ public class SqlExecutorService extends AbstractExecutorEngine {
for (ApiContextEntity sql : scripts) { for (ApiContextEntity sql : scripts) {
SqlTemplate template = cfg.getTemplate(sql.getSqlText()); SqlTemplate template = cfg.getTemplate(sql.getSqlText());
SqlMeta sqlMeta = template.process(params); SqlMeta sqlMeta = template.process(params);
int page = (null == params.get(Constants.PARAM_PAGE_NUMBER)) int page = PageSizeUtils.getPageFromParams(params);
? 1 int size = PageSizeUtils.getSizeFromParams(params);
: NumberUtil.parseInt(params.get(Constants.PARAM_PAGE_NUMBER).toString());
int size = (null == params.get(Constants.PARAM_PAGE_SIZE))
? 10
: NumberUtil.parseInt(params.get(Constants.PARAM_PAGE_SIZE).toString());
dataList.add(SqlJdbcUtils.execute(productType, connection, sqlMeta, strategy, page, size)); dataList.add(SqlJdbcUtils.execute(productType, connection, sqlMeta, strategy, page, size));
} }
connection.commit(); connection.commit();
......
...@@ -7,6 +7,7 @@ import com.gitee.sqlrest.common.enums.ProductTypeEnum; ...@@ -7,6 +7,7 @@ import com.gitee.sqlrest.common.enums.ProductTypeEnum;
import com.gitee.sqlrest.core.exec.annotation.Comment; import com.gitee.sqlrest.core.exec.annotation.Comment;
import com.gitee.sqlrest.core.exec.annotation.Module; import com.gitee.sqlrest.core.exec.annotation.Module;
import com.gitee.sqlrest.core.util.ConvertUtils; import com.gitee.sqlrest.core.util.ConvertUtils;
import com.gitee.sqlrest.core.util.PageSizeUtils;
import com.gitee.sqlrest.template.Configuration; import com.gitee.sqlrest.template.Configuration;
import com.gitee.sqlrest.template.SqlMeta; import com.gitee.sqlrest.template.SqlMeta;
import com.gitee.sqlrest.template.SqlTemplate; import com.gitee.sqlrest.template.SqlTemplate;
...@@ -109,14 +110,9 @@ public class DbVarModule { ...@@ -109,14 +110,9 @@ public class DbVarModule {
SqlMeta sqlMeta = template.process(params); SqlMeta sqlMeta = template.process(params);
String pageSql = productType.getPageSql(sqlMeta.getSql()); String pageSql = productType.getPageSql(sqlMeta.getSql());
List<Object> parameters = sqlMeta.getParameter(); List<Object> parameters = sqlMeta.getParameter();
int page = (null == params.get(Constants.PARAM_PAGE_NUMBER)) int page = PageSizeUtils.getPageFromParams(params);
? 1 int size = PageSizeUtils.getSizeFromParams(params);
: NumberUtil.parseInt(params.get(Constants.PARAM_PAGE_NUMBER).toString()); this.productType.getPageConsumer().accept(page, size, parameters);
int size = (null == params.get(Constants.PARAM_PAGE_SIZE))
? 10
: NumberUtil.parseInt(params.get(Constants.PARAM_PAGE_SIZE).toString());
parameters.add(((page - 1) * size) < 0 ? 0 : (page - 1) * size);
parameters.add(size);
return build(jdbcTemplate.queryForList(pageSql, parameters.toArray())); return build(jdbcTemplate.queryForList(pageSql, parameters.toArray()));
} }
......
package com.gitee.sqlrest.core.gateway; package com.gitee.sqlrest.core.gateway;
import static com.gitee.sqlrest.common.consts.Constants.GATEWAY_APPLICATION_NAME;
import com.gitee.sqlrest.common.dto.ResultEntity;
import com.gitee.sqlrest.common.enums.OnOffEnum; import com.gitee.sqlrest.common.enums.OnOffEnum;
import com.gitee.sqlrest.common.enums.WhiteBlackEnum; import com.gitee.sqlrest.common.enums.WhiteBlackEnum;
import com.gitee.sqlrest.core.dto.UpdateFirewallRulesRequest; import com.gitee.sqlrest.core.dto.UpdateFirewallRulesRequest;
import com.gitee.sqlrest.persistence.dao.FirewallRulesDao; import com.gitee.sqlrest.persistence.dao.FirewallRulesDao;
import com.gitee.sqlrest.persistence.entity.FirewallRulesEntity; import com.gitee.sqlrest.persistence.entity.FirewallRulesEntity;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -18,10 +14,7 @@ import javax.annotation.Resource; ...@@ -18,10 +14,7 @@ import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.Strings; import org.apache.logging.log4j.util.Strings;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Slf4j @Slf4j
@Service @Service
...@@ -31,8 +24,6 @@ public class FirewallFilterService { ...@@ -31,8 +24,6 @@ public class FirewallFilterService {
@Resource @Resource
private FirewallRulesDao firewallRulesDao; private FirewallRulesDao firewallRulesDao;
@Resource
private DiscoveryClient discoveryClient;
@PostConstruct @PostConstruct
public void refresh() { public void refresh() {
...@@ -68,18 +59,7 @@ public class FirewallFilterService { ...@@ -68,18 +59,7 @@ public class FirewallFilterService {
public void updateFirewallRules(UpdateFirewallRulesRequest request) { public void updateFirewallRules(UpdateFirewallRulesRequest request) {
firewallRulesDao.update(request.getStatus(), request.getMode(), request.getAddresses()); firewallRulesDao.update(request.getStatus(), request.getMode(), request.getAddresses());
refresh(); this.refresh();
// 通过HTTP接口同步到所有的gateway节点(如何保证强一致性呢?)
RestTemplate restTemplate = new RestTemplate();
List<ServiceInstance> instances = discoveryClient.getInstances(GATEWAY_APPLICATION_NAME);
for (ServiceInstance instance : instances) {
String url = String.format("%s://%s:%s/cache/refresh",
instance.isSecure() ? "https" : "http",
instance.getHost(), instance.getPort());
restTemplate.getForEntity(url, ResultEntity.class);
log.info("sync ip rule cache to gateway node: {}", instance.getHost());
}
} }
} }
package com.gitee.sqlrest.core.util;
import cn.hutool.core.util.NumberUtil;
import com.gitee.sqlrest.common.consts.Constants;
import java.util.Map;
import lombok.experimental.UtilityClass;
@UtilityClass
public class PageSizeUtils {
public static int getPageFromParams(Map<String, Object> params) {
int page = (null == params.get(Constants.PARAM_PAGE_NUMBER))
? 1
: NumberUtil.parseInt(params.get(Constants.PARAM_PAGE_NUMBER).toString());
if (page <= 0) {
page = 1;
}
return page;
}
public static int getSizeFromParams(Map<String, Object> params) {
int size = (null == params.get(Constants.PARAM_PAGE_SIZE))
? 10
: NumberUtil.parseInt(params.get(Constants.PARAM_PAGE_SIZE).toString());
if (size <= 0) {
size = 10;
}
return size;
}
}
...@@ -19,6 +19,8 @@ import lombok.extern.slf4j.Slf4j; ...@@ -19,6 +19,8 @@ import lombok.extern.slf4j.Slf4j;
@UtilityClass @UtilityClass
public class SqlJdbcUtils { public class SqlJdbcUtils {
private static final int QUERY_TIMEOUT = 300;
public static boolean isQuerySQL(String sql) { public static boolean isQuerySQL(String sql) {
String upperSql = sql.toUpperCase().trim(); String upperSql = sql.toUpperCase().trim();
return upperSql.startsWith("SELECT") || upperSql.startsWith("WITH"); return upperSql.startsWith("SELECT") || upperSql.startsWith("WITH");
...@@ -29,23 +31,15 @@ public class SqlJdbcUtils { ...@@ -29,23 +31,15 @@ public class SqlJdbcUtils {
} }
public static Object execute(ProductTypeEnum productType, Connection connection, SqlMeta sqlMeta, public static Object execute(ProductTypeEnum productType, Connection connection, SqlMeta sqlMeta,
NamingStrategyEnum strategy, int page, int size) NamingStrategyEnum strategy, int page, int size) throws SQLException {
throws SQLException {
List<Object> paramValues = sqlMeta.getParameter(); List<Object> paramValues = sqlMeta.getParameter();
boolean isQuerySql = isQuerySQL(sqlMeta.getSql()); boolean isQuerySql = isQuerySQL(sqlMeta.getSql());
String sql = isQuerySql ? productType.getPageSql(sqlMeta.getSql()) : sqlMeta.getSql(); String sql = isQuerySql ? productType.getPageSql(sqlMeta.getSql()) : sqlMeta.getSql();
PreparedStatement statement = connection.prepareStatement(sql); PreparedStatement statement = connection.prepareStatement(sql);
statement.setQueryTimeout(300); statement.setQueryTimeout(QUERY_TIMEOUT);
statement.setFetchSize(isMySqlConnection(connection) ? Integer.MIN_VALUE : 100); statement.setFetchSize(isMySqlConnection(connection) ? Integer.MIN_VALUE : size);
if (isQuerySql) { if (isQuerySql) {
if (page <= 0) { productType.getPageConsumer().accept(page, size, paramValues);
page = 1;
}
if (size <= 0) {
size = 10;
}
paramValues.add(size);
paramValues.add((page - 1) * size);
} }
for (int i = 1; i <= paramValues.size(); i++) { for (int i = 1; i <= paramValues.size(); i++) {
statement.setObject(i, paramValues.get(i - 1)); statement.setObject(i, paramValues.get(i - 1));
......
package com.gitee.sqlrest.gateway.controller;
import com.gitee.sqlrest.common.dto.ResultEntity;
import com.gitee.sqlrest.core.gateway.FirewallFilterService;
import javax.annotation.Resource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/cache")
public class RefreshCacheController {
@Resource
private FirewallFilterService firewallFilterService;
@PostMapping(value = "/refresh", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity refresh() {
firewallFilterService.refresh();
return ResultEntity.success();
}
}
package com.gitee.sqlrest.gateway.filter;
import com.gitee.sqlrest.core.gateway.FirewallFilterService;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class FirewallRefreshService {
@Resource
private FirewallFilterService firewallFilterService;
/*每30秒执行一次*/
@EventListener(ApplicationReadyEvent.class)
@Scheduled(cron = "${cron.firewall.expression:0/30 0 * * * ?}")
public void loadFlowRules() {
try {
firewallFilterService.refresh();
} catch (Exception e) {
log.error("load firewall rules failed:{}", e.getMessage(), e);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment