【问题标题】:Second level cache for java web app and its alternativesJava Web 应用程序及其替代方案的二级缓存
【发布时间】:2010-03-16 11:06:27
【问题描述】:

在 Web 应用程序的转换之间,我使用 Session 对象来保存我的对象。 我听说有一个名为 memcached 的程序,但网站上没有它的编译版本, 此外,有些人认为它有真正的缺点。 现在我想问你。 不同方法的替代方案、优缺点是什么? 系统管理员可以安装 memcached painpul 吗?从系统管理员的角度来看,是否很难将其嵌入到现有的基础架构中?

使用数据库在网络应用转换之间保存临时数据怎么样? 这是正常的做法吗?

【问题讨论】:

    标签: java database hibernate servlets memcached


    【解决方案1】:

    使用数据库来保存怎么样 Web 应用程序之间的临时数据 过渡?这是正常的做法吗?

    数据库确实已经有缓存了。一个设计良好的应用程序应该尝试利用它来减少磁盘 IO

    数据库缓存在数据级别工作。这就是为什么可以使用其他缓存机制来处理不同级别的原因。在java级别可以使用hibernate的二级缓存,可以缓存实体和查询结果。这可以显着减少应用之间的网络 IO。服务器和数据库。

    那么您可能想要解决水平可扩展性,即添加服务器来管理负载。在这种情况下,二级缓存需要在节点之间分布。这存在(请参阅 JBoss 缓存),但管理起来可能会稍微复杂一些。

    如果分布式缓存有更简单的基于键/值的方案,则它们往往会更好地工作。 memcached 就是这样,但也有其他类似的解决方案。分布式缓存的最大问题是过时条目的失效 -- 这本身就会变成性能瓶颈。

    不要认为您可以按原样使用分布式缓存来消除性能问题。设计可扩展的分布式架构需要经验,并且始终需要在优化与不优化之间进行权衡。

    回到您的问题:对于常规应用程序,恕我直言,不需要分布式缓存。不错的磁盘 IO 和网络 IO 通常会带来不错的性能。

    编辑

    对于非持久对象,您有多种选择:

    • HttpSession。对象需要实现Serializable。管理会话的确切方式取决于容器。在集群中,会话通常被复制两次,因此如果一个节点崩溃,您仍然有一个副本。然后会话亲和性将请求路由到内存中具有会话的服务器。
    • 分布式缓存。像memcached 这样的系统可能确实有意义,但我不知道细节。
    • 数据库。您当然可以将数据库中的任何Serializable 对象转储到BLOB 中。如果 Web 服务器不如数据库服务器可靠,则可以选择。

    再次,对于常规应用程序,我会尽量使用HttpSession

    【讨论】:

    • @ewernli 感谢您的详尽回复。也许我看错了你的回复,但是我的应用程序中有没有持久化的对象,那么这些对象呢?你的意思是我们可以设计特定的表来使用 Hibernate 保存这些临时数据并使用它来代替二级缓存吗?我的意思是,我说的是非持久对象,它们没有 db 表示,仅在会话生命周期内创建,并在应用程序退出时被销毁。
    • 啊!我确实弄错了,我稍微完善了我的答案。为什么HttpSession 对你来说不够用?
    • 说实话,我听说用HttpSession来保存比较大的对象不是一个好主意,但是看了你的回答我知道它可以使用并且应该使用。如果有什么,请纠正我。
    【解决方案2】:

    Ehcache 怎么样?这是一个易于使用的纯 Java 解决方案,可以直接插入 Hibernate。据我记得它是由容器支持的。

    根据我的经验,这很无痛。

    【讨论】:

      【解决方案3】:

      http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache

      这个页面应该有你需要的一切(希望如此!)

      【讨论】:

        猜你喜欢
        • 2018-08-12
        • 2021-08-28
        • 1970-01-01
        • 2013-12-17
        • 2011-11-11
        • 1970-01-01
        • 2013-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多