2017-05-08 5 views
1

Ich habe einen Apache Spark Job und eine seiner Komponenten löst Abfragen im Apache Ignite Data Grid mit Ignite SQL und die Abfrage ist eine SQLFieldsQuery. Ich war durch das Thread-Dump zu gehen und in einen der Executor Protokollen sah ich folgende:Rolle der H2-Datenbank in 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) 

Die letzte Zeile in meinem Code eine SQL-Felder Abfrage ausgeführt wird, wie folgt:

SqlFieldsQuery sql = new SqlFieldsQuery(queryString).setArgs(args); 
cache.query(sql); 

Nach meinem Zum Verständnis hat Ignite ein eigenes Datenraster, mit dem die Cache-Daten und Indizes gespeichert werden. Es verwendet nur die H2-Datenbank, um die SQL-Abfrage zu analysieren und einen Abfrageausführungsplan zu erhalten.

Der Thread-Dump zeigt jedoch, dass Aktualisierungen ausgeführt werden und Transaktionen beteiligt sind. Ich verstehe nicht die Notwendigkeit für Transaktionen oder Updates in einer SQL-Select-Abfrage.

Ich möchte folgendes über die Rolle der H2-Datenbank in Ignite wissen:

  • Ich ging in den Open-Source-Code von Apache Ignite (Version 1.7.0) und sah, dass es versucht, zu öffnen eine Verbindung zu einem bestimmten Schema in der H2-Datenbank durch Ausführen der Abfrage SET SCHEMA schema_name (Methode connectionForThread() der IgniteH2Indexing-Klasse). Wird für jeden Cache ein Schema oder eine Tabelle erstellt? Wenn ja, welche Informationen enthält es, da alle Daten im Datenraster von ignite gespeichert sind.

  • Ich bin auch auf eine andere interessante Sache im Open Source Code gestoßen, nämlich dass Ignite versucht, den Schemanamen in H2 aus dem Space Namen abzuleiten (Referenz kann in der queryLocalSqlFields() Methode der IgniteH2Indexing Klasse gefunden werden). Ich möchte wissen, was dieser Raumname anzeigt und ist es etwas, das Ignite oder konfigurierbar ist?

  • Würde die Einstellung von Schema und Verbindung zu H2 db für jede meiner SQL-Abfragen passieren, wenn ja, gibt es eine Möglichkeit, dies zu vermeiden?

Antwort

1
  1. Ja, rufen wir executeUpdate Schema zu setzen. In Ignite 2.x können wir dafür auf Connection.setSchema wechseln. Im Moment erstellen wir ein SQL-Schema für jeden Cache und Sie können mehrere Tabellen darin erstellen, aber das wird in Zukunft geändert werden. Es enthält eigentlich nichts, wir verwenden nur einige H2-APIs.
  2. Space-Name ist im Grunde das gleiche wie ein Cache-Name. Sie können den Namen des SQL-Schemas für einen Cache mit CacheConfiguration.setSqlSchema konfigurieren.
  3. Wenn Sie Abfragen mit derselben Cache-Instanz ausführen, wird das Schema nicht geändert.
+0

Dank @Sergi für die schnelle Antwort. Wenn ich also CacheConfiguration.setSqlSchema verwende und einen eigenen Schemanamen für alle meine Caches einstelle, sollte sich die Abfrage-Lookup-Leistung deutlich verbessern, da das Schema nicht für jede Abfrage festgelegt werden muss und nur eine Verbindung zur H2-Datenbank wiederverwendet werden kann ? –

+0

Wie Sie bereits erwähnt haben, wird pro Cache ein SQL-Schema erstellt, das mehrere Tabellen enthalten kann. Warum werden mehrere Tabellen pro Cache erstellt, was nutzt er? . Ich dachte, es wäre ein Schema pro Ignite Grid und es enthielte mehrere Tabellen, wobei jede Tabelle einen Ignite Cache darstellte. –

+0

@AnnikethJain Wie von Sergi erwähnt, haben Sie derzeit die Möglichkeit, mehrere Tabellen in einem einzigen Cache zu erstellen. Dies wird jedoch nicht empfohlen. Ab Version 2.1 können Sie nur eine Tabelle pro Cache erstellen. – Dmitriy