h2 - H2数据库在Apache Ignite中的作用

标签 h2 ignite gridgain

我有一个 Apache Spark 作业,它的一个组件使用 Ignite SQL 在 Apache Ignite 数据网格上触发查询,查询是一个 SQLFieldsQuery。我正在查看线程转储,并在其中一个执行程序日志中看到以下内容:

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)的开源代码,发现它试图通过执行查询 SET SCHEMA schema_name< 打开与 H2 数据库中特定模式的连接/strong>(IgniteH2Indexing 类的 connectionForThread() 方法)。是否为每个缓存创建一个模式或一个表?如果是,它包含什么信息,因为所有数据都存储在 ignite 的数据网格中。

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

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

最佳答案

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

关于h2 - H2数据库在Apache Ignite中的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43855689/

相关文章:

java - 带服务器的桌面数据库,无需安装

spring-boot - 使用 Flyway 和 Spring Boot 进行基线迁移

java - hazelcast 中的 TransactionContext,Ignite 中有类似的东西吗?

java - Ignite for Hibernate L2 非常慢

c++ - 无法在 Apache Ignite 中安装 ODBC 驱动程序 C++

java - GridGain 模板搜索

docker - 哪些端口应该暴露在 docker 容器中以用于 apache ignite?

database-design - 从 H2 数据库移植索引逻辑和连接逻辑,但是有关于索引的好信息吗?

java - 从 H2 控制台访问加密数据库

java - 如何为驱动管理器提供ignite-config xml?