Роль базы данных H2 в Apache Ignite

У меня есть задание Apache Spark, и один из его компонентов запускает запросы в Apache Ignite Data Grid с использованием Ignite SQL, и запрос представляет собой SQLFieldsQuery. Я просматривал дамп потока, и в одном из журналов Executor я увидел следующее:

org.h2.mvstore.db.TransactionStore.begin(TransactionStore.java:229)

org.h2.engine.Session.getTransaction(Session.java:1580)

org.h2.engine.Session.getStatementSavepoint(Session.java:1588)

org.h2.engine.Session.setSavepoint(Session.java:793)

org.h2.command.Command.executeUpdate(Command.java:252)

org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:130)

org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:115)

org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.connectionForThread(IgniteH2Indexing.java:428)

org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.connectionForSpace(IgniteH2Indexing.java:360)

org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryLocalSqlFields(IgniteH2Indexing.java:770)

org.apache.ignite.internal.processors.query.GridQueryProcessor$5.applyx(GridQueryProcessor.java:892)

org.apache.ignite.internal.processors.query.GridQueryProcessor$5.applyx(GridQueryProcessor.java:886)

org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36)

org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:1666)

org.apache.ignite.internal.processors.query.GridQueryProcessor.queryLocalFields(GridQueryProcessor.java:886)

org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:698)

com.test.ignite.cache.CacheWrapper.queryFields(CacheWrapper.java:1019)

Последняя строка в моем коде выполняет запрос полей sql следующим образом:

SqlFieldsQuery sql = new SqlFieldsQuery(queryString).setArgs(args);
cache.query(sql);

Насколько я понимаю, Ignite имеет свою собственную сетку данных, которую он использует для хранения данных и индексов кеша. Он использует базу данных H2 только для анализа SQL-запроса и получения плана выполнения запроса.

Но дамп потока показывает, что выполняются обновления и участвуют транзакции. Я не понимаю необходимость транзакций или обновлений в запросе выбора SQL.

Я хочу знать следующее о роли базы данных H2 в Ignite:

  • Я вошел в открытый исходный код Apache Ignite(версия 1.7.0) и увидел, что он пытается открыть соединение с определенной схемой в базе данных H2, выполнив запрос SET SCHEMA имя_схемы (метод connectionForThread() класса IgniteH2Indexing). Для каждого кэша создана одна схема или одна таблица? Если да, то какую информацию она содержит, поскольку все данные хранятся в сетке данных ignite.

  • Я также натолкнулся на еще одну интересную вещь в открытом исходном коде, которая заключается в том, что Ignite пытается получить имя схемы в H2 из имени пространства (ссылку можно найти в методе queryLocalSqlFields() класса IgniteH2Indexing). Я хочу знать, что означает это имя пространства и является ли оно внутренним для Ignite или настраиваемым?

  • Произойдет ли настройка схемы и соединения с H2 db для каждого моего SQL-запроса, если да, то есть ли способ избежать этого?

1 ответ

  1. Да мы звоним executeUpdate установить схему. В Ignite 2.x мы сможем перейти на Connection.setSchema для этого. Прямо сейчас мы создаем схему SQL для каждого кэша, и вы можете создать в ней несколько таблиц, но это будет изменено в будущем. На самом деле он ничего не содержит, мы просто используем некоторые API H2.
  2. Пространственное имя - это то же самое, что и имя кеша. Вы можете настроить имя схемы SQL для кэша, используя CacheConfiguration.setSqlSchema,
  3. Если вы выполняете запросы, используя один и тот же экземпляр кэша, схема не изменится.
Другие вопросы по тегам