You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2025/05/12 06:41:44 UTC

(shardingsphere) branch master updated: Update cache option when getSQLStatementParserEngine. (#35371)

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 <ia...@gmail.com>
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.
      *