* avoids database access for already loaded entities * faster for reading frequently accessed unmodified entities
The disadvantages of L2 caching are:
* memory consumption for large amount of objects * Stale data for updated objects * Concurrency for write (optimistic lock exception, or pessimistic lock) * Bad scalability for frequent or concurrently updated entities
You should configure L2 caching for entities that are:
* read often * modified infrequently * Not critical if stale
You should protect any data that can be concurrently modified with a locking strategy:
* Must handle optimistic lock failures on flush/commit * configure expiration, refresh policy to minimize lock failures
The Query cache is useful for queries that are run frequently with the same parameters, for not modified table