【问题标题】:Do I need to lock HazelcastHttpSession instance when modify its attribute?修改属性时是否需要锁定 HazelcastHttpSession 实例?
【发布时间】:2014-04-11 22:22:19
【问题描述】:

我打算将 Hazelcast 用于 Http 会话集群。我阅读了这个文档 - http://hazelcast.org/docs/latest/manual/html/httpsessionclustering.html 并且我知道我需要设置 com.hazelcast.web.WebFilter 过滤器,这个过滤器将装饰原始 HttpSession 以将会话数据存储在 Hazelcast 缓存中。

我的问题是,当我修改 HazelcastHttpSession 实例的属性时,我是否必须在其上放置一个锁(分布式锁),就像我对原始 HttpSession 实例所做的那样。

如果我必须锁定 HazelcastHttpSession 实例,我打算使用 Hazelcast 分布式锁,获得分布式锁的关键是 Session id。请看我的示例代码:

HazelcastInstance hz = Hazelcast.newHazelcastInstance(cfg);
Lock session_lock = hz.getLock( SessionID );

session_lock .lock();
try {
    // Modify session data
} finally {
    session_lock .unlock();
}

我的应用程序一次可能有 10K 用户处于活动状态,因此该应用程序可能需要一次从 Hazelcast 获取 10K 分布式锁实例。

我的问题是 Hazel 可以一次创建太多(10K)个分布式锁吗? Hazel 分布式锁有什么限制吗? 文档http://hazelcast.org/docs/latest/manual/html/lock.html 没有提及任何内容。

感谢任何cmets。

【问题讨论】:

    标签: java jakarta-ee cluster-computing httpsession hazelcast


    【解决方案1】:

    您不需要锁定对象。 Hazelcast 数据结构在设计上是线程安全的。但是,您可以设置延迟写入属性,以便在请求完成后写入所有值。如果在处理请求时抛出异常,它们将不会被写入。 如果您不设置延迟写入,所有值都会立即存储在分布式会话中。

    【讨论】:

    • 谢谢诺克塔瑞斯。如果我们想在一个锁定事务中做一些调用,例如getAttribute、setAttribute,我们仍然需要一个分布式锁。对吗?
    • 什么是锁定事务?
    • getAttribute 和 setAttribute 等调用的锁定。
    • 就像我说的,只要使用 deferred-write 你就有一些轻量级的事务,没有什么比锁定事务更重要的了。
    猜你喜欢
    • 2011-08-16
    • 2020-11-29
    • 1970-01-01
    • 2020-03-31
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多