Tag: 缓存

如何以线程安全的方式在DAO中缓存信息

我经常需要为一些不经常变化的参考数据实现DAO。 我有时会在DAO的集合字段中缓存它 – 因此它只加载一次并在需要时显式更新。 但是,这会带来许多并发问题 – 如果另一个线程在加载或更新时尝试访问数据会怎样。 显然,这可以通过使数据的getter和setter同步来处理 – 但对于大型Web应用程序来说,这是一个相当大的开销。 我已经包含了一个琐碎的例子,说明了我作为一个稻草人所需要的东西。 请建议其他方法来实现这一点。 public class LocationDAOImpl implements LocationDAO { private List locations = null; public List getAllLocations() { if(locations == null) { loadAllLocations(); } return locations; } 有关更多信息,我正在使用Hibernate和Spring,但此要求适用于许多技术。 进一步的想法: 这根本不应该在代码中处理 – 而是让ehcache或类似处理吗? 我缺少一个共同的模式吗? 显然有很多方法可以实现,但我从未找到过简单易维护的模式。 提前致谢!

在没有外部SD卡的情况下缓存位图

没有外部SD卡,图像不会在内部存储器上缓存并在设备上崩溃。 我尝试过我所知道的,没有任何效果。 这是ImageCache.java package com.minecraftpix.android.bitmapfun.util; import com.minecraftpix.BuildConfig; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.os.Environment; import android.os.StatFs; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.util.LruCache; import android.util.Log; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.ref.SoftReference; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HashSet; import java.util.Iterator; […]

使用Spring Cache Abstraction的异步缓存更新

使用Spring的缓存抽象,如何在仍然返回旧条目的同时异步刷新条目? 我正在尝试使用Spring的缓存抽象来创建一个缓存系统,在相对较短的“软”超时后,缓存条目可以进行刷新。 然后,在查询它们时,返回缓存的值,并启动异步更新操作以刷新条目。 我也会 Guava的缓存构建器允许我指定缓存中的条目应在一定时间后刷新。 然后可以使用异步实现覆盖缓存加载器的reload()方法,允许返回过时的缓存值,直到检索到新的缓存值。 但是,spring缓存似乎不使用底层Guava缓存的CacheLoader 是否可以使用Spring的缓存抽象来进行这种异步缓存刷新? 编辑澄清:使用Guava的CacheBuilder,我可以使用refreshAfterWrite()来获取我想要的行为。 例如来自Guava Caches解释 : LoadingCache graphs = CacheBuilder.newBuilder() .maximumSize(1000) .refreshAfterWrite(1, TimeUnit.MINUTES) .build( new CacheLoader() { public Graph load(Key key) { // no checked exception return getGraphFromDatabase(key); } public ListenableFuture reload(final Key key, Graph prevGraph) { if (neverNeedsRefresh(key)) { return Futures.immediateFuture(prevGraph); } else { // asynchronous! ListenableFutureTask task […]

JavaFX WebView / WebEngine缓存外部JavaScript

情况 :我有一个简单的HTML页面,它有一个像这样的普通脚本标签 加载html后,我更新main.js,并重新加载(通过UI按钮)。 问题我没有采用新的JS,我必须关闭应用程序并再次打开它。 我做了什么尝试: – 不使用webEngine.reload(),但webEngine.load() – 每次重新加载时都会制作一个新的broswer。 – 使用新的broswer设置一个新的阶段 – 设置所有节点缓存 – 在HTML代码之后 -InetAddressCachePolicy: InetAddressCachePolicy.setNegativeIfNotSet(InetAddressCachePolicy.NEVER); -VM选项:-Dnetworkaddress.cache.ttl = 0。 问题有没有办法删除缓存或强制WebView重新加载所有资源,而不是每次更新它时为JS文件名附加一个数字? 注意:我使用NetBeans 7.3和上一个Java(更新22)

如何让Tomcat停止缓存我的servlet响应?

我正在学习Servlets编程,在Ubuntu 8.10机器上使用Apache Tomcat 6,我正在运行一个非常烦人的问题 – 显然,与缓存有关。 这就是我正在做的:我编写一个servlet,将它放在一个漂亮的目录结构中,并使用Tomcat Web应用程序管理器进行部署。 它按预期工作。 然后我编辑servlet,重新编译并尝试再次访问它,但Tomcat仍然返回相同的旧版本。 重新加载应用程序甚至重新启动服务器不起作用。 唯一有效的是“取消部署”应用程序,然后再重新部署它。 每次我对代码做一些小改动时,我都必须这样做。 太糟糕了。 我确信有一种方法可以解决这个问题,但我无法在网络上的任何地方找到答案(我做了很多搜索)。 我真的很感激任何帮助。 谢谢!

试图将java对象存储在连续的内存中

我正在尝试实现类似缓存的对象集合。 目的是通过内存中的位置快速访问这些对象,因为我可能一次只能读取多个对象。 我目前只是将对象存储在像vector或deque这样的java集合对象中。 但我不相信这会利用连续的记忆。 我知道这可以在C中完成,但可以用Java完成吗? 这些对象可能具有不同的长度(因为它们可能包含字符串)。 有没有办法通过Java分配连续的内存? 是否有Java集合对象? 请告诉我。 谢谢,jbu

使用HTML5 localStorage在GWT app / widget中缓存

我正在尝试为我的一个GWT小部件合并一个数据缓存。 我有一个数据源接口/类,它通过RequestBuilder和JSON从我的后端检索一些数据。 因为我多次显示窗口小部件,所以我只想检索一次数据。 所以我尝试使用app缓存。 天真的方法是在单个对象中使用HashMap来存储数据。 但是,如果支持,我还想使用HTML5的localStorage / sessionStorage。 HTML5 localStorage仅支持String值。 所以我必须将我的对象转换为JSON并存储为字符串。 但不知何故,我无法想出一个干净利落的方法。 这是我到目前为止所拥有的。 我定义了一个具有两个函数的接口: fetchStatsList()获取可以在窗口小部件中显示的统计信息列表, fetchStatsData()获取实际数据。 public interface DataSource { public void fetchStatsData(Stat stat,FetchStatsDataCallback callback); public void fetchStatsList(FetchStatsListCallback callback); } Stat类是一个简单的Javascript Overlay类( JavaScriptObject ),带有一些getter(getName()等)我有一个普通的不可RequestBuilderDataSource的我的DataSource的RequestBuilderDataSource ,如下所示: public class RequestBuilderDataSource implements DataSource { @Override public void fetchStatsList(final FetchStatsListCallback callback) { // create RequestBuilderRequest, retrieve response and parse […]

任何可以限制内存缓存的内存使用的Java缓存,而不仅仅是实例计数?

我正在寻找一个简单的内存(和进程中)缓存,用于查询数据的短期缓存(但短期意义超出请求/响应,即会话边界)。 EhCache可能会工作,但看起来好像它可能不提供我需要的东西:限制不是缓存的对象数量,而是(大致)限制缓存数据消耗的内存量。 我知道很难在没有序列化的情况下找出给定对象的确切内存使用情况(我希望在一般情况下避免由于其缓慢而使我的用途失败),并且我很自己必须提供大小估计。 那么:是否有一个简单的开源java缓存,允许定义缓存对象的“权重”,以限制缓存的事物数量? 编辑(2010年11月):对于它的价值,有一个名为Java CacheMate的新项目试图解决这个问题,以及其他一些改进的想法(多级内存中进程缓存)

具有弱/软使用的Guava CacheBuilder或MapMaker

我不习惯在Java中处理Soft和Weak引用,但我理解这个原理,因为我习惯于处理像Gemfire这样的数据网格,它在内存已满时为hddfunction提供溢出,可能使用软引用或类似的东西我猜测。 在番石榴中我不明白的是它提供了使键变软/弱的方法,以及值软/弱的方法。 我只是想知道用非软值创建软键的重点是什么? 我的意思是,当开始收集软引用时,我们无法通过其键找到条目,那么为什么我们希望这些值保留在地图中? 有人可以给我们一些用例: 弱键/软值 弱键/正​​常值 软键/弱值 软键/正常值 谢谢 编辑我不确定我的问题是否足够精确,所以我想知道的是: 收集密钥(弱/软)时,该值会发生什么变化(非弱/软) 当收集一个值(弱/软)时,密钥会发生什么 具有缺失部分(键或值)的条目是否保留在缓存中? 当您希望此类条目保留在缓存中时,是否有任何用例。 编辑:正如Kevin Bourillon的回答所讨论的,最后我想我明白为什么使用软键并不意味着什么。 原因如下: static class KeyHolder { final private String key; public KeyHolder(String key) { this.key = key; } public String getKey() { return key; } @Override public boolean equals(Object o) { KeyHolder that = (KeyHolder)o; boolean equality = this.getKey().equals(that.getKey()); […]

避免同一缓存区域的多次重新填充(由于并发)

我有一个高流量的网站,我使用hibernate。 我还使用ehcache来缓存生成页面所需的一些实体和查询。 问题是“并行缓存未命中”,长期解释是,当应用程序启动并且缓存区域很冷时,每个缓存区域被不同的线程多次填充(而不是仅一次),因为该站点被许多用户击中同时。 此外,当某些缓存区域无效时,由于相同的原因,它会被重新填充多次。 我怎么能避免这个? 我设法通过向hibernate.cache.provider_class提供我自己的实现, 将1个实体和1个查询缓存转换为BlockingCache ,但BlockingCache的语义似乎不起作用。 甚至有时甚至最糟糕的是BlockingCache死锁(块)并且应用程序完全挂起。 线程转储显示在get操作上阻止BlockingCache的互斥锁处理。 那么,问题是,Hibernate是否支持这种用途? 如果没有,你如何在生产中解决这个问题? 编辑 : hibernate.cache.provider_class指向我的自定义缓存提供程序,它是SingletonEhCacheProvider的复制粘贴和start()方法的结尾(在第136行之后)我这样做: Ehcache cache = manager.getEhcache(“foo”); if (!(cache instanceof BlockingCache)) { manager.replaceCacheWithDecoratedCache(cache, new BlockingCache(cache)); } 这样在初始化时,在其他人触摸名为“foo”的缓存之前,我用BlockingCache来装饰它。 “foo”是查询缓存,“bar”(相同的代码但省略)是pojo的实体缓存。 编辑2 :“似乎不起作用”意味着最初的问题仍然存在。 由于并发性,缓存“foo”仍然使用相同的数据重新填充多次。 我通过使用10个线程的JMeter强调网站来validation这一点。 我希望9个线程阻塞,直到第一个请求“foo”数据完成它的工作(执行查询,在缓存中存储数据),然后直接从缓存中获取数据。 编辑3 :这个问题的另一个解释可以在https://forum.hibernate.org/viewtopic.php?f=1&t=964391&start=0看到,但没有明确的答案。