【问题标题】:Get Hazelcast to stop deserializing objects when using an EntryProcessor使用 EntryProcessor 时让 Hazelcast 停止反序列化对象
【发布时间】:2020-01-31 23:04:45
【问题描述】:

我正在使用 Hazelcast IMap,我使用 EntryProcessor 更新了很多值。与此同时,其他线程正在调用get()。如果可能,我想避免所有不必要的反序列化。但似乎即使在使用单个节点时它仍在反序列化。

有什么办法可以避免这种情况吗?我已将 Map 和 Near 缓存的内存格式设置为 OBJECT。我还将 cache-local-entries 设置为 true,但仍然没有运气。我正在使用 Hazelcast 3.12。

这是我的示例代码:

public class HazelcastSerializationTest {

    static int readCount = 0;
    private String mapName = "map1";

    private HazelcastInstance createHazelcast() {
        Config config = new Config("HazelcastSerializationTest");
        config.addMapConfig(new MapConfig(mapName)
                   .setInMemoryFormat(InMemoryFormat.OBJECT)
                   .setNearCacheConfig(new NearCacheConfig(mapName)
                                .setInMemoryFormat(InMemoryFormat.OBJECT)
                                .setCacheLocalEntries(true)));

        config.getNetworkConfig().getJoin()
                  .getMulticastConfig().setEnabled(false);
        return Hazelcast.newHazelcastInstance(config);
    }

    @Test
    public void testEntry() {
        HazelcastInstance instance = createHazelcast();
        IMap<Integer, DataObject> map = instance.getMap(mapName);
        map.put(1, new DataObject(0));
        for (int i = 0; i < 100; i++) {
            map.executeOnKey(1, new NothingProcessor());
            map.get(1);
        }
        assertEquals(2, readCount);
    }
}

class NothingProcessor extends AbstractEntryProcessor<Integer, DataObject> {

    @Override
    public Object process(Map.Entry<Integer, DataObject> entry) {
        entry.setValue(new DataObject(entry.getValue().getValue() + 1));
        return null;
    }
}

class DataObject implements Externalizable {

    private int value;

    public DataObject(int value) {
        this.value = value;
    }

    public DataObject() { }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeInt(value);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException {
        HazelcastSerializationTest.readCount++;
        value = in.readInt();
    }
}

我错过了什么吗?我希望这只会从附近的缓存中返回真实的对象。反序列化似乎没有必要。我还应该提到,在我的场景中,键和值对象是不可变的。

【问题讨论】:

    标签: java serialization hazelcast


    【解决方案1】:

    当您通过 EntryProcessor 更新条目时,它也会使 NearCache 中的键值无效。因此,每当您对该键执行get() 时,都会从服务器获取新值并将其存储在 NearCache 中。并从服务器上获取get() = 序列化 + 反序列化,无论内存格式类型如何。

    【讨论】:

    • 我希望得到不同的答案,但不幸的是,您完全正确。感谢您的帮助!
    • 我不确定。他们肯定是从我的总数中减去的。
    • 谢谢。很高兴我能提供帮助。
    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多