Calcite SQLParser является потокобезопасным.

при выполнении такого теста попадание в разные исключения при каждом запуске теста.

private static void testInParallelCaliciteParser() {
    SqlParser parser = SqlParser.create("select * from test",
            SqlParser.configBuilder().setConformance(SqlConformanceEnum.DEFAULT).build());
    ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
    Runnable runnableTask = () -> {
        Instant startTime = Instant.now();
        try {
            //synchronized (parser) {                   
                SqlNode parseQuery = parser.parseQuery("select COUNT(*) FROM common.test_table");
            //}
            System.out.println(new Date() + " [" + Thread.currentThread().getName()
                    + "] after parsing qry, time taken in millis >> "
                    + Duration.between(startTime, Instant.now()).toMillis());
        } catch (SqlParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    };
    IntStream.range(0, 4).forEach(i -> executor.submit(runnableTask));
}

вот исключение.

org.apache.calcite.sql.parser.SqlParseException: обнаружен выбор в строке 1, столбце 1. Ожидалось одно из: ABS... ALTER... ARRAY... AVG... CALL... CARDINALITY... CASE ... CAST ... CEIL ... CEILING ... CHAR_LENGTH ... CHARACTER_LENGTH ... CLASSIFIER ... COALESCE ... COLLECT ... CONVERT ... COUNT ... COVAR_POP ... COVAR_SAMP . .. CUME_DIST ... CURRENT ... CURRENT_CATALOG ... CURRENT_DATE ... CURRENT_DEFAULT_TRANSFORM_GROUP ... CURRENT_PATH ... CURRENT_ROLE ... CURRENT_SCHEMA ... CURRENT_TIME ... CURRENT_TIMESTAMP ... CURRENT_USER ... CURSOR ... DATE ... DELETE ... DENSE_RANK ... DESCRIBE ... ELEMENT ... EVERY ... EXISTS ... EXP ... EXPLAIN ... EXTRACT ... FALSE ... FIRST_VALUE ... FLOOR . .. FUSION... ГРУППИРОВКА... ЧАС... ВСТАВКА... ПЕРЕСЕЧЕНИЕ... ИНТЕРВАЛ... JSON_ARRAY... JSON_ARRAYAGG... JSON_EXISTS... JSON_OBJECT... JSON_OBJECTAGG... JSON_QUERY... JSON_VALUE... LAG... LAST_VALUE... LEAD... LEFT... LN... LOCALTIME... LOCALTIMESTAMP... LOWER... MATCH_NUMBER.. MAX... MERGE... MIN... MINUTE... MOD... MONTH... MULTISET... NEW... NEXT... NOT... NTH_VALUE... NTILE... NULL ... NULLIF ... OCTET_LENGTH ... OVERLAY ... PERCENT_RANK ... PERIOD ... POSITION ... POWER ... PREV ... RANK ... REGR_COUNT ... REGR_SXX ... REGR_SYY .. .RESET... RIGHT... ROW... ROW_NUMBER... RUNNING... SECOND... SELECT... SESSION_USER... SET... SOME... SPECIFIC... SQRT... STDDEV_POP ... STDDEV_SAMP ... SUBSTRING ... SUM ... SYSTEM_USER ... TABLE ... TIME ... TIMESTAMP ... TRANSLATE ... TRIM ... TRUE ... TRUNCATE ... UNKNOWN .. ОБНОВЛЕНИЕ... ЗАПИСЬ... ОБНОВЛЕНИЕ... ПОЛЬЗОВАТЕЛЬ... ЗНАЧЕНИЯ... VAR_POP... VAR_SAMP... С... ГОД... ‹UNSIGNED_INTEGER_LITERAL›... ‹APPROX_NUMERIC_LITERAL›... ‹ DECIMAL_NUMERIC_LITERAL› ... ‹BINARY_STRING_LITERAL› … ‹QUOTED_STRING› … ‹PREFIXED_STRING_LITERAL› … ‹UNICODE_STRING_LITERAL› … ( ... ‹LBRACE_D› … ‹LBRACE_T› … ‹LBRACE_TS› .. ‹LBRACE_FN› ... ? ... + ... - ... ‹BRACKET_QUOTED_IDENTIFIER› … ‹QUOTED_IDENTIFIER› … ‹BACK_QUOTED_IDENTIFIER› … … ‹UNICODE_QUOTED_IDENTIFIER› …

at org.apache.calcite.sql.parser.impl.SqlParserImpl.convertException(SqlParserImpl.java:365)
at org.apache.calcite.sql.parser.impl.SqlParserImpl.normalizeException(SqlParserImpl.java:150)
at org.apache.calcite.sql.parser.SqlParser.handleException(SqlParser.java:148)
at org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:163)
at org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:178)
at com.apporchid.cloudseer.db.qry.helper.TestMultiThreadSafe.lambda$5(TestMultiThreadSafe.java:142)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)

