บทที่ 1 ไฮเบอร์เนตและ mybatis
Hibernate เป็นกรอบการทำแผนที่ O/R ที่ได้รับความนิยมมากที่สุดในปัจจุบัน มันเกิดที่ SF.NET และตอนนี้ได้กลายเป็นส่วนหนึ่งของ JBOSS MyBatis เป็นอีกหนึ่งกรอบการทำแผนที่ O/R ที่ยอดเยี่ยม ปัจจุบันเป็นของโครงการย่อยของ Apache
MyBatis อ้างอิงเว็บไซต์ทางการ: http://www.mybatis.org/core/zh/index.html
วัสดุอ้างอิงไฮเบอร์เนต: http://docs.jboss.org/hibernate/core/3.6/reference/zh-cn/html_single/
1.1 บทนำสู่ไฮเบอร์เนต
Hibernate ให้การห่อหุ้มโครงสร้างฐานข้อมูลที่ค่อนข้างสมบูรณ์ การแมป O/R ของ Hibernate ใช้การแมประหว่างตาราง POJO และฐานข้อมูลรวมถึงการสร้างอัตโนมัติและการดำเนินการของ SQL โปรแกรมเมอร์มักจะต้องกำหนดความสัมพันธ์การแมประหว่างตาราง POJO และฐานข้อมูลและสามารถดำเนินการเลเยอร์การคงอยู่ผ่านวิธีการที่จัดทำโดยไฮเบอร์เนต โปรแกรมเมอร์ไม่จำเป็นต้องมีความเชี่ยวชาญใน SQL Hibernate/OJB จะสร้าง SQL ที่สอดคล้องกันโดยอัตโนมัติและเรียกอินเตอร์เฟส JDBC เพื่อดำเนินการตามตรรกะการจัดเก็บข้อมูลที่กำหนดไว้
1.2 บทนำสู่ MyBatis
จุดสนใจของ Ibatis คือการทำแผนที่ความสัมพันธ์ระหว่าง Pojo และ SQL จากนั้นโดยการแมปไฟล์การกำหนดค่าพารามิเตอร์ที่ต้องการโดย SQL และฟิลด์ผลลัพธ์ที่ส่งคืนจะถูกแมปกับ POJO ที่ระบุ เมื่อเทียบกับไฮเบอร์เนต "O/R" Ibatis เป็นการดำเนินการ ORM ของ "การทำแผนที่ SQL"
บทที่ 2 การเปรียบเทียบการพัฒนา
ความเร็วในการพัฒนา
ความเชี่ยวชาญที่แท้จริงของไฮเบอร์เนตนั้นยากกว่า mybatis เฟรมเวิร์ก MyBatis นั้นค่อนข้างง่ายและใช้งานง่าย แต่ก็ค่อนข้างง่าย โดยส่วนตัวฉันคิดว่าจะใช้ mybatis ได้ดีคุณต้องเข้าใจไฮเบอร์เนตก่อน
ชุมชนการพัฒนา
Hibernate และ MyBatis เป็นทั้งกรอบการพัฒนาเลเยอร์ที่ได้รับความนิยม แต่ชุมชนการพัฒนาไฮเบอร์เนตนั้นค่อนข้างมีชีวิตชีวารองรับเครื่องมือมากมายและการอัปเดตนั้นเร็วขึ้น เวอร์ชันสูงสุดปัจจุบันคือ 4.1.8 MyBatis ค่อนข้างสงบและมีเครื่องมือน้อยลงและรุ่นสูงสุดในปัจจุบันคือ 3.2
ภาระงานการพัฒนา
Hibernate และ MyBatis มีเครื่องมือสร้างรหัสที่สอดคล้องกัน สามารถสร้างวิธีการเลเยอร์ DAO ที่เรียบง่ายและพื้นฐาน
สำหรับการสืบค้นขั้นสูง MyBatis ต้องใช้การเขียนด้วยตนเองของคำสั่ง SQL และ MAP ผลลัพธ์ Hibernate มีกลไกการทำแผนที่ที่ดีดังนั้นนักพัฒนาไม่จำเป็นต้องใส่ใจเกี่ยวกับการสร้าง SQL และการทำแผนที่ผลลัพธ์และสามารถมุ่งเน้นไปที่กระบวนการทางธุรกิจมากขึ้น
บทที่ 3 การเปรียบเทียบการปรับแต่งระบบ
แผนการปรับแต่งของไฮเบอร์เนตพัฒนากลยุทธ์การแคชที่สมเหตุสมผล
ลองใช้คุณสมบัติการโหลดขี้เกียจ
ใช้กลไกการจัดการเซสชันที่สมเหตุสมผล
ใช้แบทช์คว้าและตั้งค่าพารามิเตอร์แบทช์ที่สมเหตุสมผล (batch_size);
ดำเนินการออกแบบการทำแผนที่ O/R ที่สมเหตุสมผล
วิธีแก้ปัญหาการปรับแต่ง mybatis
MyBatis สอดคล้องกับวัฏจักรชีวิตเซสชันของ Hibernate ในแง่ของเซสชันและจำเป็นต้องมีกลไกการจัดการเซสชันที่สมเหตุสมผลเช่นกัน MyBatis ยังมีกลไกแคชระดับ 2 MyBatis สามารถทำการออกแบบการเพิ่มประสิทธิภาพ SQL โดยละเอียด
การเพิ่มประสิทธิภาพ SQL
แบบสอบถามของ Hibernate จะสอบถามฟิลด์ทั้งหมดในตารางซึ่งจะทำให้เกิดการใช้ประสิทธิภาพ Hibernate ยังสามารถเขียน SQL เองเพื่อระบุเขตข้อมูลที่ต้องสอบถาม แต่สิ่งนี้จะทำลายความเรียบง่ายของการพัฒนาไฮเบอร์เนต MyBatis 'SQL เขียนด้วยตนเองดังนั้นคุณสามารถระบุฟิลด์สำหรับการสืบค้นได้ตามต้องการ
การปรับแต่งคำสั่ง HIBERNATE HQL ต้องใช้การพิมพ์ SQL และหลายคนไม่ชอบ SQL ของ Hibernate เพราะมันน่าเกลียดเกินไป MyBatis 'SQL เขียนด้วยตนเองด้วยตนเองดังนั้นจึงง่ายต่อการปรับ แต่ไฮเบอร์เนตมีสถิติบันทึกของตัวเอง MyBatis เองไม่มีสถิติบันทึกและใช้ log4j สำหรับการบันทึก
ความยืดหยุ่น
ความสัมพันธ์ระหว่างไฮเบอร์เนตและฐานข้อมูลเฉพาะจะต้องกำหนดค่าเฉพาะในไฟล์ XML คำสั่ง HQL ทั้งหมดไม่มีส่วนเกี่ยวข้องกับฐานข้อมูลเฉพาะที่ใช้และพกพาได้มาก คำสั่ง SQL ทั้งหมดในโครงการ MyBatis ขึ้นอยู่กับฐานข้อมูลที่ใช้ดังนั้นการสนับสนุนสำหรับประเภทฐานข้อมูลที่แตกต่างกันจึงไม่ดี
บทที่ 4 การจัดการวัตถุและกลยุทธ์การรวบรวมข้อมูล
การจัดการวัตถุ
Hibernate เป็นโซลูชันการทำแผนที่วัตถุ/เชิงสัมพันธ์ที่สมบูรณ์ซึ่งให้การทำงานของการจัดการสถานะวัตถุเพื่อให้นักพัฒนาไม่จำเป็นต้องใส่ใจกับรายละเอียดของระบบฐานข้อมูลพื้นฐานอีกต่อไป นั่นคือเมื่อเทียบกับสถานการณ์การคงอยู่ของเลเยอร์การคงอยู่ JDBC/SQL ทั่วไปที่ต้องการการจัดการคำสั่ง SQL Hibernate ใช้มุมมองเชิงวัตถุที่เป็นธรรมชาติมากขึ้นเพื่อคงข้อมูลไว้ในแอปพลิเคชัน Java
กล่าวอีกนัยหนึ่งนักพัฒนาที่ใช้ไฮเบอร์เนตควรให้ความสนใจกับสถานะของวัตถุเสมอและไม่จำเป็นต้องพิจารณาการดำเนินการของคำสั่ง SQL รายละเอียดส่วนนี้ได้รับการจัดการโดย Hibernate และนักพัฒนาเท่านั้นที่ต้องเข้าใจเมื่อปรับประสิทธิภาพของระบบ
MyBatis ไม่มีเอกสารใด ๆ ในพื้นที่นี้และผู้ใช้จำเป็นต้องจัดการวัตถุอย่างละเอียด
กลยุทธ์การรวบรวมข้อมูล
Hibernate มีกลไกที่ดีสำหรับการรวบรวมข้อมูลวัตถุที่เกี่ยวข้องกับเอนทิตี สำหรับความสัมพันธ์ของสมาคมแต่ละครั้งสามารถตั้งค่าโดยละเอียดว่าจะชะลอการโหลดและมีโหมดสี่โหมด: การรวบรวมข้อมูลการรวบรวมข้อมูลการรวบรวมข้อมูลการสืบค้นการรวบรวมข้อมูลแบบสอบถามและการรวบรวมข้อมูลแบบแบทช์ มีการกำหนดค่าและประมวลผลในรายละเอียด
การโหลดขี้เกียจของ MyBatis ได้รับการกำหนดค่าทั่วโลก
บทที่ 5 การเปรียบเทียบกลไกแคช
แคชไฮเบอร์เนต
แคชระดับไฮเบอร์เนต 1 เป็นแคชเซสชัน หากคุณใช้ประโยชน์จากแคชระดับ 1 คุณต้องจัดการวงจรชีวิตของเซสชันได้ดี ขอแนะนำให้ใช้เซสชันในการดำเนินการ แคชระดับ 1 ต้องการการจัดการเซสชันที่เข้มงวด
แคชระดับไฮเบอร์เนต 2 เป็นแคชระดับเซสชัน แคชของ SessionFactory แบ่งออกเป็นแคชในตัวและแคชภายนอก แคชในตัวเก็บข้อมูลที่มีอยู่ในแอตทริบิวต์การรวบรวมบางอย่างของวัตถุ SessionFactory (ข้อมูลองค์ประกอบการแมปและคำสั่ง SQL ที่กำหนดไว้ล่วงหน้า ฯลฯ ) ซึ่งเป็นการอ่านอย่างเดียวสำหรับแอปพลิเคชัน แคชภายนอกเก็บสำเนาของข้อมูลฐานข้อมูลซึ่งคล้ายกับแคชหลัก นอกเหนือจากการใช้หน่วยความจำเป็นตัวกลางที่เก็บข้อมูลแคชรองยังสามารถใช้อุปกรณ์จัดเก็บข้อมูลภายนอกเช่นฮาร์ดดิสก์ แคชทุติยภูมิเรียกว่าแคชระดับกระบวนการหรือแคชระดับ SessionFactory มันสามารถแบ่งปันได้โดยเซสชันทั้งหมดและวงจรชีวิตของมันมีอยู่และหายไปกับวงจรชีวิตของ SessionFactory
แคช mybatis
MyBatis มีคุณสมบัติแคชแบบสอบถามที่ทรงพลังมากซึ่งสามารถกำหนดค่าและปรับแต่งได้ง่ายมาก มีการปรับปรุงการใช้งานแคชจำนวนมากใน MyBatis 3 ทำให้มีประสิทธิภาพมากขึ้นและง่ายต่อการกำหนดค่า
โดยค่าเริ่มต้นการแคชจะไม่เปิดใช้งาน นอกเหนือจากแคชเซสชันในท้องถิ่นแล้วยังสามารถเพิ่มการสร้างรายได้และจัดการกับการพึ่งพาแบบวงกลมได้เช่นกัน ในการเปิดใช้งานแคชระดับ 2 คุณต้องเพิ่มบรรทัดในไฟล์การแมป SQL ของคุณ: <แคช/>
นั่นคืออย่างแท้จริง ผลกระทบของคำสั่งง่าย ๆ นี้มีดังนี้:
คำสั่ง SELECT ทั้งหมดในไฟล์คำสั่งการแมปจะถูกแคช
การแทรกการอัปเดตและลบคำสั่งทั้งหมดในไฟล์คำสั่งการแม็พรีเฟรชแคช
แคชจะถูกเรียกคืนโดยใช้อัลกอริทึมที่ใช้น้อยที่สุด (LRU ที่เพิ่งใช้น้อยที่สุด)
ขึ้นอยู่กับตารางเวลา (เช่นไม่มีช่วงเวลาการล้างไม่มีช่วงเวลาการรีเฟรช) แคชจะไม่ถูกรีเฟรชตามลำดับเวลาใด ๆ
แคชเก็บ 1024 การอ้างอิงไปยังคอลเลกชันรายการหรือวัตถุ (โดยไม่คำนึงถึงวิธีการสอบถามที่ส่งคืน)
แคชได้รับการพิจารณาว่าเป็นแคชอ่าน/เขียน (อ่านได้/เขียนได้) ซึ่งหมายความว่าการดึงวัตถุไม่ได้แชร์และสามารถแก้ไขได้อย่างปลอดภัยโดยผู้โทรโดยไม่รบกวนการแก้ไขที่อาจเกิดขึ้นโดยผู้โทรหรือเธรดอื่น ๆ
คุณสมบัติทั้งหมดเหล่านี้สามารถแก้ไขได้โดยคุณสมบัติขององค์ประกอบแคช
ตัวอย่างเช่น: <cache eviction = "fifo" flushinterval = "60000" size = "512" readonly = "true"/>
การกำหนดค่าขั้นสูงนี้จะสร้างแคช FIFO และรีเฟรชทุก ๆ 60 วินาทีบันทึก 512 การอ้างอิงไปยังวัตถุผลลัพธ์หรือรายการและวัตถุที่ส่งคืนจะถูกพิจารณาว่าอ่านอย่างเดียวดังนั้นการปรับเปลี่ยนระหว่างผู้โทรในเธรดที่แตกต่างกันจะนำไปสู่ความขัดแย้ง กลยุทธ์การกู้คืนที่มีอยู่คือค่าเริ่มต้นคือ LRU:
LRU ใช้อย่างน้อยเมื่อเร็ว ๆ นี้: ลบวัตถุที่ไม่ได้ใช้เป็นเวลานานที่สุด
FIFO First-in First-Out: ลบวัตถุในลำดับที่พวกเขาเข้าสู่แคช
Soft Soft Reference: ลบวัตถุตามสถานะตัวเก็บขยะและกฎอ้างอิงที่อ่อนนุ่ม
การอ้างอิงที่อ่อนแออ่อนแอ: ลบวัตถุอย่างจริงจังขึ้นอยู่กับสถานะตัวเก็บขยะและกฎอ้างอิงที่อ่อนแอ
Flushinterval สามารถตั้งค่าเป็นจำนวนเต็มบวกใด ๆ และพวกเขาเป็นตัวแทนของระยะเวลามิลลิวินาทีที่เหมาะสมของช่วงเวลา ไม่ได้ตั้งค่าเริ่มต้นนั่นคือไม่มีช่วงเวลาการรีเฟรชและแคชจะถูกรีเฟรชเฉพาะเมื่อมีการเรียกคำสั่ง
ขนาด (จำนวนการอ้างอิง) สามารถตั้งค่าเป็นจำนวนเต็มบวกใด ๆ จำจำนวนวัตถุที่คุณแคชและจำนวนแหล่งข้อมูลหน่วยความจำที่มีอยู่ในสภาพแวดล้อมการทำงานของคุณ ค่าเริ่มต้นคือ 1024
คุณสมบัติแบบอ่านอย่างเดียวสามารถตั้งค่าเป็นจริงหรือเท็จ แคชแบบอ่านอย่างเดียวส่งคืนอินสแตนซ์เดียวกันของวัตถุแคชไปยังผู้โทรทั้งหมด ดังนั้นวัตถุเหล่านี้ไม่สามารถแก้ไขได้ สิ่งนี้ให้ข้อได้เปรียบด้านประสิทธิภาพที่สำคัญ แคชที่อ่านได้และเขียนได้ส่งคืนสำเนาของวัตถุแคช (โดยการทำให้เป็นอนุกรม) สิ่งนี้จะช้าลง แต่ปลอดภัยดังนั้นจึงเป็นเท็จโดยค่าเริ่มต้น
ความคล้ายคลึงกัน
นอกเหนือจากการใช้กลไกการแคชเริ่มต้นของระบบแล้วแคชทุติยภูมิของ Hibernate และ MyBatis สามารถเขียนทับพฤติกรรมแคชได้อย่างสมบูรณ์โดยการใช้แคชของคุณเองหรือสร้างอะแดปเตอร์สำหรับโซลูชันแคชบุคคลที่สามอื่น ๆ
ความแตกต่าง
การกำหนดค่าแคชทุติยภูมิของไฮเบอร์เนตได้รับการกำหนดค่าในรายละเอียดในไฟล์กำหนดค่าที่สร้างขึ้นโดย SessionFactory จากนั้นจะถูกกำหนดค่าในแผนที่ Table-Object เฉพาะ
การกำหนดค่าแคชทุติยภูมิของ MyBatis ได้รับการกำหนดค่าในรายละเอียดในแต่ละแผนที่ตารางเฉพาะแต่ละแผนที่เพื่อให้กลไกแคชที่แตกต่างกันสามารถปรับแต่งสำหรับตารางที่แตกต่างกัน และ MyBatis สามารถแชร์การกำหนดค่าแคชและอินสแตนซ์เดียวกันในเนมสเปซซึ่งนำไปใช้ผ่าน Cache-Ref
การเปรียบเทียบทั้งสอง
เนื่องจากไฮเบอร์เนตมีกลไกการจัดการที่ดีสำหรับวัตถุแบบสอบถามผู้ใช้ไม่จำเป็นต้องใส่ใจเกี่ยวกับ SQL ดังนั้นหากข้อมูลสกปรกปรากฏขึ้นเมื่อใช้แคชทุติยภูมิระบบจะรายงานข้อผิดพลาดและพรอมต์
ในเรื่องนี้ MyBatis ต้องการการดูแลเป็นพิเศษเมื่อใช้แคช L2 หากขอบเขตของการดำเนินการอัปเดตข้อมูลไม่สามารถกำหนดได้อย่างเต็มที่ให้หลีกเลี่ยงการใช้แคชตาบอด มิฉะนั้นการปรากฏตัวของข้อมูลสกปรกจะนำอันตรายที่ซ่อนอยู่อย่างมากไปสู่การทำงานปกติของระบบ
บทที่ 6 การเปรียบเทียบและบทสรุปของไฮเบอร์เนตและ mybatis
ความคล้ายคลึงกันระหว่างทั้งสอง
Hibernate และ MyBatis สามารถสร้าง SessionFactory จากไฟล์การกำหนดค่า XML ผ่าน SessionFactoryBuider จากนั้นสร้างเซสชันจาก SessionFactory และในที่สุดก็ดำเนินการธุรกรรมและคำสั่ง SQL ในหมู่พวกเขาวงจรชีวิตของ SessionFactoryBuider, SessionFactory และเซสชันเกือบจะเหมือนกัน
ทั้ง Hibernate และ MyBatis สนับสนุนการทำธุรกรรม JDBC และ JTA
ข้อได้เปรียบ MyBatis
MyBatis สามารถดำเนินการเพิ่มประสิทธิภาพ SQL โดยละเอียดมากขึ้นและลดฟิลด์แบบสอบถาม
MyBatis นั้นง่ายต่อการเชี่ยวชาญในขณะที่ Hibernate มีเกณฑ์ที่สูงกว่า
ข้อดีของไฮเบอร์เนต
การพัฒนาเลเยอร์ DAO ของ Hibernate นั้นง่ายกว่า MyBatis ซึ่งต้องมีการบำรุงรักษา SQL และการทำแผนที่ผลลัพธ์
Hibernate รักษาและแคชวัตถุได้ดีกว่า mybatis และสะดวกกว่าในการรักษาวัตถุที่เพิ่มลบแก้ไขและตรวจสอบ
ฐานข้อมูลไฮเบอร์เนตมีความสามารถในการพกพาที่ดีฐานข้อมูล MyBatis มีความสามารถในการพกพาไม่ดีและฐานข้อมูลที่แตกต่างกันจำเป็นต้องเขียน SQL ที่แตกต่างกัน
Hibernate มีกลไกแคช L2 ที่ดีกว่าซึ่งสามารถใช้แคชของบุคคลที่สาม MyBatis นั้นมีกลไกการแคชที่ไม่ดี
สรุปอื่น ๆ
Hibernate มีฟังก์ชั่นที่ทรงพลังไม่เกี่ยวข้องกับฐานข้อมูลที่ดีและความสามารถในการทำแผนที่ O/R ที่แข็งแกร่ง หากคุณค่อนข้างมีความเชี่ยวชาญในการจำศีลและห่อหุ้มไฮเบอร์เนตอย่างถูกต้องรหัสเลเยอร์การคงอยู่ทั้งหมดของโครงการของคุณจะค่อนข้างง่ายมีรหัสที่จะเขียนน้อยมากและความเร็วในการพัฒนานั้นเร็วและเจ๋งมาก
ข้อเสียของไฮเบอร์เนตคือเกณฑ์การเรียนรู้ไม่ต่ำและคุณต้องมีความเชี่ยวชาญในเรื่องนี้ คุณต้องมีประสบการณ์ที่แข็งแกร่งและความสามารถในการออกแบบการแมป O/R วิธีการสร้างสมดุลระหว่างประสิทธิภาพและโมเดลวัตถุและวิธีการใช้ไฮเบอร์เนตดี
Ibatis นั้นง่ายต่อการเริ่มต้นเรียนรู้และใช้งานให้ฟังก์ชั่นการเชื่อมโยงวัตถุอัตโนมัติสำหรับการสืบค้นฐานข้อมูลและดำเนินการต่อด้วยประสบการณ์การใช้ SQL ที่ดี มันค่อนข้างสมบูรณ์แบบสำหรับโครงการที่ไม่มีข้อกำหนดของโมเดลวัตถุสูงเช่นนี้
ข้อเสียของ Ibatis คือเฟรมเวิร์กยังคงค่อนข้างง่ายและฟังก์ชั่นยังคงหายไป แม้ว่ารหัสการเชื่อมโยงข้อมูลจะง่ายขึ้น แต่การสืบค้นฐานข้อมูลพื้นฐานทั้งหมดจะต้องเขียนด้วยตัวเอง แต่ภาระงานมีขนาดค่อนข้างใหญ่และไม่ใช่เรื่องง่ายที่จะปรับให้เข้ากับการปรับเปลี่ยนฐานข้อมูลอย่างรวดเร็ว