2017-05-08 145 views
1

我有一个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查询,如果是的话有什么办法来避免这种情况?

回答

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

谢谢@Sergi的快速回复。因此,如果我使用CacheConfiguration.setSqlSchema并为我的所有缓存提供自己的模式名称,那么查询查询性能应该会显着提高,因为它不必为每个查询设置模式,并且只能重复使用到H2数据库的一个连接? –

+0

正如您所提到的,每个缓存都可以创建一个SQL模式,其中可以包含多个表。为什么每个缓存创建多个表,它有什么用处? 。我认为这是每个Ignite Grid一个模式,它包含多个表,其中每个表代表Ignite Cache。 –

+0

@AnikethJain正如Sergi提到的那样,目前您可以在单个缓存中创建多个表,但不建议这样做。从2.1开始,您只能为每个缓存创建一个表。 – Dmitriy