Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Second level cache vs query cache vs collection cache?

As per my understanding, Second level cache will be used when the objects are loaded using their primary key. This includes fetching of associations.I can think of only above session.get(), session.load methods where second level cache will come in to picture.

If association is collection or some other entity , how it can be cached ? For example :-

  @Cacheable
  public class Department{
   private List Employees;
   private DepatmentDetail detail ;

}

How can i make association Employees and detail cacheable ? I think i need to mention @cache above associations Employees and detail. But that didn't work?

when developer does department.getEmployees(), hibernate will internally fire the query i.e

 select * from employees where deptId =1;

Now if i use query cache where i explicitly make above query and fetch the results, query will be fired again to db. why query is fired again . I think this is related to how hibernate internally stores the result of second level cache and query cache(they may be stored in separate regions). If somebody can throw light on this aspect also, it will be great.

like image 547
M Sach Avatar asked May 04 '14 08:05

M Sach


People also ask

What is 2nd level cache?

A second-level cache is a local store of entity data managed by the persistence provider to improve application performance. A second-level cache helps improve performance by avoiding expensive database calls, keeping the entity data local to the application.

What is query level cache?

Query-level Cache This is an optional feature and requires two additional physical cache regions that hold the cached query results and the timestamps when a table was last updated. This is only useful for queries that are run frequently with the same parameters.

Which 2nd level cache is better in Hibernate?

Hibernate second level cache uses a common cache for all the session object of a session factory. It is useful if you have multiple session objects from a session factory. SessionFactory holds the second level cache data. It is global for all the session objects and not enabled by default.

What is the difference between first level cache and second level cache?

The first level cache is associated with the Session Object, while the second-level cache is associated with the SessionFactory object. This means first-level cache's scope is limited to session-level while second-level cache's scope is at the application level.


2 Answers

Have a look at below links where it is explained in details.

  • Hibernate Caching

  • Hibernate Caching Community Edition

  • Hibernate: Truly Understanding the Second-Level and Query Caches

Query-level cache:

Hibernate also implements a cache for query resultsets that integrates closely with the second-level cache.

This is an optional feature and requires two additional physical cache regions that hold the cached query results and the timestamps when a table was last updated. This is only useful for queries that are run frequently with the same parameters.

Second-level cache

Hibernate is compatible with several second-level cache providers. Any implementation can be used for second level cache.

Difference:

Query Cache's sole purpose is to cache the queries whereas Second Cache can be used to cache for other caches also.

Query cache is provided by Hibernate internally whereas for Second level cache you have to choose some external second level cache such as Infinispan, EHCache etc.

enter image description here

like image 58
Braj Avatar answered Oct 03 '22 14:10

Braj


Second level cache has hash table like structure internally to hold the data. The Key here will be the identifier of the entity and value will be dehydrated values of the entity. To get the data out of this L2 cache, you must have a Key i.e. identifier of the entity. So clearly you can use it with methods where you are fetching entity by id.

This scenario changes when you have query_cache also enabled with L2 cache. Query cache stores the query and it's corresponding resultset entities' ids. Now even if you are not fetching by id (using JPQL or HQL OR queryDsl), hibernate checks if the same query is fired earlier and if yes get the list of ids from the query cache. After that returns the entities from L2 cache corresponding to same ids.

like image 25
Mudit bhaintwal Avatar answered Oct 03 '22 14:10

Mudit bhaintwal