Tag: caching

从头开始使用双向链接列表的LRU缓存 – moveToHead(Java)

我已经实现了一个简单的LRU缓存作为从头开始手动编写的双向链表。 缓存中填充了由数字(整数)ID区分的对象Request。 这些请求对象被生成为针对一组N <L个预定义的请求对象的L个随机独立且相同分布的请求的流,并且逐个地(即以串行方式)到达高速缓存。 然后我检查缓存命中或未命中以及当前缓存大小是否已达到最大缓存大小,然后根据具体情况,我执行将请求的项目插入缓存或从请求的项目替换LRU缓存项目。 缓存的其中一个操作如下:当我有缓存命中时,如果请求的项目不在头部,则必须将其移动到那里。 举个例子,假设缓存的最大大小为M = 4,其给定时间的内容如下: 货号:7 | 3 | 4 | 五 缓存位置索引:0 | 1 | 2 | 3(头是0,尾是3) 现在,如果我们有一个项目4的缓存命中,由于这个项目不在缓存的头部,它应该被移动到那里,结果将是: 货号:4 | 7 | 3 | 五 缓存位置索引:0 | 1 | 2 | 3(头是0,尾是3) 但是,当我运行代码时,结果是这样: 货号:4 | 7 | 3 | 4 | 五 缓存位置索引:0 | 1 | 2 | 3 […]

在Java中缓存和重用不可变单例对象的最佳方法是什么?

我有一个表示一组值的类,这些值将用作映射中的键。 这个类是不可变的,我想使用静态工厂模式使它成为每个不同值集的单例。 目标是防止相同对象被创建多次(100+)次并优化equals方法。 我正在寻找缓存和重用此类的先前实例的最佳方法。 首先想到的是一个简单的hashmap,但还有其他选择吗?

禁用JPA EclipseLink 2.4缓存

我正在尝试禁用EclipseLink 2.4缓存,因此如果其他应用程序在数据库中更改了数据,则在我的应用程序中刷新相同的数据,使用EclipseLink 2.4,而不重新启动它。 这些属性似乎都不起作用: NONE … 帮助的唯一选择是: typedQuery.setHint(QueryHints.REFRESH, HintValues.TRUE); 但这对我来说不是一个选项,因为现在该应用程序已编写,我不想搜索所有查询或em.find()方法并将此提示放入。 编辑1:此处描述了类似的问题: http : //eclipse.1072660.n5.nabble.com/Notifications-about-external-database-changes-td5389.html 编辑2:总结一下,我希望所有查询和查找调用都会刷新从数据库中获取的数据。

JPA Eclipselink数据库更改通知不会使缓存条目无效

