You can consider the spring's caching if you are using spring in your application.
A cache is hidden and it will improves application's performance but does that by allowing the same data to be read multiple times in a fast fashion.
As mentioned in Spring Documentation:
At its core, the abstraction applies caching to Java methods, reducing thus the number of executions based on the information available in the cache.
That is, each time a targeted method is invoked, the abstraction will apply a caching behavior checking whether the method has been already executed for the given arguments. If it has, then the cached result is returned without having to execute the actual method; if it has not, then method is executed, the result cached and returned to the user so that, the next time the method is invoked, the cached result is returned. This way, expensive methods (whether CPU or IO bound) can be executed only once for a given set of parameters and the result reused without having to actually execute the method again. The caching logic is applied transparently without any interference to the invoker.
@Cacheable("books")
public Book findBook(ISBN isbn) {...}
In the snippet above, the method findBook is associated with the cache named books. Each time the method is called, the cache is checked to see whether the invocation has been already executed and does not have to be repeated.
This is just a sample to give you an idea about the spring caching. The example is already given in their official site which you can refer and gain detailed knowledge from here.
Some more example you can find here also.