Вызвано: org.apache.calcite.sql.parser.impl.ParseException: обнаружен выбор в строке 1, столбце 1. Ожидалось одно из: ABS... ALTER... ARRAY... AVG... CALL.. .CARDINALITY... CASE... CAST... CEIL... CEILING... CHAR_LENGTH... CHARACTER_LENGTH... CLASSIFIER... COALESCE... COLLECT... CONVERT... COUNT... COVAR_POP ... COVAR_SAMP ... CUME_DIST ... CURRENT ... CURRENT_CATALOG ... CURRENT_DATE ... CURRENT_DEFAULT_TRANSFORM_GROUP ... CURRENT_PATH ... CURRENT_ROLE ... CURRENT_SCHEMA ... CURRENT_TIME ... CURRENT_TIMESTAMP ... CURRENT_USER .. CURSOR... DATE... DELETE... DENSE_RANK... DESCRIBE... ELEMENT... EVERY... EXISTS... EXP... EXPLAIN... EXTRACT... FALSE... FIRST_VALUE ... ПОЛ ... ОБЪЕДИНЕНИЕ ... ГРУППИРОВКА ... ЧАС ... ВСТАВКА ... ПЕРЕСЕЧЕНИЕ ... ИНТЕРВАЛ ... JSON_ARRAY ... JSON_ARRAYAGG ... JSON_EXISTS ... JSON_OBJECT ... JSON_OBJECTAGG .. JSON_QUERY ... JSON_VALUE ... LAG ... LAST_VALUE ... LEAD ... LEFT ... LN ... LOCALTIME ... LOCALTIMESTAMP ... LOWER ... MA TCH_NUMBER ... MAX ... MERGE ... MIN ... MINUTE ... MOD ... MONTH ... MULTISET ... NEW ... NEXT ... NOT ... NTH_VALUE ... NTILE . .. NULL ... NULLIF ... OCTET_LENGTH ... OVERLAY ... PERCENT_RANK ... PERIOD ... POSITION ... POWER ... PREV ... RANK ... REGR_COUNT ... REGR_SXX ... REGR_SYY ... RESET ... RIGHT ... ROW ... ROW_NUMBER ... RUNNING ... SECOND ... SELECT ... SESSION_USER ... SET ... SOME ... SPECIFIC ... SQRT . .. STDDEV_POP ... STDDEV_SAMP ... SUBSTRING ... SUM ... SYSTEM_USER ... TABLE ... TIME ... TIMESTAMP ... TRANSLATE ... TRIM ... TRUE ... TRUNCATE ... UNKNOWN ... UPDATE ... UPPER ... UPSERT ... USER ... VALUES ... VAR_POP ... VAR_SAMP ... WITH ... YEAR ... ‹UNSIGNED_INTEGER_LITERAL› … ‹APPROX_NUMERIC_LITERAL› . .. ‹DECIMAL_NUMERIC_LITERAL› ... ‹BINARY_STRING_LITERAL› ... ‹QUOTED_STRING› ... ‹PREFIXED_STRING_LITERAL› ... ‹UNICODE_STRING_LITERAL› ... ( ... ‹LBRACE_D› ... ‹LBRACE_T› ... ‹LBRACE_TS › ... ‹LBRACE_FN› ... ? ... + ... - ... ‹BRACKET_QUOTED_IDENTIFIER› … ‹QUOTED_IDENTIFIER› … ‹BACK_QUOTED_IDENTIFIER› … … ‹UNICODE_QUOTED_IDENTIFIER› …

at org.apache.calcite.sql.parser.impl.SqlParserImpl.generateParseException(SqlParserImpl.java:32563)
at org.apache.calcite.sql.parser.impl.SqlParserImpl.jj_consume_token(SqlParserImpl.java:32377)
at org.apache.calcite.sql.parser.impl.SqlParserImpl.SqlStmt(SqlParserImpl.java:3679)
at org.apache.calcite.sql.parser.impl.SqlParserImpl.SqlStmtEof(SqlParserImpl.java:3691)
at org.apache.calcite.sql.parser.impl.SqlParserImpl.parseSqlStmtEof(SqlParserImpl.java:197)
at org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:161)
... 7 more

