First level cache
·
First level cache is associated with “session” object.
·
The scope of cache objects is of session.
·
Once session is closed, cached objects are gone forever.
·
First level cache is enabled by default and you cannot disable
it.
·
When we query an entity first time, it is retrieved from
database and stored in first level cache associated with hibernate session. If
we query same object again with same session object, it will be loaded from
cache and no sql query will be executed.
·
The loaded entity can be removed from session using evict()
method.
·
The next loading of this entity will again make a database call
if it has been removed using evict() method.
·
The whole session cache can be removed using clear() method. It
will remove all the entities stored in cache.
Second level cache
·
Second level cache is apart from first level cache which is
available to be used globally in session factory scope.
·
Second level cache is created in session factory scope and is
available to be used in all sessions which are created using that particular session
factory. It also means that once session factory is closed, all cache
associated with it die and cache manager also closed down.
·
Whenever hibernate session try to load an entity, the very first
place it look for cached copy of entity in first level cache (associated with
particular hibernate session).
1.
If cached copy of entity is present in first level cache, it is
returned as result of load method.
2.
If there is no cached entity in first level cache, then second
level cache is looked up for cached entity. If second level cache has cached
entity, it is returned as result of load method. But, before returning the
entity, it is stored in first level cache also so that next invocation to load
method for entity will return the entity from first level cache itself, and
there will not be need to go to second level cache again.
·
If entity is not found in first level cache and second level
cache also, then database query is executed and entity is stored in both cache
levels, before returning as response of load() method.