Skip to content

Commit 2521861

Browse files
authored
fix performance optimization inner 1922 (#3489)
2 parents dc11d0f + b34a13d commit 2521861

File tree

8 files changed

+54
-23
lines changed

8 files changed

+54
-23
lines changed

src/main/java/com/actiontech/dble/config/model/sharding/SchemaConfig.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -289,11 +289,4 @@ private boolean isEquals(Set<String> o1, Set<String> o2) {
289289
return o1 == o2 || o1.equals(o2);
290290
}
291291

292-
public boolean charsetReplace(String tableName) {
293-
if (!tables.containsKey(tableName)) {
294-
return false;
295-
}
296-
return tables.get(tableName).isSpecifyCharset();
297-
}
298-
299292
}

src/main/java/com/actiontech/dble/route/parser/druid/impl/DruidInsertParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ private void parserSingleInsert(SchemaInfo schemaInfo, RouteResultset rrs, Strin
221221
int shardingColIndex = tryGetShardingColIndex(schemaInfo, insertStmt, partitionColumn);
222222
SQLExpr valueExpr = insertStmt.getValues().getValues().get(shardingColIndex);
223223
String dataType = getShardingDataType(schemaInfo, partitionColumn);
224-
String shardingValue = shardingValueToSting(valueExpr, clientCharset, dataType, schemaInfo);
224+
String shardingValue = shardingValueToSting(valueExpr, clientCharset, dataType);
225225
ShardingTableConfig tableConfig = (ShardingTableConfig) (schemaInfo.getSchemaConfig().getTables().get(schemaInfo.getTable()));
226226
checkDefaultValues(shardingValue, tableConfig.getName(), schemaInfo.getSchema(), partitionColumn);
227227
Integer nodeIndex = tableConfig.getFunction().calculate(shardingValue);
@@ -282,7 +282,7 @@ private void parserBatchInsert(SchemaInfo schemaInfo, RouteResultset rrs, String
282282
throw new SQLNonTransientException(msg);
283283
}
284284
SQLExpr expr = valueClause.getValues().get(shardingColIndex);
285-
String shardingValue = shardingValueToSting(expr, clientCharset, dataType, schemaInfo);
285+
String shardingValue = shardingValueToSting(expr, clientCharset, dataType);
286286
checkDefaultValues(shardingValue, tableConfig.getName(), schemaInfo.getSchema(), partitionColumn);
287287
Integer nodeIndex = tableConfig.getFunction().calculate(shardingValue);
288288
// null means can't find any valid index

src/main/java/com/actiontech/dble/route/parser/druid/impl/DruidInsertReplaceParser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.actiontech.dble.server.util.SchemaUtil;
2424
import com.actiontech.dble.services.mysqlsharding.ShardingService;
2525
import com.actiontech.dble.singleton.ProxyMeta;
26+
import com.actiontech.dble.util.CharsetContext;
2627
import com.actiontech.dble.util.HexFormatUtil;
2728
import com.actiontech.dble.util.StringUtil;
2829
import com.alibaba.druid.sql.ast.SQLExpr;
@@ -114,8 +115,7 @@ protected void tryRouteInsertQuery(ShardingService service, RouteResultset rrs,
114115
rrs.setFinishedRoute(true);
115116
}
116117

117-
static String shardingValueToSting(SQLExpr valueExpr, String clientCharset, String dataType, SchemaInfo schemaInfo) throws SQLNonTransientException {
118-
SchemaConfig schemaConfig = DbleServer.getInstance().getConfig().getSchemas().get(schemaInfo.getSchema());
118+
static String shardingValueToSting(SQLExpr valueExpr, String clientCharset, String dataType) throws SQLNonTransientException {
119119
String shardingValue = null;
120120
if (valueExpr instanceof SQLIntegerExpr) {
121121
SQLIntegerExpr intExpr = (SQLIntegerExpr) valueExpr;
@@ -135,7 +135,7 @@ static String shardingValueToSting(SQLExpr valueExpr, String clientCharset, Stri
135135
if (shardingValue == null && !(valueExpr instanceof SQLNullExpr)) {
136136
throw new SQLNonTransientException("Not Supported of Sharding Value EXPR :" + valueExpr.toString());
137137
}
138-
shardingValue = StringUtil.isoCharsetReplace(clientCharset, shardingValue, schemaConfig.charsetReplace(schemaInfo.getTable()));
138+
shardingValue = StringUtil.charsetReplace(clientCharset, CharsetContext.remove(), shardingValue);
139139
return shardingValue;
140140
}
141141

src/main/java/com/actiontech/dble/route/parser/druid/impl/DruidReplaceParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ private void parserBatchInsert(SchemaInfo schemaInfo, RouteResultset rrs, String
352352
throw new SQLNonTransientException(msg);
353353
}
354354
SQLExpr expr = valueClause.getValues().get(shardingColIndex);
355-
String shardingValue = shardingValueToSting(expr, clientCharset, dataType, schemaInfo);
355+
String shardingValue = shardingValueToSting(expr, clientCharset, dataType);
356356
Integer nodeIndex = tableConfig.getFunction().calculate(shardingValue);
357357
// no part find for this record
358358
if (nodeIndex == null || nodeIndex >= tableConfig.getShardingNodes().size()) {
@@ -394,7 +394,7 @@ private void parserSingleInsert(SchemaInfo schemaInfo, RouteResultset rrs, Strin
394394
int shardingColIndex = tryGetShardingColIndex(schemaInfo, replaceStatement, partitionColumn);
395395
SQLExpr valueExpr = replaceStatement.getValuesList().get(0).getValues().get(shardingColIndex);
396396
String dataType = getShardingDataType(schemaInfo, partitionColumn);
397-
String shardingValue = shardingValueToSting(valueExpr, clientCharset, dataType, schemaInfo);
397+
String shardingValue = shardingValueToSting(valueExpr, clientCharset, dataType);
398398
ShardingTableConfig tableConfig = (ShardingTableConfig) (schemaInfo.getSchemaConfig().getTables().get(schemaInfo.getTable()));
399399
Integer nodeIndex = tableConfig.getFunction().calculate(shardingValue);
400400
if (nodeIndex == null || nodeIndex >= tableConfig.getShardingNodes().size()) {

src/main/java/com/actiontech/dble/route/util/RouterUtil.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.actiontech.dble.singleton.ProxyMeta;
3030
import com.actiontech.dble.sqlengine.mpp.ColumnRoute;
3131
import com.actiontech.dble.sqlengine.mpp.RangeValue;
32+
import com.actiontech.dble.util.CharsetContext;
3233
import com.actiontech.dble.util.HexFormatUtil;
3334
import com.actiontech.dble.util.StringUtil;
3435
import com.alibaba.druid.sql.ast.SQLExpr;
@@ -586,8 +587,8 @@ private static String ruleCalculateSingleValue(String schemaName, ShardingTableC
586587
value = HexFormatUtil.fromHex(((SQLHexExpr) originValue).getHex(), CharsetUtil.getJavaCharset(clientCharset));
587588
}
588589
} else {
589-
SchemaConfig schemaConfig = DbleServer.getInstance().getConfig().getSchemas().get(schemaName);
590-
value = StringUtil.isoCharsetReplace(clientCharset, originValue.toString(), schemaConfig.charsetReplace(tc.getName()));
590+
String actualCharset = CharsetContext.remove();
591+
value = StringUtil.charsetReplace(clientCharset, actualCharset, originValue.toString());
591592
}
592593
Integer nodeIndex = tc.getFunction().calculate(value);
593594
if (nodeIndex == null) {

src/main/java/com/actiontech/dble/services/mysqlsharding/MySQLProtoLogicHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.actiontech.dble.route.parser.util.DruidUtil;
2020
import com.actiontech.dble.server.NonBlockingSession;
2121
import com.actiontech.dble.server.response.FieldList;
22+
import com.actiontech.dble.util.CharsetContext;
2223
import com.actiontech.dble.util.StringUtil;
2324
import com.alibaba.druid.sql.ast.SQLStatement;
2425
import com.google.common.collect.Sets;
@@ -90,6 +91,7 @@ public void query(byte[] data) {
9091
mm.position(position);
9192
sql = mm.readString(StringUtil.ISO_8859_1);
9293
((NonBlockingSession) service.getSession()).setIsoCharset(true);
94+
CharsetContext.put(StringUtil.ISO_8859_1);
9395
LOGGER.warn("Enforces {} to String, clientCharset sql is {}", StringUtil.ISO_8859_1, sql);
9496
} else {
9597
((NonBlockingSession) service.getSession()).setIsoCharset(false);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.actiontech.dble.util;
2+
3+
import java.util.Objects;
4+
5+
public final class CharsetContext {
6+
private CharsetContext() {
7+
}
8+
9+
private static final ThreadLocal<String> CHARSET_CTX = new ThreadLocal<>();
10+
11+
public static void put(String value) {
12+
CHARSET_CTX.set(value);
13+
}
14+
15+
public static String get() {
16+
return CHARSET_CTX.get();
17+
}
18+
19+
public static String remove() {
20+
String value = get();
21+
if (Objects.nonNull(value)) {
22+
CHARSET_CTX.remove();
23+
}
24+
return value;
25+
}
26+
}

src/main/java/com/actiontech/dble/util/StringUtil.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -644,20 +644,28 @@ public static boolean charsetParseString(String charsetEncode, byte[] values) {
644644
* @param value
645645
* @return
646646
*/
647-
public static String isoCharsetReplace(String clientCharset, String value, boolean charsetReplace) {
648-
if (!charsetReplace) {
649-
return value;
650-
}
647+
public static String isoCharsetReplace(String clientCharset, String value) {
651648
try {
652-
byte[] isoBytes = value.getBytes(ISO_8859_1);
653-
String isoValues = new String(isoBytes, ISO_8859_1);
649+
String isoValues = new String(value.getBytes(ISO_8859_1), ISO_8859_1);
654650
String clientValues = new String(value.getBytes(clientCharset), clientCharset);
655651
if (!equals(isoValues, clientValues) && equals(value, clientValues)) {
656652
return value;
657653
}
658654
if (charsetParseString(clientCharset, value.getBytes(clientCharset))) {
659-
value = new String(isoBytes, clientCharset);
655+
value = new String(value.getBytes(ISO_8859_1), clientCharset);
656+
}
657+
} catch (Exception e) {
658+
return value;
659+
}
660+
return value;
661+
}
662+
663+
public static String charsetReplace(String clientCharset, String actualCharset, String value) {
664+
try {
665+
if (isBlank(actualCharset)) {
666+
return value;
660667
}
668+
value = new String(value.getBytes(ISO_8859_1), clientCharset);
661669
} catch (Exception e) {
662670
return value;
663671
}
@@ -684,6 +692,7 @@ public static boolean isDoubleOrFloat(String str) {
684692
Pattern pattern = Pattern.compile("^[-\\+]?[.\\d]*$");
685693
return pattern.matcher(str).matches();
686694
}
695+
687696
/**
688697
* <p>
689698
* src: https://stackoverflow.com/questions/26357938/detect-chinese-character-in-java/26357985

0 commit comments

Comments
 (0)