èšäºã®ç¿»èš³ã¯ãããŒãžã§ã³Hibernate 4.2.19.Finalã«é¢é£ããŠããŸã
åç« -Hibernateéçºè ããã¥ã¡ã³ã-ç« V.ããã¯
Hibernateã®1次ããã³2次ãã£ãã·ã¥ãšã¯ã次ã®å³ã«ç€ºãããŠããŸãïŒ èè ã®ã¡ã¢ ïŒã

6.1ã ãªã¯ãšã¹ããã£ãã·ã¥
åããã©ã¡ãŒã¿ãŒã§ç¹°ãè¿ãå®è¡ãããã¯ãšãªãããå Žåãã¯ãšãªãã£ãã·ã³ã°ã«ããããã©ãŒãã³ã¹ãåäžããŸãã
ãã£ãã·ã¥ã«ãããè¿œå ã®ãã©ã³ã¶ã¯ã·ã§ã³ãªãŒããŒããããçºçããŸãã ããšãã°ããªããžã§ã¯ãã«é¢ããã¯ãšãªã®çµæããã£ãã·ã¥ããå ŽåãHibernateã¯ãªããžã§ã¯ããžã®å€æŽãã³ãããããããã©ãããç£èŠããããã«å¿ããŠãã£ãã·ã¥ãšã³ããªãç Žæ£ããå¿ èŠããããŸãã ããã«ãã¯ãšãªãã£ãã·ã³ã°ã®å©ç¹ã¯éãããŠãããã¢ããªã±ãŒã·ã§ã³ã®äœ¿çšãã¿ãŒã³ã«å€§ããäŸåããŸãã ãããã®çç±ã«ãããHibernateã¯ããã©ã«ãã§ã¯ãšãªã®ãã£ãã·ã¥ãç¡å¹ã«ããŸãã
æé 6.1ã ã¯ãšãªãã£ãã·ã¥ãèš±å¯ãã
- hibernate.cache.use_query_cacheããããã£ãtrueã«èšå®ããŸã ã
ãã®èšå®ã«ããã2ã€ã®æ°ãããã£ãã·ã¥é åãäœæãããŸãã
- org.hibernate.cache.internal.StandardQueryCacheã¯ãã£ãã·ã¥ãããã¯ãšãªã®çµæãä¿åããŸãã
- org.hibernate.cache.spi.UpdateTimestampsCacheã¯ãèŠæ±ãããããŒãã«ã«æè¿ã®æŽæ°ã®ã¿ã€ã ã¹ã¿ã³ããä¿åããŸãã ãããã®ã¿ã€ã ã¹ã¿ã³ãã¯ãã¯ãšãªãã£ãã·ã¥ããååŸããçµæãæ€èšŒããŸãïŒã€ãŸããããããä»ããŠããªããžã§ã¯ãã®é¢é£æ§ããã§ãã¯ãããŸã- ãããTransl ïŒã
- ãã£ãã·ã¥é åã®ã¿ã€ã ã¢ãŠããæ§æãã
ãã£ãã·ã¥ã®å®è£ ã§ã¿ã€ã ã¢ãŠããŸãã¯æå¹æéãæ§æããå Žåã UpdateTimestampsCacheã®åºç€ãšãªããã£ãã·ã¥é åã®ã¿ã€ã ã¢ãŠãããèŠæ±ãã£ãã·ã¥ã®ã¿ã€ã ã¢ãŠãããã倧ããå€ã«èšå®ããŸãã UpdateTimestampsCacheãªãŒãžã§ã³ã«ç¡æéã®ã¿ã€ã ã¢ãŠããèšå®ããããšã¯å¯èœã§ãããæšå¥šãããŠããŸãã ããå ·äœçã«ã¯ãLRUãã£ãã·ã³ã°ããªã·ãŒïŒæé·æªäœ¿çšæéïŒã¯é©åãšã¯èŠãªãããŸããã
- ç¹å®ã®ã¯ãšãªã®çµæãã£ãã·ã¥ãèš±å¯ãã
ã»ãšãã©ã®ãªã¯ãšã¹ãã¯ãã£ãã·ã³ã°ã®æ©æµãåããªãããããã£ãã·ã³ã°ãæ®éçã«æå¹ã«ãªã£ãåŸã§ããåã ã®ãªã¯ãšã¹ãã«å¯ŸããŠãã£ãã·ã³ã°ãèš±å¯ããã ãã§æžã¿ãŸãã ç¹å®ã®ãªã¯ãšã¹ãã®ãã£ãã·ã¥ãæå¹ã«ããã«ã¯ã org.hibernate.Query.setCacheableïŒtrueïŒãåŒã³åºããŸã ã ãã®åŒã³åºãã«ããããªã¯ãšã¹ãã¯å®è¡åã«ãã£ãã·ã¥ããèŠããããå®è¡åŸã«çµæãããã«çœ®ãããšãã§ããŸãã
ã¯ãšãªãã£ãã·ã¥ã¯ããã£ãã·ã¥å ã®é¢é£ãããšã³ãã£ãã£ã®ç¶æ ããã£ãã·ã¥ããŸããã èå¥åã®å€ããã£ãã·ã¥ããçµæãå ¥åããŸãã ãããã£ãŠãèŠæ±ãã£ãã·ã¥ã®äžéšãšããŠãã£ãã·ã¥ããå¿ èŠããããšã³ãã£ãã£ã«å¯ŸããŠã¯ãåžžã«2次ãã£ãã·ã¥ãšçµã¿åãããèŠæ±ãã£ãã·ã¥ã䜿çšããŸãã
6.1.1ã èŠæ±ãã£ãã·ã¥é å
ã¯ãšãªãã£ãã·ã¥ã®æå¹æéããªã·ãŒãããé©åã«å¶åŸ¡ããã«ã¯ã Query.setCacheRegionïŒïŒãåŒã³åºããŠãç¹å®ã®ã¯ãšãªã®ååä»ããã£ãã·ã¥é åãæå®ããŸãã
äŸ6.1ã SetCacheRegionã¡ãœãã
List blogs = sess.createQuery("from Blog blog where blog.blogger = :blogger") .setEntity("blogger", blogger) .setMaxResults(15) .setCacheable(true) .setCacheRegion("frontpages") .list();
ã¯ãšãªãã£ãã·ã¥ã«ãã®é åã®1ã€ã匷å¶çã«æŽæ°ããããã£ãã·ã¥ãããããŒã¿ãç¡èŠããã«ã¯ã org.hibernate.Query.setCacheModeïŒCacheMode.REFRESHïŒãåŒã³åºããŸãã ã¯ãšãªçšã«å®çŸ©ããããªãŒãžã§ã³ãšçµã¿åãããŠãHibernateã¯ãã®ãªãŒãžã§ã³ã«ãã£ãã·ã¥ãããçµæãéžæçã«æŽæ°ããŸãã ããã¯ã org.hibernate.SessionFactory.evictQueriesïŒïŒã䜿çšããŠãªãŒãžã§ã³ããã¬ã³ãŒããäžæ¬åé€ãããããå¹ççã§ãã
6.2ã ã¬ã€ã€ãŒ2ãã£ãã·ã¥ãããã€ããŒ
Hibernateã¯ãäžéšã®äºæ¬¡ãã£ãã·ã¥ãããã€ããŒãšäºææ§ããããŸãã Hibernateã§å®çŸ©ãããŠãããã¹ãŠã®å¯èœãªãã£ãã·ã¥æŠç¥ããµããŒããããããã€ããŒã¯ãããŸããã ã»ã¯ã·ã§ã³6.2.3ãHibernateã®ã¬ã€ã€ãŒ2ãã£ãã·ã¥ãããã€ããŒãã«ã¯ããããã€ããŒã®ãªã¹ããšããã®ã€ã³ã¿ãŒãã§ãŒã¹ããã³ãµããŒãããããã£ãã·ã¥æŠç¥ãå«ãŸããŠããŸãã ãã£ãã·ã³ã°æŠç¥ã®å®çŸ©ã«ã€ããŠã¯ã ã»ã¯ã·ã§ã³6.2.2ããã£ãã·ã³ã°æŠç¥ããåç §ããŠãã ããã
6.2.1ã ã«ã¹ã¿ã ãã£ãã·ã¥ãããã€ããŒã®æ§æ
泚éãŸãã¯ãããã³ã°ãã¡ã€ã«ã䜿çšããŠããã£ãã·ã¥ãããã€ããŒãæ§æã§ããŸãã ãšã³ãã£ãã£ã¯ãããã©ã«ãã§ã¯2次ãã£ãã·ã¥ã®äžéšã§ã¯ãªãããã䜿çšã¯æšå¥šãããŠããŸããã ãŸã ãšã³ãã£ãã£ã䜿çšããå¿ èŠãããå Žåã¯ã shared-cache-modeèŠçŽ ãpersistence.xmlã«èšå®ããããæ§æã§javax.persistence.sharedCache.modeããããã£ã䜿çšããŸãã è¡š6.1ãå ±æãã£ãã·ã¥ã¢ãŒãã«èšå®å¯èœãªå€ãã®ããããã®å€ã䜿çšããŸãã
è¡š6.1ã å ±æãã£ãã·ã¥ã¢ãŒãã®å¯èœãªå€
äŸ¡å€ | 説æ |
---|---|
ENABLE_SELECTIVE | æ瀺çã«ãã£ãã·ã¥å¯èœãšããŠããŒã¯ããªãéãããšã³ãã£ãã£ã¯ãã£ãã·ã¥ãããŸããã
ãã®å€ã¯æšå¥šãããããã©ã«ãã§äœ¿çšãããŸãã |
DISABLE_SELECTIVE | ãšã³ãã£ãã£ã¯ãæ瀺çã«ãã£ãã·ã¥ããã£ã³ã»ã«ãããŸã§ãã£ãã·ã¥ãããŸãã |
ãã¹ãŠ | ãã£ãã·ã¥ãªããšããŠããŒã¯ãããã©ããã«é¢ä¿ãªãããã¹ãŠã®ãšã³ãã£ãã£ããã£ãã·ã¥ãããŸãã |
ãªã | ãšã³ãã£ãã£ããã£ãã·ã¥å¯èœãšããŠããŒã¯ããŠãããšã³ãã£ãã£ã¯ãã£ãã·ã¥ãããŸããã ãã®ãªãã·ã§ã³ã¯ãã£ã³ã»ã«ããŸã
äºæ¬¡ãã£ãã·ã¥æäœã |
ã°ããŒãã«ãªäžŠè¡æ§æŠç¥ã¯ã hibernate.cache.default_cache_concurrency_strategyããããã£ã䜿çšããŠèšå®ãããŸãã 6.2.2é ããã£ãã·ã³ã°æŠç¥ãã®å¯èœãªå€ãåç §ããŠãã ããã
éèŠã§ã
å¯èœãªéããç¹å®ã®ãšã³ãã£ãã£ã«å¯ŸããŠã®ã¿äžŠè¡åŠçãã£ãã·ã¥æŠç¥ãå®çŸ©ããŸãããã°ããŒãã«ã«ã¯å®çŸ©ããŸããã ã¢ãããŒã·ã§ã³@ org.hibernate.annotations.Cacheã䜿çšããŸãã
äŸ6.2 泚éã䜿çšããŠãã£ãã·ã¥ãããã€ããŒãæ§æããŸãã
@Entity @Cacheable @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class Forest { ... }
ã³ã¬ã¯ã·ã§ã³ã«ä»ã®ãšã³ãã£ãã£ãå«ãŸããŠããå Žåãã³ã¬ã¯ã·ã§ã³ãŸãã¯èå¥åã®ã³ã³ãã³ãããã£ãã·ã¥ã§ããŸãã ã³ã¬ã¯ã·ã§ã³ããããã£ã§@Cacheã¢ãããŒã·ã§ã³ã䜿çšããŸãã
@Cacheã«ã¯ããã€ãã®å±æ§ãå«ãŸããŠããŸãã
@Cacheã¢ãããŒã·ã§ã³ã®å±æ§ ïŒ
å | 説æ |
---|---|
䜿ãæ¹ | æå®ããããã£ãã·ã¥ã®äžŠè¡æ§æŠç¥ã
|
å°å | ãã£ãã·ã³ã°å°å ãã®å±æ§ã¯ãªãã·ã§ã³ã§ãããããã©ã«ãã§ã¯å®å
šãªã¯ã©ã¹åã«ãªããŸãããŸãã¯
ã³ã¬ã¯ã·ã§ã³ã®ä¿®é£ŸãããããŒã«å |
å«ã | ãã¹ãŠã®ããããã£ãå«ãããã©ããã ãªãã·ã§ã³ã§ã2ã€ã®å¯èœãªå€ãåãããšãã§ããŸãã
|
äŸ6.3 ãããã³ã°ãã¡ã€ã«ã䜿çšãããã£ãã·ã¥ãããã€ããŒã®æ§æã
<cache usage="transactional" region="RegionName" include="all" />
äŸ6.2ãã¢ãããŒã·ã§ã³ã䜿çšãããã£ãã·ã¥ãããã€ããŒã®èšå®ãã®ããã«ããããã³ã°ãã¡ã€ã«ã§å±æ§ãæå®ã§ããŸãã ãããã³ã°ãã¡ã€ã«ã®å±æ§ã®æ§æã«ã¯ãããã€ãã®ç¹å®ã®éãããããŸãã
å | 説æ |
---|---|
䜿ãæ¹ | ãã£ãã·ã³ã°æŠç¥ã ãã®å±æ§ã¯å¿
é ã§ããã次ã®ããããã®å€ãåãããšãã§ããŸãã
|
å°å | 2次ãã£ãã·ã¥é åã®ååã ããã©ã«ãã§ã¯ãå®å šä¿®é£Ÿã¯ã©ã¹åãŸãã¯ããŒã«ã³ã¬ã¯ã·ã§ã³åãšäžèŽããŸãã |
å«ã | æå¹ã«ãããšãlazy = trueã§æå®ããããšã³ãã£ãã£ããããã£ããã£ãã·ã¥ã§ããŸãã
ãé 延ãå±æ§ã¬ãã«ã®ãµã³ããªã³ã°ã ããã©ã«ãã¯ãã¹ãŠã§ãé 延ãªãã§ãããŸããŸãã |
cacheã®ä»£ããã«ã hibernate.cfg.xmlã® class-cache ã collection-cacheèŠçŽ ã䜿çšã§ããŸãã
6.2.2ã ãã£ãã·ã³ã°æŠç¥
- èªã¿åãå°çš
èªã¿åãå°çšãã£ãã·ã¥ã¯ãèªã¿åããããå€æŽãããŠããªãããŒã¿ã«é©ããŠããŸãã ã¯ã©ã¹ã¿ãŒç°å¢ã§ãå®å šãªãã·ã³ãã«ã§æ©èœçãªã¢ãããŒãã - éå³å¯ãªèªã¿æžã
äžéšã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããŒã¿ããšãã©ãèªã¿åãã ãã§æžã¿ãŸãã ããã¯ã2ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ãåããšã³ãã£ãã£ãåæã«æŽæ°ããå¯èœæ§ãäœãå Žåã§ãã ãã®å Žåããã©ã³ã¶ã¯ã·ã§ã³ã®åé¢ãå¶éããå¿ èŠã¯ãªããéå³å¯ãªèªã¿åã/æžã蟌ã¿ãã£ãã·ã¥ãéåžžã«é©ããŠããŸãã ãã£ãã·ã¥ãJTAç°å¢ã§äœ¿çšãããå Žåã hibernate.transaction.manager_lookup_classãæå®ããå¿ èŠããããŸãã ä»ã®ç°å¢ã§ã¯ã Session.closeïŒïŒãŸãã¯Session.disconnectïŒïŒãåŒã³åºãåã«ããã©ã³ã¶ã¯ã·ã§ã³ãå®äºããŠããããšã確èªããŠãã ããã
- èªã¿æžã
èªã¿æžããã£ãã·ã¥ã¯ãããŒã¿ãå®æçã«æŽæ°ãããã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããŸãã ã·ãªã¢ã©ã€ãºå¯èœãªãã©ã³ã¶ã¯ã·ã§ã³ã®åé¢ãå¿ èŠãªå Žåã¯ãèªã¿æžãæŠç¥ã䜿çšããªãã§ãã ããã JTAç°å¢ã§ã¯ã hibernate.transaction.manager_lookup_classããããã£ãèšå®ããŠãJTA TransactionManagerãååŸããæŠç¥ãæå®ããŸãã éJTAç°å¢ã§ã¯ã Session.closeïŒïŒãŸãã¯Session.disconnectïŒïŒãåŒã³åºãåã«ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããŠããããšã確èªããŠãã ããã
éèŠã§ãã¯ã©ã¹ã¿ãŒç°å¢ã§èªã¿åã/æžã蟌ã¿æŠç¥ã䜿çšããã«ã¯ãåºç€ãšãªããã£ãã·ã¥å®è£ ãããã¯ããµããŒãããå¿ èŠããããŸãã çµã¿èŸŒã¿ãã£ãã·ã¥ãããã€ããŒã¯ããããã³ã°ããµããŒãããŠããŸããã
- ãã©ã³ã¶ã¯ã·ã§ã³
Transactional Caching Strategyã¯ãJBoss TreeCacheãªã©ã®ãã©ã³ã¶ã¯ã·ã§ã³ãã£ãã·ã¥ãããã€ããŒã®ãµããŒããæäŸããŸãã ãã®ãããªãã£ãã·ã¥ã¯JTAç°å¢ã§ã®ã¿äœ¿çšã§ããæåã¯hibernate.transaction.manager_lookup_classãæå®ããå¿ èŠããããŸãã
6.2.3ã Hibernateã¬ã€ã€ãŒ2ãã£ãã·ã¥ãããã€ããŒ
ãã£ãã·ã¥ | ãµããŒããããŠããæŠç¥ |
---|---|
HashTableïŒãã¹ãã®ã¿ïŒ |
|
ãšãã㧠|
|
ã€ã³ãã£ãã¹ãã³ |
|
6.3ã ãã£ãã·ã¥ç®¡ç
6.3.1ã ãã£ãã·ã¥ãšã³ããªã®è¿œå /ååŸ
å éšã»ãã·ã§ã³ãã£ãã·ã¥ã«ãšã³ããªãè¿œå ããã¢ã¯ã·ã§ã³ïŒ
ãšã³ãã£ãã£ã®ä¿åãŸãã¯æŽæ° | ãšã³ãã£ãã£ãæœåº |
---|---|
|
|
ãã£ãã·ã¥ãããã¬ã³ãŒããåæãŸãã¯åé€ããŸãã flushïŒïŒã¡ãœãããåŒã³åºããšããªããžã§ã¯ãã®ç¶æ ã¯ããŒã¿ããŒã¹ãšåæãããŸãã åæãåé¿ããããã«ã evictïŒïŒã¡ãœããã䜿çšããŠããªããžã§ã¯ããšãã®ã³ã¬ã¯ã·ã§ã³ãäžæ¬¡ãã£ãã·ã¥ããåé€ã§ããŸãã ã»ãã·ã§ã³ãã£ãã·ã¥ãããã¹ãŠã®ãšã³ããªãåé€ããã«ã¯ã Session.clearïŒïŒã¡ãœããã䜿çšããŸã ã
äŸ6.4 äžæ¬¡ãã£ãã·ã¥ãããšã³ããªãåé€ãã
ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set while ( cats.next() ) { Cat cat = (Cat) cats.get(0); doSomethingWithACat(cat); sess.evict(cat); }
ãšã³ãã£ãã£ãã»ãã·ã§ã³ãã£ãã·ã¥ã«å±ããŠãããã©ãããå€æããæ¹æ³ ã Sessionãªããžã§ã¯ãã¯containsïŒïŒã¡ãœãããæäŸã㊠ããªããžã§ã¯ããã»ãã·ã§ã³ãã£ãã·ã¥ã«å±ããŠãããã©ãããå€æããŸãã
äŸ6.5 L2ãã£ãã·ã¥ããã®åé€
SessionFactoryã¡ãœããã䜿çšããŠããšã³ãã£ãã£ã®ãââã£ãã·ã¥ç¶æ ãã¯ã©ã¹å šäœãã³ã¬ã¯ã·ã§ã³ããŸãã¯ã³ã¬ã¯ã·ã§ã³ã®ãã¹ãŠã®ããŒã«ãåé€ã§ããŸãã
sessionFactory.getCache().containsEntity(Cat.class, catId); // is this particular Cat currently in the cache sessionFactory.getCache().evictEntity(Cat.class, catId); // evict a particular Cat sessionFactory.getCache().evictEntityRegion(Cat.class); // evict all Cats sessionFactory.getCache().evictEntityRegions(); // evict all entity data sessionFactory.getCache().containsCollection("Cat.kittens", catId); // is this particular collection currently in the cache sessionFactory.getCache().evictCollection("Cat.kittens", catId); // evict a particular collection of kittens sessionFactory.getCache().evictCollectionRegion("Cat.kittens"); // evict all kitten collections sessionFactory.getCache().evictCollectionRegions(); // evict all collection data
6.3.1.2ã 2次ãã£ãã·ã¥ãšã¯ãšãªãã£ãã·ã¥ã®å 容ã衚瀺ãã
çµ±èšã解決ããããšã2次ãã£ãã·ã¥ãŸãã¯ãã£ãã·ã¥é åã®å 容ã衚瀺ã§ããŸãã
æé 6.2 çµ±èšå解èœ
- hibernate.generate_statisticsãtrueã«èšå®ããŸã ã
- ãªãã·ã§ã³-hibernate.cache.use_structured_entriesãtrueã«èšå®ããŠãHibernateããŠãŒã¶ãŒãã¬ã³ããªãŒãªåœ¢åŒã§ã¬ã³ãŒããä¿åã§ããããã«ããŸãã
äŸ6.6 Statistics APIãä»ããL2ãã£ãã·ã¥ã®è¡šç€º
Map cacheEntries = sessionFactory.getStatistics() .getSecondLevelCacheStatistics(regionName) .getEntries();