Потокобезопасность не является явной целью проектирования синтаксического анализатора, поэтому не стоит рассчитывать на то, что он будет поточно-ориентированным. Если вы считаете, что это серьезная проблема, я предлагаю начать обсуждение в списке рассылки Calcite ([email protected]), чтобы обсудить возможные решения, которые могут потребовать внесения изменений в сам Calcite.


person Suresh Kumar Vepari    schedule 29.06.2020    source источник
comment
Кроме того, если вы спрашиваете об исключениях, с которыми вы сталкиваетесь, было бы полезно опубликовать эти исключения.   -  person Michael Mior    schedule 30.06.2020
comment
@MichaelMior обновил мой пост, указав детали исключений.   -  person Michael Mior    schedule 30.06.2020
comment
Это не отвечает на ваш вопрос о потокобезопасности синтаксического анализатора, но есть ли причина, по которой вы не можете просто создать новый синтаксический анализатор для каждого потока? Я не думаю, что накладные расходы памяти будут значительными.   -  person Suresh Kumar Vepari    schedule 01.07.2020
comment
@Майкл Миор, каждый раз это заставляет меня тратить немного больше времени   -  person Michael Mior    schedule 01.07.2020
comment
org.apache.calcite.sql.parser.SqlParseException: выражение, не являющееся запросом, обнаружено в недопустимом контексте в org.apache.calcite.sql.parser.impl.SqlParserImpl.convertException(SqlParserImpl.java:365) в org.apache.calcite. sql.parser.impl.SqlParserImpl.normalizeException(SqlParserImpl.java:150) в org.apache.calcite.sql.parser.SqlParser.handleException(SqlParser.java:148) в org.apache.calcite.sql.parser.SqlParser. parseQuery(SqlParser.java:163) в org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:178) в com.apporchid.cloudseer.db.qry.helper.TestMultiThreadSafe.lambda$5(TestMultiThreadSafe.java :142) в java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) в java.util.concurrent.FutureTask.run(FutureTask.java:266) в java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1142) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) в java.lang.Thread.run(Thread.java:748) Вызвано: org.apache.calcite.runtime .Расч iteException: выражение, не являющееся запросом, встречается в недопустимом контексте в sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) в sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java: 45) в java.lang.reflect.Constructor.newInstance(Constructor.java:423) в org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:457) в org.apache.calcite.runtime.Resources $ExInst.ex(Resources.java:550) в org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:857) в org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:842) в org.apache.calcite.sql.parser.impl.SqlParserImpl.checkNonQueryExpression(SqlParserImpl.java:309) в org.apache.calcite.sql.parser.impl.SqlParserImpl.Expression3(SqlParserImpl.java:14388) в org.apache. calcite.sql.parser.impl.SqlParserImpl.Expression2b(SqlParserImpl.java:14057) на org.apache.calcit e.sql.parser.impl.SqlParserImpl.Expression2(SqlParserImpl.java:14098) в org.apache.calcite.sql.parser.impl.SqlParserImpl.Expression(SqlParserImpl.java:14029) в org.apache.calcite.sql. parser.impl.SqlParserImpl.LeafQueryOrExpr(SqlParserImpl.java:14006) в org.apache.calcite.sql.parser.impl.SqlParserImpl.QueryOrExpr(SqlParserImpl.java:13478) в org.apache.calcite.sql.parser.impl. SqlParserImpl.OrderedQueryOrExpr(SqlParserImpl.java:481) в org.apache.calcite.sql.parser.impl. SqlParserImpl.SqlStmt(SqlParserImpl.java:3653) в org.apache.calcite.sql.parser.impl.SqlParserImpl.SqlStmtEof(SqlParserImpl.java:3691) в org.apache.calcite.sql.parser.impl.SqlParserImpl.parseSqlStmtEof SqlParserImpl.java:197) в org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:161) ... еще 7   -  person Suresh Kumar Vepari    schedule 02.07.2020


Ответы (1)


Есть ли причина, по которой вы не можете создать новый объект парсера для каждого потока?

person Michael Mior    schedule 02.07.2020