This is an automated email from the ASF dual-hosted git repository.
chengzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new b06bfdc0631 Update cache option when getSQLStatementParserEngine.
(#35371)
b06bfdc0631 is described below
commit b06bfdc06312152e6d7e7c47d863bd8c21bda738
Author: Cong Hu <[email protected]>
AuthorDate: Mon May 12 14:41:38 2025 +0800
Update cache option when getSQLStatementParserEngine. (#35371)
---
.../infra/parser/cache/CacheManager.java} | 26 ++++++++++++----------
.../parser/cache/SQLStatementCacheBuilder.java | 8 ++++---
.../parser/cache/SQLStatementCacheLoader.java | 9 ++++++++
.../infra/parser/sql/SQLStatementParserEngine.java | 21 +++++++++++++----
.../sql/SQLStatementParserEngineFactory.java | 3 +--
.../parser/sql/SQLStatementParserExecutor.java | 9 ++++++++
.../parser/cache/SQLStatementCacheBuilderTest.java | 3 +--
.../sql/SQLStatementParserEngineFactoryTest.java | 3 +--
.../sql/parser/api/SQLParserEngine.java | 9 ++++++++
9 files changed, 66 insertions(+), 25 deletions(-)
diff --git
a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/CacheManager.java
similarity index 60%
copy from
infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
copy to
infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/CacheManager.java
index 63d78242d37..379cd075f53 100644
---
a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
+++
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/CacheManager.java
@@ -17,19 +17,21 @@
package org.apache.shardingsphere.infra.parser.cache;
+import com.github.benmanes.caffeine.cache.CacheLoader;
import com.github.benmanes.caffeine.cache.LoadingCache;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.sql.parser.api.CacheOption;
-import org.junit.jupiter.api.Test;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
-import static org.hamcrest.CoreMatchers.isA;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-class SQLStatementCacheBuilderTest {
+/**
+ * Cache manager.
+ * @param <K> the type of keys maintained by this cache
+ * @param <V> the type of mapped values
+ */
+@RequiredArgsConstructor
+@Getter
+public class CacheManager<K, V> {
+
+ private final LoadingCache<K, V> cache;
- @Test
- void assertBuild() {
-
assertThat(SQLStatementCacheBuilder.build(TypedSPILoader.getService(DatabaseType.class,
"SQL92"), new CacheOption(2000, 65535L), new CacheOption(128, 1024L)),
isA(LoadingCache.class));
- }
+ private final CacheLoader<K, V> cacheLoader;
}
diff --git
a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java
index 648a453764b..c28195f092b 100644
---
a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java
+++
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java
@@ -39,9 +39,11 @@ public final class SQLStatementCacheBuilder {
* @param databaseType database type
* @return built SQL statement cache
*/
- public static LoadingCache<String, SQLStatement> build(final DatabaseType
databaseType, final CacheOption sqlStatementCacheOption,
+ public static CacheManager<String, SQLStatement> build(final DatabaseType
databaseType, final CacheOption sqlStatementCacheOption,
final CacheOption
parseTreeCacheOption) {
- return
Caffeine.newBuilder().softValues().initialCapacity(sqlStatementCacheOption.getInitialCapacity()).maximumSize(sqlStatementCacheOption.getMaximumSize())
- .build(new SQLStatementCacheLoader(databaseType,
parseTreeCacheOption));
+ SQLStatementCacheLoader sqlStatementCacheLoader = new
SQLStatementCacheLoader(databaseType, parseTreeCacheOption);
+ LoadingCache<String, SQLStatement> loadingCache =
+
Caffeine.newBuilder().softValues().initialCapacity(sqlStatementCacheOption.getInitialCapacity()).maximumSize(sqlStatementCacheOption.getMaximumSize()).build(sqlStatementCacheLoader);
+ return new CacheManager<>(loadingCache, sqlStatementCacheLoader);
}
}
diff --git
a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
index 3df17d6031e..f4df2c4a584 100644
---
a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
+++
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
@@ -36,6 +36,15 @@ public final class SQLStatementCacheLoader implements
CacheLoader<String, SQLSta
sqlStatementParserExecutor = new
SQLStatementParserExecutor(databaseType, parseTreeCacheOption);
}
+ /**
+ * Update cache option.
+ *
+ * @param parseTreeCacheOption parse tree cache option
+ */
+ public void updateCacheOption(final CacheOption parseTreeCacheOption) {
+ sqlStatementParserExecutor.updateCacheOption(parseTreeCacheOption);
+ }
+
@ParametersAreNonnullByDefault
@Override
public SQLStatement load(final String sql) {
diff --git
a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
index 48bcefc3fc9..72313e24e16 100644
---
a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
+++
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
@@ -17,10 +17,11 @@
package org.apache.shardingsphere.infra.parser.sql;
-import com.github.benmanes.caffeine.cache.LoadingCache;
import lombok.Getter;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.parser.cache.CacheManager;
import org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheBuilder;
+import org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheLoader;
import org.apache.shardingsphere.sql.parser.api.CacheOption;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
@@ -31,7 +32,7 @@ public final class SQLStatementParserEngine {
private final SQLStatementParserExecutor sqlStatementParserExecutor;
- private final LoadingCache<String, SQLStatement> sqlStatementCache;
+ private final CacheManager<String, SQLStatement> sqlStatementCacheManager;
@Getter
private final CacheOption sqlStatementCacheOption;
@@ -41,11 +42,23 @@ public final class SQLStatementParserEngine {
public SQLStatementParserEngine(final DatabaseType databaseType, final
CacheOption sqlStatementCacheOption, final CacheOption parseTreeCacheOption) {
sqlStatementParserExecutor = new
SQLStatementParserExecutor(databaseType, parseTreeCacheOption);
- sqlStatementCache = SQLStatementCacheBuilder.build(databaseType,
sqlStatementCacheOption, parseTreeCacheOption);
+ sqlStatementCacheManager =
SQLStatementCacheBuilder.build(databaseType, sqlStatementCacheOption,
parseTreeCacheOption);
this.sqlStatementCacheOption = sqlStatementCacheOption;
this.parseTreeCacheOption = parseTreeCacheOption;
}
+ /**
+ * Update cache option.
+ *
+ * @param sqlStatementCacheOption SQL statement cache option
+ * @param parseTreeCacheOption parse tree cache option
+ */
+ public void updateCacheOption(final CacheOption sqlStatementCacheOption,
final CacheOption parseTreeCacheOption) {
+
sqlStatementCacheManager.getCache().policy().eviction().ifPresent(eviction ->
eviction.setMaximum(sqlStatementCacheOption.getMaximumSize()));
+ ((SQLStatementCacheLoader)
sqlStatementCacheManager.getCacheLoader()).updateCacheOption(parseTreeCacheOption);
+ sqlStatementParserExecutor.updateCacheOption(parseTreeCacheOption);
+ }
+
/**
* Parse to SQL statement.
*
@@ -54,6 +67,6 @@ public final class SQLStatementParserEngine {
* @return SQL statement
*/
public SQLStatement parse(final String sql, final boolean useCache) {
- return useCache ? sqlStatementCache.get(sql) :
sqlStatementParserExecutor.parse(sql);
+ return useCache ? sqlStatementCacheManager.getCache().get(sql) :
sqlStatementParserExecutor.parse(sql);
}
}
diff --git
a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java
index 923fb8facc4..b58c83e849b 100644
---
a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java
+++
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java
@@ -46,8 +46,7 @@ public final class SQLStatementParserEngineFactory {
if (null == result) {
result = ENGINES.computeIfAbsent(databaseType, key -> new
SQLStatementParserEngine(key, sqlStatementCacheOption, parseTreeCacheOption));
} else if
(!result.getSqlStatementCacheOption().equals(sqlStatementCacheOption) ||
!result.getParseTreeCacheOption().equals(parseTreeCacheOption)) {
- result = new SQLStatementParserEngine(databaseType,
sqlStatementCacheOption, parseTreeCacheOption);
- ENGINES.put(databaseType, result);
+ result.updateCacheOption(sqlStatementCacheOption,
parseTreeCacheOption);
}
return result;
}
diff --git
a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java
index def8e58a088..2ce64f66c62 100644
---
a/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java
+++
b/infra/parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java
@@ -37,6 +37,15 @@ public final class SQLStatementParserExecutor {
visitorEngine = new SQLStatementVisitorEngine(databaseType);
}
+ /**
+ * Update cache option.
+ *
+ * @param parseTreeCacheOption parse tree cache option
+ */
+ public void updateCacheOption(final CacheOption parseTreeCacheOption) {
+ parserEngine.updateCacheOption(parseTreeCacheOption);
+ }
+
/**
* Parse to SQL statement.
*
diff --git
a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
b/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
index 63d78242d37..6739dd1eb0b 100644
---
a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
+++
b/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.infra.parser.cache;
-import com.github.benmanes.caffeine.cache.LoadingCache;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.sql.parser.api.CacheOption;
@@ -30,6 +29,6 @@ class SQLStatementCacheBuilderTest {
@Test
void assertBuild() {
-
assertThat(SQLStatementCacheBuilder.build(TypedSPILoader.getService(DatabaseType.class,
"SQL92"), new CacheOption(2000, 65535L), new CacheOption(128, 1024L)),
isA(LoadingCache.class));
+
assertThat(SQLStatementCacheBuilder.build(TypedSPILoader.getService(DatabaseType.class,
"SQL92"), new CacheOption(2000, 65535L), new CacheOption(128, 1024L)),
isA(CacheManager.class));
}
}
diff --git
a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactoryTest.java
b/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactoryTest.java
index 0f56b81c6fe..58c4dc7dbe3 100644
---
a/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactoryTest.java
+++
b/infra/parser/src/test/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactoryTest.java
@@ -22,7 +22,6 @@ import
org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.sql.parser.api.CacheOption;
import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertSame;
class SQLStatementParserEngineFactoryTest {
@@ -33,7 +32,7 @@ class SQLStatementParserEngineFactoryTest {
void assertGetSQLStatementParserEngineNotSame() {
SQLStatementParserEngine before =
SQLStatementParserEngineFactory.getSQLStatementParserEngine(databaseType, new
CacheOption(2000, 65535L), new CacheOption(64, 1024L));
SQLStatementParserEngine after =
SQLStatementParserEngineFactory.getSQLStatementParserEngine(databaseType, new
CacheOption(2000, 65535L), new CacheOption(128, 1024L));
- assertNotSame(before, after);
+ assertSame(before, after);
}
@Test
diff --git
a/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java
b/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java
index 9b3929ee8dd..3f6917c4d1c 100644
---
a/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java
+++
b/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngine.java
@@ -42,6 +42,15 @@ public final class SQLParserEngine {
this(TypedSPILoader.getService(DatabaseType.class, databaseType),
cacheOption);
}
+ /**
+ * Update cache option.
+ *
+ * @param cacheOption cache option
+ */
+ public void updateCacheOption(final CacheOption cacheOption) {
+ parseTreeCache.policy().eviction().ifPresent(eviction ->
eviction.setMaximum(cacheOption.getMaximumSize()));
+ }
+
/**
* Parse SQL.
*