การตั้งค่าการแคช

กลับไปที่การตั้งค่าการแคชของเราในไฟล์ hibernate.cfg.xml:

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

ให้ความสนใจกับบรรทัดแรก - มันมีชื่อของคลาสเอ็นจิ้นการแคช ไฮเบอร์เนตไม่ได้ใช้การแคชภายในจริง ๆ แต่จะจัดเตรียมชุดของอินเทอร์เฟซซึ่งคุณสามารถใช้กลไกการแคชของคุณเองได้

การใช้งานยอดนิยม ได้แก่ :

  • EHCache
  • OSCache
  • สวอร์มแคช
  • เจบอส ทรีแคช

EHCache

สามารถแคชในหน่วยความจำหรือบนดิสก์ เช่นเดียวกับการแคชคลัสเตอร์ และยังสนับสนุนแคชทางเลือกของผลลัพธ์การสืบค้น Hibernate

OSCache

รองรับหน่วยความจำและการแคชดิสก์ใน JVM เดียวกันพร้อมชุดนโยบายการหมดอายุที่หลากหลายและการสนับสนุนแคชการค้นหา

สวอร์มแคช

แคชของคลัสเตอร์ขึ้นอยู่กับ JGroups ใช้การทำให้ไม่ถูกต้องแบบคลัสเตอร์ แต่ไม่สนับสนุนแคชแบบสอบถามไฮเบอร์เนต

แคช JBoss

แคชคลัสเตอร์แบบทรานแซคชันที่จำลองแบบเต็มรูปแบบ อิงตามไลบรารีมัลติคาสต์ JGroups ด้วย สนับสนุนการจำลองแบบหรือการทำให้ไม่ถูกต้อง การสื่อสารแบบซิงโครนัสหรือแบบอะซิงโครนัส และการล็อคทั้งในแง่ดีและแง่ร้าย รองรับแคชแบบสอบถามไฮเบอร์เนต

เครื่องมือเหล่านี้ไม่รองรับกลยุทธ์การเข้าถึงแบบขนานทั้งหมด สถานการณ์จริงได้อธิบายไว้ในตารางด้านล่าง:

กลยุทธ์/ผู้ให้บริการ อ่านเท่านั้น อ่าน-เขียนแบบไม่เคร่งครัด อ่านเขียน ธุรกรรม
EHCache เอ็กซ์ เอ็กซ์ เอ็กซ์
OSCache เอ็กซ์ เอ็กซ์ เอ็กซ์
สวอร์มแคช เอ็กซ์ เอ็กซ์
แคช JBoss เอ็กซ์ เอ็กซ์

ตัวอย่างการกำหนดค่า EHCache

เอ็นจิ้นEHCacheมีไฟล์คอนฟิกูเรชันของตัวเองชื่อ ehcache.xml เนื้อหาโดยประมาณของไฟล์ดังกล่าว:

<diskStore path="java.io.tmpdir"/>

<defaultCache
    maxElementsInMemory = "1000"
    eternal = "false"
    timeToIdleSeconds = "120"
    timeToLiveSeconds = "120"
    overflowToDisk = "true"
/>

<cache name = "Employee"
    maxElementsInMemory = "500"
    eternal = "true"
    timeToIdleSeconds = "0"
    timeToLiveSeconds = "0"
    overflowToDisk = "false"
/>

ที่นี่คุณสามารถกำหนดการตั้งค่าการแคชทั้งแบบทั่วไปและสำหรับแต่ละเอนทิตีแยกกัน อ่านเพิ่มเติมในเอกสารอย่างเป็นทางการ

การวิเคราะห์สถิติการแคช

นอกจากนี้ คุณยังอาจต้องตรวจสอบว่ากลไกการแคชมีการกำหนดค่าไว้ดีเพียงใด ไฮเบอร์เนตจัดเตรียมวัตถุสถิติพิเศษสำหรับสิ่งนี้โดยเฉพาะ

ตัวอย่าง:

Statistics statistics = session.getSessionFactory().getStatistics();
CacheRegionStatistics cacheStatistics = statistics.getDomainRegionStatistics(“com.codegym.employee”);

long hitCount = cacheStatistics.getHitCount();
long missCount = cacheStatistics.getMissCount();
double hitRatio = (double) hitCount / (hitCount + missCount);

เราจะไม่ลงรายละเอียดเกี่ยวกับเรื่องนี้ เนื่องจากจะใช้เวลาอีกหลายปีกว่าโซลูชันการแคชมาตรฐานจะหมดและจำเป็นต้องปรับปรุงด้วยตนเอง อย่างไรก็ตาม ความคิดเห็นนี้อาจถูกดึงมาจากกรณีที่คล้ายกัน:

// Dear programmer:
// When you're done "optimizing" this routine
// and realize how big of a mistake it was to do this,
// please increment the counter at the bottom as a warning
// for the next guy:
// number_of_hours_spent_here = 42