Tag: 缓存

使用Spring / EHCache加载时刷新缓存

我在SpringmultithreadingWeb服务上有一个缓存问题,它带有数据库后端和基于EHCache的缓存。 该服务有许多客户端一次又一次地请求相同的对象,每秒有几十个请求。 经常请求的对象只有几个,并且不经常请求大量其他对象。 对象每隔几分钟就可以更改一次,因此缓存的TTL设置为一分钟。 从数据库加载对象很慢,至少需要几秒钟。 起初我使用了一个天真的实现来获取对象: 检查对象是否在缓存中。 如果是,请从缓存中返回。 如果没有,从数据库加载它,将其放入缓存并返回它。 这在最初在本地测试时运行良好。 但是,每当一个更频繁请求的对象在缓存中到期时,在更快的服务器上进行性能测试就会显示一些非常糟糕的负载峰值。 发生这种情况时,在接下来的10秒内,对该对象的所有请求都将导致数据库加载,直到第一个线程完成数据库加载并将新对象放入缓存。 结果是数据库上的负载很短但非常高,并且许多用户需要等待请求完成。 我当前的实现通过跟踪当前正在加载哪个对象来改进数据库负载: 检查对象是否被缓存。 如果是,请从缓存中返回。 如果没有,请检查当前是否正在加载对象。 如果是,请等待另一个线程的加载完成,从缓存中获取新对象并返回它。 如果不是,则将对象放入加载对象列表中,完成后将其放入缓存中并返回。 通过此实现,即使对象到期,也只有一个数据库操作。 而且,由于数据库负载较低,它也会更快完成。 但它仍然意味着在对象加载期间请求对象的所有用户都需要等待。 我真正想要的是只有第一个线程等待数据库加载,而所有其他线程只是在加载对象时返回’过期’对象。 对于我来说,响应时间比对象太老了几秒钟更重要。 或者,当我注意到对象将在几秒钟内过期时,我可以异步刷新缓存。 这更接近EHCache的单个TTL模型,并且意味着没有人需要等待数据库负载 我真正的问题是:在我重新发明轮子之前,是否有任何现有的框架已经实现了这样的东西(在Spring / EHCache环境中)? 或者也许在Spring / EHCache的某处已经存在对此的支持,我找不到合适的选项?

扩展java Integer缓存

由于缓存,一般建议使用Integer.valueOf(int)而不是new Integer(int) 。 在JDK 5+中,您应该使用valueOf因为Integer现在可以在-128和127之间缓存Integer对象,并且每次都可以将同一个Integer(0)对象交给您,而不是在全新的相同Integer对象上浪费对象构造。 如何扩大范围?

EhCache Hibernate二级缓存maxBytesLocalHeap缓慢

我在Spring驱动的应用程序中使用Hibernate(4.2.15.Final)和EhCache(2.6.9)作为二级缓存设置了一个非常标准的持久层设置。 一切都按预期工作。 但是,将条目放入二级缓存有时需要很长时间。 我已经在一个显式的ehcache.xml文件中配置了我的域模型类的缓存(我没有配置默认缓存): … 我在持久化上下文启动时记录了以下INFO消息: DefaultSizeOfEngine | using Agent sizeof engine 以及执行期间的以下警告 ObjectGraphWalker | The configured limit of 1,000 object references was reached while attempting to calculate the size of the object graph. Severe performance degradation could occur if the sizing operation continues. […] AFAIK ObjectGraphWalker必须调整放入缓存的实体的大小,因为我使用maxBytesLocalHeap配置了单个缓存区域。 我的域模型非常复杂,我知道我可以使用@IgnoreSizeOf注释来限制图形的行走,但我不确定如何解决这个问题: 我是否必须忽略双向关联的一方以避免循环? 我是否必须明确忽略我的域模型类的瞬态成员? 一般来说,将EhCache与Hibernate一起使用时使用maxBytesLocalHeap是否明智,还是应该选择maxEntriesLocalHeap ,因为Hibernate为每个实体保留了一个单独的缓存区域? [更新] :我发现,临时成员不会被Hibernate缓存(参见Hibernate:是否可以在二级缓存中保存瞬态字段? ),所以不管怎么说它们都不应该被ehcache看待。 […]

@CacheLookup如何在WebDriver中工作?

我不确定我是否理解缓存原则: @CacheLookup @FindBy(how = How.ID, using = namespace + signifLvl) private WebElement sigLvl; 如果我们使用这种Annotation方法,正在使用ElementLocator,并且第一次引用该字段时,元素被找到driver.findElement(by)并通过ElementLocator缓存,以便下次我们引用它时,它将从缓存。 它看起来取决于ElementLocator和PageObject实例的生命周期。 它也与direct driver.findElement(By); 调用。 我假设,WebElement就像是元素的指针/引用,对吧? 因此,如果元素在浏览器中发生更改,则会立即反映到WebElement。 就像在JavaScript中一样。 因为所有RemoteWebElement关于元素状态的方法都是对浏览器执行命令/请求。 这样即使在缓存元素中也会反映出这些变化,对吧?

