当前位置: 首页 > 知识库问答 >
问题:

带索引的Maploader延迟初始化

闻人吕恭
2023-03-14

我有maploader,它使用索引进行查询

public class Customer implements Serializable {

    private String id;
    private String name;

    public Customer(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

>

  • maploader

    public Map<Integer, Customer> loadAll(Collection<Integer> keys) {
        System.out.println("loadAll");
        Map<Integer, Customer> map = new HashMap<Integer, Customer>();
    
        for (Integer k : keys) {
            map.put(k, new Customer(String.valueOf(k), String.valueOf(k)));
        }
    
        return map;
    }
    
    public Iterable<Integer> loadAllKeys() {
        System.out.println("loadallkeys");
        List<Integer> map = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            map.add(i);
        }
    
        return map;
    }
    

    public class Main {
    
        public static void main(String[] args) {
    
            Config config = new Config();
            HazelcastInstance instance = Hazelcast.newHazelcastInstance(config);
    
            final MapConfig customerMapConf = config.getMapConfig("customers");
            final MapStoreConfig customerMapStoreConf = customerMapConf.getMapStoreConfig();
            customerMapStoreConf.setImplementation(new SimpleMapLoader());
            customerMapStoreConf.setEnabled(true);
            customerMapConf.setMapStoreConfig(customerMapStoreConf);
            config.addMapConfig(customerMapConf);
            Map<Integer, String> map = instance.getMap("customers"); 
            instance.shutdown();
        }
    
    }
    

    这个工作绝对精细的地图不会加载,直到我第一次接触地图。

    但是当我为地图添加索引的时候,地图就会被加载,而不管是不是触摸地图。在Hazelcast文档中,MapStoreConfig类中的InitialLoadMode配置参数有两个值:LAZY和eager。如果InitialLoadMode设置为LAZY,则在映射创建期间不加载数据。如果将其设置为EAGER,则在创建映射的同时加载所有数据,并且所有内容都可以使用。此外,如果使用MapIndexConfig类或addIndex方法向映射添加索引,则会重写InitialLoadMode,MapStoreConfig的行为就像EAGER模式处于打开状态一样。

    但是有没有方法覆盖这个急切的InitialLoadMode行为。我以以下方式添加索引

    public class Main {
    
        public static void main(String[] args) {
    
            Config config = new Config();
            HazelcastInstance instance = Hazelcast.newHazelcastInstance(config);
    
            final MapConfig customerMapConf = config.getMapConfig("customers");
            final MapStoreConfig customerMapStoreConf = customerMapConf.getMapStoreConfig();
            customerMapStoreConf.setImplementation(new SimpleMapLoader());
            customerMapStoreConf.setEnabled(true);
            customerMapConf.setMapStoreConfig(customerMapStoreConf);
            config.addMapConfig(customerMapConf);
            MapIndexConfig indexConfig = new MapIndexConfig();
            indexConfig.setAttribute("name");
            indexConfig.setOrdered(false);
            customerMapConf.setMapIndexConfigs(Arrays.asList(indexConfig));
            customerMapStoreConf.setInitialLoadMode(InitialLoadMode.LAZY);
            Map<Integer, String> map = instance.getMap("customers");
    
           // System.out.println(map.get("1"));
    
            instance.shutdown();
        }
    
    }
    

    我正在使用hazelcast 3.7.4。请建议是否有方法

  • 共有1个答案

    罗伟兆
    2023-03-14

    如文档所述,创建索引时,初始加载模式将被覆盖并设置为EAGER。您可以通过分叉自己的Hazelcast代码分支来覆盖产生行为,修改您想要的内容并重建它。但是,这可能会对系统的其他区域产生不利影响(例如,由于分区线程被占用的时间太长,导致加载速度变慢),因此需要您注意处于不受支持的版本上的风险。

     类似资料:
    • 7.4.4 延迟初始化的bean 默认情况下,ApplicationContext实现在初始化过程中随即创建和配置所有单例bean。一般来说,这种预实例化是可取的,因为可以立即发现配置或周围环境中的错误,而不是在几个小时甚至几天以后。当这种行为不可取时,可以通过将bean定义标记为延迟初始化来阻止预实例化。延迟初始化的bean告诉IoC容器,当bean首次被请求时而不是在启动时创建一个实例。 在X

    • 问题内容: 我想延迟控制器的初始化,直到从服务器收到必要的数据为止。 我找到了针对Angular1.0.1的解决方案:延迟AngularJS路由更改,直到加载模型以防止闪烁,但无法使其与Angular1.1.0一起使用 模板 ​ JavaScript http://jsfiddle.net/dTJ9N/1/ 问题答案: 由于$ http返回了promise,因此创建自己的deferred仅在htt

    • 问题内容: 我有一些已经在使用的JBoss webapp,还有一个懒惰的初始化问题。因此,建议我在Spring进行调查并使用。 但是,我仍然会收到错误消息,希望您能对我有所帮助?要使用Spring OEM过滤器,我还需要在应用程序中进行哪些更改? 我的设置是这样的: + jsf的东西。 我将其设置如下:web.xml applicationContext.xml: persistence.xml:

    • 问题内容: 在使用惰性初始化程序时,是否有保留周期的机会? 在博客文章和许多其他地方都可以看到 我试过了 这样使用 并发现记录了“人deinit”。 因此,似乎没有保留周期。据我所知,当一个块捕获自身时,以及当该块被自身强烈保留时,会有一个保留周期。这种情况似乎类似于保留周期,但实际上并非如此。 问题答案: 我尝试过这个[…] 似乎没有保留周期 正确。 原因是考虑立即应用封闭。它不会保留捕获的内容

    • 我在我的WordPress网站上使用JetPack,并启用了延迟加载。然而,在我的网站中,我用AJAX更新了一些内容,这导致加载1x1占位符的图像,而不是真正的图像,这是懒惰加载会处理的。 如何使用Jet Pack再次调用延迟加载?我似乎记得有一个JavaScript函数,但找不到它是什么。

    • 我正在开发一个Spring-MVC应用程序,其中我有3个类,组扫描,组节,组注释。组扫描器具有与组节的一对多映射,组节与组注释具有一对多映射。我正在尝试根据 GroupCanvas 的主键检索注释,但我收到Hibernate延迟初始化异常。我在网上尝试了这些建议,主要是SO,但似乎没有帮助。这是代码。 DAO 方法抛出错误: GroupCanvas模型: 组段模型类: 群注释: 错误日志: 我做错