我有一个Apache Spark作业,其中一个组件使用Ignite SQL在Apache Ignite Data Grid中引发查询,并且查询是SQLFieldsQuery。我经历的线程转储和执行程序中的日志之一,我看到以下内容:H2数据库在Apache Ignite中的角色
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 fields查询:
SqlFieldsQuery sql = new SqlFieldsQuery(queryString).setArgs(args);
cache.query(sql);
据我了解,Ignite拥有自己的数据网格,用于存储缓存数据和索引。它只利用H2数据库来解析SQL查询并获取查询执行计划。
但是,线程转储显示正在执行更新并涉及事务。我不明白在SQL Select Query中需要事务或更新。
我想知道H2的数据库中点燃的作用下:
我走进阿帕奇点燃(版本1.7.0)的开放式源代码,看到有人试图打开通过执行查询SET SCHEMA schema_name(IgniteH2Indexing类的connectionForThread()方法)连接到H2数据库中的特定模式。是为每个缓存创建一个模式还是一个表?如果是的话,它包含了什么信息,因为所有的数据都存储在点火的数据网格中。
我还在开源代码中发现了另一个有趣的事情,那就是Ignite试图从空间名称中导出H2中的模式名称(可以在IgniteH2Indexing类的queryLocalSqlFields()方法中找到该引用)。我想知道这个空间名称表示什么,它是Ignite内部的还是可配置的?
模式和连接H2数据库的设置会发生每个我的SQL查询,如果是的话有什么办法来避免这种情况?
谢谢@Sergi的快速回复。因此,如果我使用CacheConfiguration.setSqlSchema并为我的所有缓存提供自己的模式名称,那么查询查询性能应该会显着提高,因为它不必为每个查询设置模式,并且只能重复使用到H2数据库的一个连接? –
正如您所提到的,每个缓存都可以创建一个SQL模式,其中可以包含多个表。为什么每个缓存创建多个表,它有什么用处? 。我认为这是每个Ignite Grid一个模式,它包含多个表,其中每个表代表Ignite Cache。 –
@AnikethJain正如Sergi提到的那样,目前您可以在单个缓存中创建多个表,但不建议这样做。从2.1开始,您只能为每个缓存创建一个表。 – Dmitriy