在Web应用程序的转换之间,我使用Session对象来保存我的对象。 我听说有一个名为memcached的程序,但网站上没有编译版本, 除了一些人认为它有其真正的缺点。 现在我想问你。 什么是不同方法的替代方案,利弊? 是memcached painpul为sysadmins安装吗?从系统管理员的角度来看,难以将其嵌入到现有的基础架构中吗?
如何使用数据库在Web应用程序转换之间保存临时数据? 这是正常做法吗?
答案 0 :(得分:2)
如何使用数据库来保存 网络应用之间的临时数据 过渡?这是正常做法吗?
数据库确实已经有了缓存。一个好的设计应用程序应该尝试利用它来减少磁盘IO 。
数据库缓存在数据级别工作。这就是为什么其他缓存机制可用于解决不同级别的原因。在java级别,您可以使用hibernate的二级缓存,它可以缓存实体和查询结果。这可以显着减少应用之间的网络IO 。服务器和数据库。
然后,您可能希望解决水平可伸缩性,即添加服务器以管理负载。在这种情况下,第二级缓存需要在节点之间分布式。这存在(参见JBoss缓存),但管理起来可能会有些复杂。
如果分布式缓存具有基于键/值的更简单方案,则会更好地提高工作效率。这就是memcached
,但也有其他类似的解决方案。分布式缓存的最大问题是过时条目的失效 - 这本身就会成为性能瓶颈。
不要认为您可以使用分布式缓存原样来消除性能问题。设计可扩展的分布式架构需要经验,并且始终需要在优化与否之间进行权衡。
回到你的问题:对于常规应用程序,有恕我直言,不需要分布式缓存。体面的磁盘IO和网络IO通常会带来不错的性能。
修改强>
对于非持久对象,您有以下几种选择:
HttpSession
。对象需要实现Serializable
。管理会话的确切方式取决于容器。在群集中,会话通常会被复制两次,因此如果一个节点崩溃,您仍然只有一个副本。然后会话亲缘关系将请求路由到在内存中具有会话的服务器。memcached
这样的系统可能确实有意义,但我不知道细节。 Serializable
中转储数据库中的任何BLOB
对象。如果Web服务器不如数据库服务器可靠,则可以选择此选项。 同样,对于常规应用程序,我会尽量使用HttpSession
。
答案 1 :(得分:1)
Ehcache怎么样?这是一个易于使用的纯Java解决方案,可以插入Hibernate。据我所知,容器支持它。
根据我的经验,这是非常轻松的。
答案 2 :(得分:0)