2017-05-08 23 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