views:

2049

answers:

2

Hi every one, I want use second level cache in my hibernate Project but I just know a little about hibernate second level cache, can any one explain how shoud I use this in my code and what configuration and .jar file I need? I set these setting to my hibernate.cfg.xml file

 <property name="hibernate.cache.use_query_cache">true</property>
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>

and add these jar file ehcache-1.6.1.jar, ehcache-1.6.1-javadoc.jar, ehcache-1.6.1-sources.jar I want know shoud I change any other configuration?

and how can I understand that my project uses Second level cache?

if just put this setting, hibernate automatically use this or I must use ant other code in my .java class(like any annotation or something else)

+4  A: 

Your settings will make the second-level and query caches available for use in your project, but you still need to enable it for specific entities, collections, and queries. This requires some careful planning because there are trade-offs that you'll need to understand. In general, the second-level and query caches are appropriate for read-only or read-mostly data, but not volatile data. If you don't already own it, I would recommend picking up a copy of Java Persistence with Hibernate. It has a very good treatment of the subject.

Rob H
Tanx for answer but need more quick information :|
Am1rr3zA
+4  A: 

The annotation you're looking for is org.hibernate.annotations.Cache. Basic usage is:

@Entity
@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public MyEntity {
    ...

  @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
  public List<ElementType> getSomeCollection() {
    ...
  }
}

For queries, you need to enable query cache by setting hibernate.cache.use_query_cache property to true AND specify that query is cacheable in its declaration (for named queries) or by calling setCacheable(true) on query instance.

All that said, you need to be really careful with caching and REALLY UNDERSTAND what you're doing, otherwise it'll do more harm than help. Don't look at it as "quick fix" - caching everything, for example, is definitely the wrong thing to do.

ChssPly76
1- Shoud I define @Cache above all of my Entity class? when want use second level cache in my project or can I set @Cache above of some specific Entity Class?2- there is no dif in annotation syntax that what second_level_cache implementation i use? (i use net.sf.ehcache.hibernate.EhCacheProvider)
Am1rr3zA
1) You most certainly should not make all your entities cacheable. Best candidates for caching are entities that are read often but don't change often and you don't have too many of them. Enable Hibernate's SQL log, see what "SELECT * FROM my_entity_table WHERE ID=?" queries run most often, those MAY be candidates for entity caching.2) Implementations are configured via properties (like you've done). Annotations are the same no matter what implementation you use; however some implementations may not support some cache strategies. Link I posted in my answer lists all implementation features.
ChssPly76