Netbeans反复下载Javadoc

我使用Netbeans 7.0.1进行研究项目。 我的问题是,每次我想检查给定函数或类的javadoc(从自动完成菜单),Netbeans下载Javadoc并仅在它运行时缓存它。 如果我重新启动Netbeans,我必须再次下载javadoc。 有没有办法告诉Netbeans永远缓存Javadoc? 我在Mac OS上工作。

我应该缓存System.getProperty(“line.separator”)吗?

考虑这样的方法: @Override public String toString() { final StringBuilder sb = new StringBuilder(); for (final Room room : map) { sb.append(room.toString()); sb.append(System.getProperty(“line.separator”)); // THIS IS IMPORTANT } return sb.toString(); } System.getProperty(“line.separator”)可以多次调用。 我应该使用public final static String lineSeperator = System.getProperty(“line.separator”)缓存此值,以后只使用lineSeperator吗? 或System.getProperty(“line.separator”)与使用静态字段一样快?

HashMap缓存中的同步

我有一个人们要求资源的网络应用程序。 为了提高效率,使用同步哈希映射缓存此资源。 这里的问题是当同时为同一个未缓存的资源发出两个不同的请求时:检索资源的操作会占用大量内存,所以我想避免为同一个资源多次调用它。 有人可以告诉我以下代码段是否存在任何潜在问题? 提前致谢。 private Map resources = Collections.synchronizedMap(new HashMap()); public void request(String name) { Resource resource = resources.get(name); if (resource == null) { synchronized(this) { if (resources.get(name) == null) { resource = veryCostlyOperation(name); // This should only be invoked once per resource… resources.put(resource); } else { resource = resources.get(name); } } } … […]

volley json缓存图像无法脱机工作

你好,我是anroid的初学者。 我创建了导航抽屉和碎片。 我可以使用url从json获取数据。 它在网上工作。 但离线时手机我正在“无法解决主机”错误。 我想在离线时使用json从url获取数据。 这不是缓存输入图像描述 分段 private static final String jsonUrl = “http://sunumsitesi.com/json.php”; private ProgressDialog pDialog; private List urunList = new ArrayList(); private ListView listView; private CustomListAdapter adapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_yemek, container, false); return root; } @Override public void onActivityCreated(Bundle savedInstanceState) […]

指定全局EhCache容量

我正在尝试将我的项目代码从OSCache迁移到EhCache。 我们不仅将OSCache用作二级Hibernate缓存提供程序,还用于存储其他不同性质的对象。 由于非重叠的缓存键,他们都愉快地共享相同的缓存实例而没有任何冲突。 移向EhCache时的一个重要区别是每个区域都有不同的缓存实例。 这可能是好的,因为它可以提高查找速度,因为不同性质的数据分别驻留。 不幸的是,这有配置地狱的代价。 让我解释。 在OSCache世界中,我将配置我的缓存容量,比方说,10000。现在,如果特定安装需要/可以提供更多的RAM,我会轻松地将其增加到50000,这样做。 现在在EhCache中,我必须为每个区域更改此​​delta的部分设置! 此外,一个安装可能具有更高类型X对象的使用,而另一个安装可能更喜欢更高类型的Y对象流失。我们有几十个安装,每个安装将有数百个不同的缓存。 为此,我们不得不雇佣一大群人,除了监控缓存模式和调整设置外什么都不做! 我期望CacheManager具有某种全局缓存容量设置,并且每个内部缓存将争取更多容量,具体取决于条目使用情况。 然而,我发现设置缓存容量的唯一方法是通过CacheConfiguration ,它与CacheManager是多对一的。 到目前为止,我能看到的唯一选择是尝试强制Hibernate为所有实体使用一个全局缓存。 有谁知道怎么做? 我的方案还有其他更好的解决方案吗?

如何在applet中禁用http缓存

如何在我的japplet中禁用所有http连接的http缓存? 我不希望我的任何http(请求/响应)被缓存。无论控制面板\ java \ Temporary File Settings中的用户设置如何。 Applet使用java1.6进行签名和编译。 我正在使用URLConnection.class,我正在缓存我对第三方Web服务的请求。 即: 我可以在Java Cache Viewer中看到我的请求URL。 http://www.service.com?param1=232&param2=2323232 此外,我可以在应用程序…. users \ data \ sun \ java \ deployment \ cache中找到响应 responseline1 responseline2