0

시작시 모든 값을로드하고 단일 데이터베이스 호출로이 값을 강제로 저장하려면 어떻게해야합니까? 열심히로드하는 작업을 수행하는 maploader를 구성하는 것이이 작업을 수행하지 않는 것입니까? 대신 개별 값이로드되므로 데이터베이스에 많은 왕복이 발생합니다.Hazelcast MapLoader 성능 - 데이터베이스에서 모든 값을 강제로로드합니다.

MapLoader 구현 조각은 다음과 같습니다

public V load(K key) { 
    // issues a SQL query 
    return databaseService.findByPrimaryKey(key); 
} 
이 이 구성은 다음과 같습니다

: mapStoreCfg.setImplementation이 (로더)
.setInitialLoadMode (MapStoreConfig.InitialLoadMode.EAGER가)

+0

사용중인 Hazelcast의 버전은 무엇입니까? 다음과 같이 작동하도록 설계되었습니다. 하나의 클러스터 멤버가 모든 키를로드 한 다음 클러스터 멤버에게 배포합니다. 그것은 값로드를 일괄 처리하고 배치 크기가 1,000으로 설정되어 있다고 생각합니다. –

+0

사용하기 3.8.1. 하지만 성능은 데이터베이스에 비해 매우 좋지 않습니다. 우리가 실제로해야 할 일은 하나의 SELECT * 문을 사용하여 모든 행을 가져 오는 것입니다. – hklf

+0

HELTSCEL을 선택하게하려면'SELECT * statement'이 좋지 않습니다. 1. 모든 멤버가 키 - 값 쌍을로드하고 다른 멤버에게 배포합니다. 이 구성원은 병목이됩니다. 2. 모든 멤버는'select * statement'를 얻을 수 있습니다. 그러나 이것은 DB에 불필요한로드를 생성 할 수 있습니다. 모든 구성원은 DB에서 모든 키를 가져올 수 있습니다. –

답변

0

MapLoader 인터페이스로 보인다 따르기 :

public interface MapLoader<K, V> { 

    V load(K key); 

    Map<K, V> loadAll(Collection<K> keys); 

    Iterable<K> loadAllKeys(); 

} 

이제

  • MapLoading의 조정자는 loadAllKeys
  • 않는 그 키의 hashing 수행하고 각 파티션은 파티션
  • 을 담당하는 키를 얻을 수 있도록, 해시 알고리즘에 따라 모든 파티션에 하나의 일괄 처리에있는 모든 키를 배포
  • 각 파티션은 loadAll(Collection<K> keys);입니다. 여기서 keys은 각 파티션이 MapLoading Orchestrator에서 가져온 키입니다. 하나의 loadAllKeys이

    • 결과로 그래서

  • ,()는 loadAll(Collection<K> keys)가의 각 배치에 대해 호출되도록 N loadAll(Collection<K> keys) 전화, 하나는 각 파티션에 의해 실행이있다
  • 전화 열쇠.