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