H2数据库在Apache Ignite中的作用

时间:2017-05-08 19:20:04

标签: h2 ignite gridgain

我有一个Apache Spark Job,它的一个组件使用Ignite SQL在Apache Ignite Data Grid上触发查询,查询是一个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查询并获得查询执行计划。

但是,Thread转储显示正在执行更新并涉及事务。我不理解SQL Select Query中对事务或更新的需要。

我想了解以下关于H2数据库在Ignite中的作用:

  • 我进入Apache Ignite(1.7.0版)的开源代码,看到它试图通过执行查询 SET SCHEMA schema_name <打开与H2数据库中特定模式的连接/ strong>(IgniteH2Indexing类的connectionForThread()方法)。是为每个缓存创建一个模式还是一个表?如果是,那么它包含哪些信息,因为所有数据都存储在ignite的数据网格中。

  • 我在开源代码中也遇到了另一个有趣的事情,即Ignite尝试从空间名称中导出H2中的模式名称(引用可以在IgniteH2Indexing类的queryLocalSqlFields()方法中找到)。我想知道这个空间名称表示什么,它是Ignite内部可配置的还是可配置的?

  • 我的每个SQL查询都会为每个SQL查询设置模式和H2连接,如果是,那么有什么方法可以避免这种情况吗?

1 个答案:

答案 0 :(得分:1)

  1. 是的,我们致电executeUpdate来设置架构。在Ignite 2.x中,我们可以切换到Connection.setSchema。现在我们为每个缓存创建SQL模式,您可以在其中创建多个表,但这将在未来进行更改。它实际上并不包含任何内容,我们只使用一些H2 API。
  2. 空格名称与缓存名称基本相同。您可以使用CacheConfiguration.setSqlSchema为缓存配置SQL架构名称。
  3. 如果使用相同的缓存实例运行查询,则架构不会更改。