diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/parsing/ParsingResultCache.java b/sharding-core/src/main/java/io/shardingjdbc/core/parsing/ParsingResultCache.java new file mode 100644 index 0000000000000..95cdbba77fe2d --- /dev/null +++ b/sharding-core/src/main/java/io/shardingjdbc/core/parsing/ParsingResultCache.java @@ -0,0 +1,67 @@ +/* + * Copyright 1999-2015 dangdang.com. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ */ + +package io.shardingjdbc.core.parsing; + +import io.shardingjdbc.core.parsing.parser.sql.SQLStatement; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.Map; +import java.util.WeakHashMap; + +/** + * Parsing result cache. + * + * @author zhangliang + */ +@NoArgsConstructor(access = AccessLevel.NONE) +public final class ParsingResultCache { + + private static final ParsingResultCache INSTANCE = new ParsingResultCache(); + + private volatile Map cache = new WeakHashMap<>(65535, 1); + + /** + * Get parsing result cache instance. + * + * @return parsing result cache instance + */ + public static ParsingResultCache getInstance() { + return INSTANCE; + } + + /** + * Put SQL and parsing result into cache. + * + * @param sql SQL + * @param sqlStatement SQL statement + */ + public void put(final String sql, final SQLStatement sqlStatement) { + cache.put(sql, sqlStatement); + } + + /** + * Get SQL statement. + * + * @param sql SQL + * @return SQL statement + */ + public SQLStatement getSQLStatement(final String sql) { + return cache.get(sql); + } +} diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/parsing/SQLParsingEngine.java b/sharding-core/src/main/java/io/shardingjdbc/core/parsing/SQLParsingEngine.java index 37918d13dffac..a24feb806f9dd 100755 --- a/sharding-core/src/main/java/io/shardingjdbc/core/parsing/SQLParsingEngine.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/parsing/SQLParsingEngine.java @@ -45,6 +45,10 @@ public final class SQLParsingEngine { * @return parsed SQL statement */ public SQLStatement parse() { + SQLStatement cachedSQLStatement = ParsingResultCache.getInstance().getSQLStatement(sql); + if (null != cachedSQLStatement) { + return cachedSQLStatement; + } LexerEngine lexerEngine = LexerEngineFactory.newInstance(dbType, sql); lexerEngine.nextToken(); return SQLParserFactory.newInstance(dbType, lexerEngine.getCurrentToken().getType(), shardingRule, lexerEngine).parse(); diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/PreparedStatementRegistry.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/PreparedStatementRegistry.java index 577581e37b891..f5339c1dc9c62 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/PreparedStatementRegistry.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/transport/mysql/packet/command/statement/PreparedStatementRegistry.java @@ -34,7 +34,7 @@ public final class PreparedStatementRegistry { private static final PreparedStatementRegistry INSTANCE = new PreparedStatementRegistry(); - private final ConcurrentMap sqlAndStatementIdMap = new ConcurrentHashMap<>(Integer.MAX_VALUE, 1); + private final ConcurrentMap sqlAndStatementIdMap = new ConcurrentHashMap<>(65535, 1); private final AtomicInteger sequence = new AtomicInteger();