我有两个使用Eclipselink 2.4.2进行持久化的Java 1.7应用程序。 一个应用程序是在Glassfish 3.1.2.2中运行的JEE应用程序,另一个是Java SE应用程序。 这些应用程序读取和写入相同的数据,因此可能存在过时的JPA缓存条目。 我试图使用Oracle DCN来解决过时的缓存问题。 我已经按照上面的链接中的描述配置了我的persistence.xml: org.eclipse.persistence.jpa.PersistenceProvider jdbc/DRMS 然而,我仍然得到陈旧的缓存条目。 如果一个应用程序提交对数据库的更改,则第二个应用程序仍会看到其旧的过时缓存条目,而不是新的更改。 使用调试器,我已经确认OracleChangeNotificationListener正在接收数据库事件,但它似乎永远不会使缓存中的任何内容无效。 Eclipselink OracleChangeNotificationListener注册以下侦听器以接收Oracle数据库更改事件: public void onDatabaseChangeNotification(DatabaseChangeEvent changeEvent) { databaseSession.log(SessionLog.FINEST, SessionLog.CONNECTION, “dcn_change_event”, changeEvent); if (changeEvent.getTableChangeDescription() != null) { for (TableChangeDescription tableChange : changeEvent.getTableChangeDescription()) { ClassDescriptor descriptor = OracleChangeNotificationListener.this.descriptorsByTable.get(new DatabaseTable(tableChange.getTableName())); if (descriptor != null) { CacheIndex index = descriptor.getCachePolicy().getCacheIndex(fields); for (RowChangeDescription rowChange : […]

是否可以使用JAX-RS设置ETag而无需使用Response对象?

在我发现的关于JAX-RS和缓存的少数问题(有答案)之一中 ,生成ETag(用于缓存)的答案是在Response对象上设置一些值。 如下所示: @GET @Path(“/person/{id}”) public Response getPerson(@PathParam(“id”) String name, @Context Request request){ Person person = _dao.getPerson(name); if (person == null) { return Response.noContent().build(); } EntityTag eTag = new EntityTag(person.getUUID() + “-” + person.getVersion()); CacheControl cc = new CacheControl(); cc.setMaxAge(600); ResponseBuilder builder = request.evaluatePreconditions(person.getUpdated(), eTag); if (builder == null) { builder = Response.ok(person); } return […]

寻找java.util.Map的替代品

问题 关注这个问题 ,似乎基于文件或磁盘的Map实现可能是我在那里提到的问题的正确解决方案。 简洁版本: 现在,我有一个实现为ConcurrentHashMap的Map 。 条目以相当固定的速率不断添加到其中。 稍后详细说明。 最终,无论如何,这意味着JVM耗尽了堆空间。 在工作中,(强烈)建议我使用SQLite解决此问题,但在询问上一个问题之后,我认为数据库不是这项工作的正确工具。 所以 – 让我知道这听起来有多疯狂 – 我认为更好的解决方案是存储在磁盘上的Map 。 不好的主意:自己实现这个。 更好的主意:使用别人的图书馆! 哪一个? 要求 必备: 自由。 持久性。 数据需要在JVM重启之间保持不变。 某种可搜索性。 是的,我需要能够检索这些数据以及将其丢弃。 基本结果集过滤是一个加号。 与平台无关。 需要在Windows或Linux计算机上进行生产部署。 可以清除 。 磁盘空间是有限的,就像堆空间一样。 我需要摆脱n天的条目。 如果我必须手动执行此操作,这不是什么大问题。 尼斯对富人: 使用方便。 如果我能在本周末完成这项工作,那将是很棒的。 更好的是:一天结束。 如果我可以在我的类路径中添加一个JAR,更改new ConcurrentHashMap();那真的非常非常棒new ConcurrentHashMap(); 到new SomeDiskStoredMap(); 并完成。 体面的可扩展性和性能。 最坏的情况:新的条目(平均)每秒增加3次,每秒,每天,每天。 但是,插入并不总是顺利发生。 它可能是(no inserts for an hour)然后(insert 10,000 objects at […]

如何在eclipselink中禁用缓存

我尝试使用persistence.xml中的以下属性在Eclipse indigo中禁用EclipseLink中的L2缓存: – NONE 基本上我正在测试一个场景,即在两个不同会话中创建的同一对象是否击中数据库两次,或者两个会话都指的是在内存缓存中的早期会话中创建的同一对象。 它不应该因为在persistence.xml中提到上述属性而禁用了L2缓存 我的代码如下: – Session session = DataAccessManager.getManager().openSession(); ReferenceObjectRepository referenceObjectRepository = ReferenceObjectRepository.getInstance(); ReferenceObjectKey referenceObjectKey = new ReferenceObjectKey(getStringValue(“testCacheByPass.input”)); //load object first time. ReferenceObject referenceObject = referenceObjectRepository.load(ReferenceObject.class, referenceObjectKey); logger.log(Level.SEVERE, “Cache ReferenceObject: ” + referenceObject); //load object in another session Session sessionNew = DataAccessManager.getManager().openNewSession(); Object dbObject = referenceObjectRepository.load(ReferenceObject.class, referenceObjectKey); logger.log(Level.SEVERE, “DB loaded ReferenceObject: ” […]

MessageFactory的jaxp对象缓存

可以重用javax.xml.soap.MessageFactory吗? 即 msgFactory = MessageFactory.newInstance(); 我可以缓存msgFactory并根据需要重用它来创建新的SOAPMessages吗? 还应该是msgFactory.createMessage(); 如果可以在代码中重用msgFactory,可以同步吗? 更新: 同样在单线程代码中,我可以存储msgFactory来反复创建SOAPMessages,以免每次都创建一个MessageFactory的新实例谢谢

分布式缓存

我正在寻找一个Java分布式缓存解决方案。 我们希望function如下: 分散式 自动发现 冗余 非集中 我们已经分析了像TerraCotta这样的框架,它似乎是我们从缓存框架中想要的一切……然而,似乎需要一个中心缓存节点,它们成为我们的单点故障。 除推出我们自己的解决方案以外的任何想法?

Joshua Bloch在有效的java中建议如何在Java中使用缓存哈希码?

我有以下来自Joshua Bloch的有效java代码(第9章,第3章,第49页) 如果类是不可变的并且计算哈希代码的成本很高,您可以考虑在对象中缓存哈希代码,而不是在每次请求时重新计算它。 如果您认为此类型的大多数对象将用作哈希键,则应在创建实例时计算哈希码。 否则,您可能会在第一次调用hashCode时选择懒惰地初始化它(Item 71)。 目前尚不清楚我们的PhoneNumber课程是否值得这样做,只是为了向您展示它是如何完成的: // Lazily initialized, cached hashCode private volatile int hashCode; // (See Item 71) @Override public int hashCode() { int result = hashCode; if (result == 0) { result = 17; result = 31 * result + areaCode; result = 31 * result + prefix; result = 31 * […]