Java Web应用程序的二级缓存及其替代方案

时间:2010-03-16 11:06:27

标签: java database hibernate servlets memcached

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

如何使用数据库在Web应用程序转换之间保存临时数据? 这是正常做法吗?

3 个答案:

答案 0 :(得分:2)

  

如何使用数据库来保存   网络应用之间的临时数据   过渡?这是正常做法吗?

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

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

然后,您可能希望解决水平可伸缩性,即添加服务器以管理负载。在这种情况下,第二级缓存需要在节点之间分布式。这存在(参见JBoss缓存),但管理起来可能会有些复杂。

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

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

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

修改

对于非持久对象,您有以下几种选择:

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

同样,对于常规应用程序,我会尽量使用HttpSession

答案 1 :(得分:1)

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

根据我的经验,这是非常轻松的。

答案 2 :(得分:0)

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

此页面应该包含您需要的所有内容(希望!)