我的代码正在执行以下操作(仅作为示例,我指定java.lang.ref.SoftReference的包路径的原因是要注意它不是我自己的实现: - ):
...
List<String> someData = new ArrayList<String>();
someData.add("Value1");
someData.add("Value2");
...
java.lang.ref.SoftReference softRef = new SoftReference(someData);
...
HttpSession session = request.getSession(true);
session.setAttribute("mySoftRefData", softRef);
...
以后:
...
java.lang.ref.SoftReference softRef = session.getAttribute("mySoftRefData");
if (softRef != null && softRef.get() != null) {
List<String> someData = (List<String>)softRef.get();
// do something with it.
}
...
有什么缺点吗?哪个我看不到?谢谢!
答案 0 :(得分:1)
明显的缺点是列表可能会无法预测地消失。由于会话在过期后被垃圾收集,我实际上并没有看到SoftReference的用例。如果列表变得相当大(至少足以证明使用SoftReference),我宁愿建议不同的存储(DB,临时文件)。
答案 1 :(得分:1)
如果你自己没有在代码中的任何其他地方引用它,并且JVM运行了垃圾收集器,那么你可能冒险该引用将不再在会话中。然而,机会很少,比使用弱参考时少,但仍然存在。
我不会在网络应用程序中这样做。如果它是纯会话作用域数据(例如登录用户,购物车等),那么只需将其放入会话范围即可。如果会话过期或无效,那么任何其他地方未引用的内容都将以任何方式进行垃圾回收。会话范围并非旨在充当“软”缓存。或者,如果它实际上是请求范围的数据,则将其存储在请求范围中。否则使用另一种数据存储。
答案 2 :(得分:0)
将应用程序100%不需要的数据放入一次性缓存中是一个非常好的主意。在高峰时段,他们将被丢弃,为更迫切的需求节省更多资源。
简而言之。