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

'SELECT * statement'不是很好,因爲它會迫使Hazelcast做出這樣的選擇: 1.由單個成員加載所有鍵值對並將它們分發給其他成員。這個成員將成爲一個瓶頸。 2.所有成員都可以得到'select * statement'。但是這可能會給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()調用
  • NloadAll(Collection<K> keys)呼叫,一個由每個分區執行時,使得loadAll(Collection<K> keys)被調用的每批鍵。
相關問題