get(), load(), save(), update(), saveOrUpdate()
// 同一 Session 兩次 get
Session s = sessionFactory.openSession();
Grade g1 = (Grade) s.get(Grade.class, 14);
Grade g2 = (Grade) s.get(Grade.class, 14); // 僅執行 1 條 SQL
s.close();
// 不同 Session
Session s1 = sessionFactory.openSession();
Grade g3 = (Grade) s1.get(Grade.class, 14);
s1.close();
Session s2 = sessionFactory.openSession();
Grade g4 = (Grade) s2.get(Grade.class, 14); // 執行 2 條 SQL
ehcache, hibernate-ehcache, slf4j
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
// 註解方式
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Grade { ... }
// 或 hbm.xml
<class name="Grade" table="grade">
<cache usage="read-write"/>
...
</class>
@OneToMany
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set students;
<ehcache>
<defaultCache maxEntriesLocalHeap="10000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120" />
<cache name="com.entity.Grade" maxEntriesLocalHeap="5000" />
</ehcache>
Query query = session.createQuery("from Grade");
query.setCacheable(true); // 需在 cfg 開啟 hibernate.cache.use_query_cache
合理使用快取可大幅降低資料庫壓力,但需權衡一致性與記憶體佔用。