Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hazelcast地图锁定时如何防止读取_Hazelcast - Fatal编程技术网

hazelcast地图锁定时如何防止读取

hazelcast地图锁定时如何防止读取,hazelcast,Hazelcast,因为有很多数据应该放在hazelcast地图中,我想防止在将数据放在地图中时从其他人那里读取数据 有没有办法实现这一点 例如: map a=map(100000000)//a有100000000个元素 map b=map(2000)//b有200个元素 我想把所有的b放进a 在将所有元素放入地图a后,应访问b的元素 如果映射b的元素尚未完全放入映射a中,则无法访问映射b的元素 用例: 打印//结果{1,2,3,4,5} foreach item in b a.put item 打印//结

因为有很多数据应该放在hazelcast地图中,我想防止在将数据放在地图中时从其他人那里读取数据

有没有办法实现这一点

例如:

map a=map(100000000)//a有100000000个元素
map b=map(2000)//b有200个元素
我想把所有的b放进a

在将所有元素放入地图a后,应访问b的元素

如果映射b的元素尚未完全放入映射a中,则无法访问映射b的元素

用例: 打印//结果{1,2,3,4,5}

foreach item in b

a.put item
打印//结果{1,2,3,4,5}

end foreach
打印//结果{1,2,3,4,5,a,b,c,d,e}

我想合并这两个地图。然而,在合并完成之前,无法通过地图a访问地图b的元素

我的解决方案 感谢所有人的帮助。 在阅读hazelcast手册之后,我选择transactionalMap来解决这个问题

transactionalMap是读取提交的islate。当事务更新映射(1)时,它可能会暂停读取映射(1)线程

```爪哇 静态可运行tx=新可运行(){ @凌驾 公开募捐{

试试看{
logger.info(“启动事务…”);
TransactionContext txCxt=hz.newTransactionContext();
txCxt.beginTransaction();
TransactionalMap=txCxt.getMap(“map”);
试一试{
logger.info("放置地图前(1));;
睡眠(300);
map.put(“1”、“1”);//reader1被阻止
logger.info(“放置地图(1)”之后);
睡眠(500);
map.put(“2”,“2”);//reader2被阻止
logger.info(“放置地图(2)”之后);
睡眠(500);
txCxt.commitTransaction();
logger.info(“已提交交易”);
}捕获(运行时异常t){
txCxt.rollbackTransaction();
掷t;
}
睡眠(500);
}捕捉(中断异常e){
e、 printStackTrace();
}最后{
logger.info(“完成的testmap大小:{},testmap(1):{},testmap(2):{}”,testmap.size(),testmap.get(“1”),
testmap.get(“2”);
Hazelcast.shutdownlall();
logger.info(“系统退出”);
系统出口(0);
}
}
};

```你的动机/使用案例是什么?您可以使用事务,但这可能会对性能产生不良影响。或者,您可以使用手动锁定-请参见
ILock


然而,当您没有机会以不同的方式设计应用程序时,这两种技术都应该作为最后手段使用

你的动机/用例是什么?您可以使用事务,但这可能会对性能产生不良影响。或者,您可以使用手动锁定-请参见
ILock


然而,当您没有机会以不同的方式设计应用程序时,这两种技术都应该作为最后手段使用

实现这一点的一种方法是在添加到地图b的同时锁定地图b中的线段。将条目推送到映射a完成后,您可以解锁段。

尽管这种方法会影响性能,因为它需要额外的锁定/解锁步骤。

实现这一点的一种方法是在添加地图b的同时锁定地图b中的线段。将条目推送到映射a完成后,您可以解锁段。

不过,这种方法会对性能产生影响,因为它需要额外的锁定/解锁步骤。

谢谢,我添加了一些用例。我无法阻止从其他线程读取。你为什么这么认为?ILock会锁定整个操作,当然它会阻止从其他线程读取,但每个访问都需要由锁来保护:)这就是+Jaromir在说“性能影响”时所说的。提前感谢。我选择事务映射来解决它,因为我更关注映射数据。在我的例子中,只有一个书写线程,还有更多的阅读线程。所以我可以更加关注写作线索。谢谢,我添加了一些用例。我无法阻止从其他线程读取。你为什么这么认为?ILock会锁定整个操作,当然它会阻止从其他线程读取,但每个访问都需要由锁来保护:)这就是+Jaromir在说“性能影响”时所说的。提前感谢。我选择事务映射来解决它,因为我更关注映射数据。在我的例子中,只有一个书写线程,还有更多的阅读线程。所以我可以更加注意写作线索。
end foreach
        try {
            logger.info("start transaction...");
            TransactionContext txCxt = hz.newTransactionContext();
            txCxt.beginTransaction();
            TransactionalMap<Object, Object> map = txCxt.getMap("map");

            try {
                logger.info("before put map(1)");
                Thread.sleep(300);
                map.put("1", "1"); // reader1 is blocked
                logger.info("after put map(1)");
                Thread.sleep(500);
                map.put("2", "2"); // reader2 is blocked
                logger.info("after put map(2)");
                Thread.sleep(500);
                txCxt.commitTransaction();
                logger.info("transaction committed");
            } catch (RuntimeException t) {
                txCxt.rollbackTransaction();
                throw t;
            }

            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            logger.info("Finished testmap size:{}, testmap(1):{}, testmap(2):{} ", testmap.size(), testmap.get("1"),
                    testmap.get("2"));

            Hazelcast.shutdownAll();
            logger.info("system exit.");
            System.exit(0);
        }

    }
};