2017-05-08 11 views
1

Apache Spark Job이 있으며 구성 요소 중 하나가 Ignite SQL을 사용하여 Apache Ignite Data Grid에서 쿼리를 실행하고 쿼리가 SQLFieldsQuery입니다. 나는 스레드 덤프를 통과했다과 실행자 로그 중 하나에 내가 본 다음 다음과 같이Apache Ignite에서 H2 데이터베이스의 역할

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에는 캐시 데이터와 인덱스를 저장하는 데 사용하는 자체 데이터 표가 있습니다. SQL 쿼리를 구문 분석하고 쿼리 실행 계획을 얻는 데는 H2 데이터베이스 만 사용합니다.

그러나 스레드 덤프는 업데이트가 실행 중이며 트랜잭션이 관련되어 있음을 보여줍니다. SQL Select Query에서 트랜잭션 또는 업데이트의 필요성을 이해하지 못합니다.

  • 내가 아파치의 Ignite (버전 1.7.0)의 오픈 소스 코드로 가서 그것을 열려고하는 것을보고 :

    나는은 Ignite에서 H2 데이터베이스의 역할에 대해 다음을 알고 싶어 SET SCHEMA 스키마 이름 (IgniteH2Indexing 클래스의 connectionForThread() 메소드) 쿼리를 실행하여 H2 데이터베이스의 특정 스키마에 연결합니다. 모든 캐시에 하나의 스키마 또는 테이블이 생성됩니까? 그렇다면 모든 데이터가 ignite의 데이터 그리드에 저장되므로 어떤 정보에 포함됩니까?

  • 오픈 소스 코드에서 또 다른 재미있는 점은 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