Tag: 缓存

我使用番石榴的理想缓存

在过去的几周里,我一直在尝试使用guava的MapMaker找到理想的缓存实现。 请在此处和此处查看我之前的两个问题,以了解我的思维过程。 根据我所学到的,我的下一次尝试将放弃软值,转而使用maximumSize和expireAfterAccess: ConcurrentMap cache = new MapMaker() .maximumSize(MAXIMUM_SIZE) .expireAfterAccess(MINUTES_TO_EXPIRY, TimeUnit.MINUTES) .makeComputingMap(loadFunction); 哪里 Function loadFunction = new Function() { @Override public MyObject apply(String uidKey) { return getFromDataBase(uidKey); } }; 然而,我仍然在努力解决的另一个问题是,即使它们的时间很长,这个实现也会驱逐对象,即使它们是强烈可达的。 这可能会导致多个对象在环境中浮动相同的UID,这是我不想要的(我相信我想要实现的目标称为规范化)。 所以,据我所知,唯一的答案是有一个额外的地图作为一个内部人员,我可以检查,看看数据对象是否仍在内存中: ConcurrentMap interner = new MapMaker() .weakValues() .makeMap(); 并且将修改加载函数: Function loadFunction = new Function() { @Override public MyObject apply(String uidKey) { MyObject dataObject = […]

Java Web应用程序:如何实现缓存技术?

我正在开发一个Java Web应用程序,它通过从Web服务加载的大型XML配置文件来实现它的行为。 由于在访问应用程序的特定部分之前实际上不需要这些文件,因此它们会被懒惰地加载。 当需要其中一个文件时,会向Web服务发送查询以检索相应的文件。 由于某些配置文件可能会被使用得多,比其他配置文件更频繁,我想设置某种缓存(可能有1小时的到期时间),以避免一遍又一遍地请求相同的文件。 对于所有会话中的所有用户,Web服务返回的文件都是相同的。 我不使用JSP,JSF或任何其他花哨的框架,只是普通的servlet。 我的问题是,在Java Web应用程序中实现这样一个全局静态缓存的最佳实践是什么? 单例类是否合适,或者由于J2EE容器会有奇怪的行为吗? 我应该通过JNDI在某处暴露某些东西吗? 我该怎么做才能使我的缓存不会在集群环境中搞砸(每个集群服务器有一个缓存可以,但不是必需的)? 鉴于上面的信息,将一个负责缓存的对象作为ServletContext属性是否是一个正确的实现? 注意:我不想在启动时加载所有这些并完成它,因为那会 1)。 每当我的应用程序启动时,都会重载webservice 2)。 我的应用程序运行时文件可能会更改,所以无论如何我都必须重新查询它们 3)。 我仍然需要一个全局可访问的缓存,所以我的问题仍然存在 更新:使用缓存代理(例如squid)可能是个好主意,但是每个对webservice的请求都会在post Data中发送相当大的XML查询,每次都可能不同。 只有Web应用程序才真正知道对Web服务的两个不同调用实际上是等效的。 谢谢你的帮助

JVM如何在实践中收集SoftReferences?

我有一个在JVM中运行的两个单独的缓存(一个由第三方库控制),每个缓存都使用软引用。 我希望JVM在由库控制的缓存之前清除我的受控缓存。 SoftReference javadoc指出: 在虚拟机抛出OutOfMemoryError之前,保证已清除对软可访问对象的所有软引用。 否则,不会对清除软引用的时间或清除对不同对象的一组此类引用的顺序施加约束。 但是,鼓励虚拟机实现偏向清除最近创建或最近使用的软引用。 此类的直接实例可用于实现简单缓存; 此类或派生的子类也可用于更大的数据结构,以实现更复杂的高速缓存。 只要软引用的引用是强可达的,即实际上是在使用中,软引用就不会被清除。 因此,复杂的高速缓存可以例如通过保持对这些条目的强烈指示来防止其最近使用的条目被丢弃,留下剩余的条目由垃圾收集器决定丢弃。 常见的JVM实现(尤其是HotSpot)如何在实践中处理SoftReferences? 他们是否“反对清除最近创建或最近使用的软参考”,这是由规范鼓励的?

如何让java系统发布Soft References?

我将使用基于SoftReference的缓存(一个非常简单的事情)。 但是,我在为它编写测试时遇到了一个问题。 测试的目的是检查缓存是否在内存清理发生后再次从服务器请求先前缓存的对象。 在这里,我找到了如何使系统释放软引用对象的问题。 调用System.gc()是不够的,因为在内存不足之前不会释放软引用。 我在PC上运行此unit testing,因此VM的内存预算可能非常大。 ==================后来添加============================== 谢谢所有照顾的人! 在考虑了所有职业选手和反对者之后,我决定按照nanda和jarnbjo的建议采取蛮力方式。 然而,似乎JVM并不是那么愚蠢 – 如果你要求一个比VM的内存预算更大的块,它甚至都不会尝试垃圾收集。 所以我修改了这样的代码: /* Force releasing SoftReferences */ try { final List memhog = new LinkedList(); while(true) { memhog.add(new long[102400]); } } catch(final OutOfMemoryError e) { /* At this point all SoftReferences have been released – GUARANTEED. */ } /* continue the test here […]

如何禁用tomcat缓存?

如何禁用tomcat缓存? 我用这个 – 在Tomcat / conf / context.xml中 但它没有帮助

在JNI中,如何根据IBM的性能建议缓存类,methodID和fieldID?

我在IBM上读到了这一点 要访问Java对象的字段并调用它们的方法,本机代码必须调用FindClass(),GetFieldID(),GetMethodId()和GetStaticMethodID()。 对于GetFieldID(),GetMethodID()和GetStaticMethodID(),为给定类返回的ID在JVM进程的生命周期内不会更改。 但是获取字段或方法的调用可能需要在JVM中进行大量工作,因为字段和方法可能是从超类inheritance的,这使得JVM在类层次结构中向上移动以找到它们。 因为给定类的ID是相同的,所以您应该查找它们一次然后重复使用它们。 同样,查找类对象可能很昂贵,因此它们也应该被缓存。 如何在JNI中缓存 methodID , fieldID和class对象? 是否有必须遵循的内置方法或特定程序?

是不支持meta http-equiv值缓存控件?

我在这个页面上有这个代码: 当我转到其他页面并点击浏览器的按钮(返回到此代码编写的页面)时,它仍然具有页面的缓存状态。 选项是,添加PhaseListener,但他们告诉我添加PhaseListener是一个额外的代码来维护。 问题是: 1.是元标记属性http-equiv值在所有浏览器的html中仍然支持cache-control? 因为当我在w3school登记时,属性http-equiv没有值缓存控制,编译指示和过期。 2.如果我添加了phaseListener,那么在每个页面中添加元标记会有什么好处。 谢谢你

HTTP响应缓存

我想确保我的servet的响应永远不会被broswer缓存,这样即使两个相同的请求(相隔一个纳秒),也总是联系服务器。 这是实现此目的的正确方法: class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) { response.setHeader(“Cache-Control”, “no-cache”); } } 谢谢,唐

缓存servlet提供的图像

我正在从我的servlet提供图像。 响应内容类型是image / jpeg。 我发现从我的servlet请求的图像没有被缓存。 如何通过文件图像请求缓存它们? 我尝试设置Cache-Control:public但无济于事。