Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问用作缓存的HashMap_Java_Multithreading_Concurrency_Hashmap_Thread Safety - Fatal编程技术网

Java 访问用作缓存的HashMap

Java 访问用作缓存的HashMap,java,multithreading,concurrency,hashmap,thread-safety,Java,Multithreading,Concurrency,Hashmap,Thread Safety,我有一个RESTAPI,它将一条id为entityId的记录插入数据库。我有一个HashMap,它保存entityId和entity对象,它在这里充当缓存 在插入实体并更新缓存(HashMap)之后,当我进行查找时,有时无法从缓存中找到id 注意:-我正在循环中运行RESTAPI并进行负载测试,以验证对象始终存在于缓存中 我们非常感谢您在这方面提供的任何帮助。无法从缓存中找到id的原因可能是什么。这取决于负载测试的运行方式以及后续写入和读取请求之间的时间间隔 尽管更重要的是缓存/哈希映射的更新方

我有一个RESTAPI,它将一条id为entityId的记录插入数据库。我有一个HashMap,它保存entityId和entity对象,它在这里充当缓存

在插入实体并更新缓存(HashMap)之后,当我进行查找时,有时无法从缓存中找到id

注意:-我正在循环中运行RESTAPI并进行负载测试,以验证对象始终存在于缓存中


我们非常感谢您在这方面提供的任何帮助。无法从缓存中找到id的原因可能是什么。

这取决于负载测试的运行方式以及后续写入和读取请求之间的时间间隔

尽管更重要的是缓存/哈希映射的更新方式

Are you updating the HashMap BEFORE inserting into the Database


Are you updating the HashMap AFTER inserting into the Database.
如果在写入数据库后执行插入操作,则在更新HashMap之前可能会有延迟,这意味着当HashMap中出现后续读取请求时,HashMap尚未更新


在请求被添加到HM时,可能值得添加一个日志,以及读取请求进入时的日志。这可能会让您了解HashMap是否已实际更新。

HashMap不是线程安全的,请参阅:

请注意,此实现是不同步的。如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了该映射,则必须在外部对其进行同步。(结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改。)这通常通过在自然封装映射的某个对象上进行同步来实现。如果不存在此类对象,则应使用Collections.synchronizedMap方法“包装”映射。最好在创建时执行此操作,以防止意外不同步地访问映射:

您正在描述的地图中的插入将被视为结构修改

相反,使用a,更新不会像上面代码使用
synchronizedMap
那样锁定整个数据结构

如果问题是新值没有在其他线程需要使用它之前进入缓存,仅仅因为线程正在快速连续地访问相同的代码,那么接受缓存未命中可能比引入瓶颈要好。最好不要在insert时缓存结果,而是等待第一个select查询(在提交insert后的新事务中),这样可以避免在缓存中添加条目,然后事务回滚,从而在缓存中留下无效数据

此外,使用大量内存存储未被使用的条目也有危险。您可以让工作线程定期检查过期的项目


缓存是比看起来更难的事情之一。考虑在这里使用替代你自己的解决方案。< /P>是CONCURESHASMAP吗?课程的范围是什么?在更新缓存之后,您是否正在进行日志记录?如果是,您能看到id吗?是,当我进行记录时,我看到地图中存在最新的值。但是我尝试使用ma.getValues()获取值方法新添加的值没有反映出来。当我从同一个映射中进行第二次查找时,我可以看到该值大部分时间都存在。我已经尝试使用HashMap和ConcurrentHashMap。为什么在插入数据库后更新HashMap时会出现延迟?这取决于插入记录所需的时间以及如何设置与数据库的连接。但是,如果在数据库插入之后对HashMap进行更新,则可能意味着在更新HashMap之前需要几百毫秒。由于您提到您是在循环中执行此操作的,这可能意味着您用于读取的RESTAPI甚至在此次更新之前就被触发了。我并不是说这可能是一个问题,我只是想说这可能是一个潜在的原因。
Map m = Collections.synchronizedMap(new HashMap(...));