เนื่องจากความแตกต่างระหว่างภาษาการทำงานของฐานข้อมูลเชิงสัมพันธ์และภาษาเชิงวัตถุเรายังคงต้องใช้เวลามากในการสร้างสะพานเชื่อมระหว่างฐานข้อมูลและแอปพลิเคชัน Java โดยปกติแล้วเราสามารถเขียนเลเยอร์การแมปของเราเองหรือใช้กรอบการทำแผนที่ Object Object Object Object ของบุคคลที่สามเช่น Hibernate แม้ว่าเฟรมเวิร์ก ORM นั้นสะดวกมากในการใช้งาน แต่ก็ไม่ง่ายที่จะกำหนดค่าและปรับปรุงประสิทธิภาพของฐานข้อมูลการทำงานของเฟรมเวิร์ก เฟรมเวิร์ก ORM มักจะลดประสิทธิภาพแอปพลิเคชันของเรา เมื่อเร็ว ๆ นี้ฉันได้มีส่วนร่วมในโครงการโอเพ่นซอร์สใหม่ซึ่งทำให้เร็วขึ้นและมีประสิทธิภาพมากขึ้นในการพัฒนาแอปพลิเคชันฐานข้อมูลโดยใช้ Java 8
Speedment เป็นตัวเลือกในการใช้ ORM เพื่อใช้งานฐานข้อมูล ในอดีตเราต้องการรหัส Java 100 บรรทัดเพื่อใช้งานฐานข้อมูล ใน Java 8 เราอาจต้องใช้รหัสเดียวเท่านั้น
ในช่วงปลายทศวรรษ 1990 เมื่อฉันใช้ Java เพื่อพัฒนาแอปพลิเคชันฐานข้อมูล Logics รหัสจำนวนมากจำเป็นต้องเขียนด้วยตัวเองเช่นการจับข้อยกเว้นการแปลงพิมพ์ ฯลฯ หลังจากการเปลี่ยนแปลงมากมายรหัสเหล่านี้ยากที่จะรักษาและขยาย
เนื่องจากความแตกต่างระหว่างภาษาการทำงานของฐานข้อมูลเชิงสัมพันธ์และภาษาเชิงวัตถุเรายังคงต้องใช้เวลามากในการสร้างสะพานเชื่อมระหว่างฐานข้อมูลและแอปพลิเคชัน Java โดยปกติแล้วเราสามารถเขียนเลเยอร์การแมปของเราเองหรือใช้กรอบการทำแผนที่ Object Object Object Object ของบุคคลที่สามเช่น Hibernate แม้ว่าเฟรมเวิร์ก ORM นั้นสะดวกมากในการใช้งาน แต่ก็ไม่ง่ายที่จะกำหนดค่าและปรับปรุงประสิทธิภาพของฐานข้อมูลการทำงานของเฟรมเวิร์ก เฟรมเวิร์ก ORM มักจะลดประสิทธิภาพแอปพลิเคชันของเรา
เมื่อเร็ว ๆ นี้ฉันได้มีส่วนร่วมในโครงการโอเพ่นซอร์สใหม่ซึ่งทำให้เร็วขึ้นและมีประสิทธิภาพมากขึ้นในการพัฒนาแอปพลิเคชันฐานข้อมูลโดยใช้ Java 8
ความเร็วคืออะไร?
Speedment เป็นโครงการโอเพ่นซอร์ส มันเป็นห้องสมุด Java ใหม่ที่พัฒนาขึ้นอยู่กับคุณสมบัติใหม่ของ Java 8 ตั้งแต่การพัฒนาโครงการนี้รหัสทั้งหมดได้ถูกเขียนขึ้นใน Java 8 Speedment ใช้การไหลมาตรฐานในการสอบถามฐานข้อมูลซึ่งช่วยให้นักพัฒนาเรียนรู้ API แบบสอบถามใหม่และไม่ต้องพิจารณา JDBC
Speedment จะสร้างรหัสโดยอัตโนมัติตามฐานข้อมูลที่มีอยู่ ด้วยวิธีนี้นักพัฒนาไม่จำเป็นต้องเขียนบรรทัดของรหัสเกี่ยวกับเอนทิตีฐานข้อมูล รหัสที่สร้างขึ้นยังมีเอกสารประกอบ Javadocs Help ซึ่งป้องกันไม่ให้นักพัฒนาไม่สามารถเขียนคลาสเอนทิตีเกี่ยวกับวัตถุเช่นผู้ใช้หรือหนังสือ แต่เราเพียงแค่ต้องสร้างหรือใช้ฐานข้อมูลที่มีอยู่แล้วเชื่อมต่อด้วยความเร็ว จากนั้น Speedment วิเคราะห์โครงสร้างฐานข้อมูลเพื่อสร้างรหัสของคลาสเอนทิตี
สิ่งที่น่าสนใจยิ่งกว่าคือการเร่งความเร็วนั้นใช้กระต่ายเป็นตัวนำโชค ในตัวอย่างถัดไปเราจะใช้ฐานข้อมูลที่เรียกว่า "กระต่าย" เพื่อแสดงให้เห็นว่าการใช้ความเร็วนั้นถูกใช้อย่างไร โครงสร้างตารางของฐานข้อมูลนี้มีดังนี้:
mysql> อธิบาย Hase;
-
- ฟิลด์ | ประเภท | NULL คีย์ | ค่าเริ่มต้น | พิเศษ |
-
- id | int (11) | ไม่ | PRI | NULL auto_increment |
- ชื่อ | Varchar (45) | ไม่ | - NULL -
- สี | Varchar (45) | ไม่ | - NULL -
- อายุ | int (11) | ไม่ | - NULL -
-
4 แถวในชุด (0.01 วินาที)
นี่คือคลาสเอนทิตีที่สอดคล้องกันที่สร้างขึ้นโดยการเร่งความเร็วตามข้อมูลฐานข้อมูล (เพื่อความกะทัดรัดเราลบ Javadocs ที่นี่):
Hare Interface Public ขยายเอนทิตี <Hare> {Public Final Static ReferenceComparableField <hare, จำนวนเต็ม> id = ใหม่อ้างอิงถึง fieldimpl <> ("id", hare :: getid, hare :: setId); Hare :: SetName); Public Final Static ReferenceComparableStringfield <Hare> color = ใหม่ referenceComparableStringFieldImpl <> ("color", hare :: getColor, กระต่าย :: setColor); hare :: setage); จำนวนเต็ม getId (); สตริง getName (); สตริง getColor (); จำนวนเต็ม getage (); hare setId (จำนวนเต็ม id); hare setname (ชื่อสตริง); hare setcolor (สตริงสี); findCarrotsByOwner (); สตรีม <crarrot> findCarrotsByrival (); สตรีม <rarrot> findCarrots ();}ฉันจะใช้บทความแยกต่างหากเพื่อแนะนำการใช้วิธีการค้นหา*() ซึ่งสามารถใช้แทนการดำเนินการ SQL เข้าร่วม
ตัวอย่างการสืบค้น
ตัวอย่างต่อไปนี้แสดงวิธีสอบถามข้อมูลฐานข้อมูลของตารางกระต่าย:
รายการ <hare> oldhares = hares.stream ()
.filter (อายุ. Greaterthan (8))
.Collect (tolist ());
สตรีมมิ่งอัจฉริยะ
รหัสข้างต้นดูเหมือนว่าจะวนซ้ำผ่านทุกแถวของตารางฐานข้อมูล Hare แต่มันไม่ได้เป็นจริง สตรีมฉลาด เมื่อถึงการดำเนินการรวบรวม () มันจะวิเคราะห์การทำงานของตัวกรองและคอลัมน์ infers ด้วย hare.age มากกว่า 8 ดังนั้นจึงช่วยประหยัดการทำงานของกระต่ายและสร้างเอฟเฟกต์เช่นเดียวกับ "เลือก * จากกระต่ายที่อายุ> 8" หากคุณใช้ตัวกรองหลายตัวพวกเขาจะถูกรวมเข้าด้วยกันเพื่อบันทึกการดำเนินการสตรีมมิ่ง นี่เป็นอีกตัวอย่างหนึ่งของการดำเนินการหลายอย่างโดยใช้สตรีมมิ่ง:
Long Nooldhares = Hares.stream ()
.filter (อายุ. Greaterthan (8))
.Maptoint (กระต่าย :: getage)
.Stort ()
.นับ();
ในรหัสข้างต้นเมื่อสตรีมถึงการดำเนินการนับ () จะตรวจสอบไปป์ไลน์ของตัวเอง ขั้นแรกการดำเนินการอายุในตัวอย่างข้างต้นจะถูกอนุมานและประการที่สองโดยไม่ต้องเปลี่ยนผลลัพธ์การนับ () การดำเนินการ maptoint () และการเรียงลำดับ () จะถูกอนุมานซึ่งสามารถกำจัดได้ดังนั้นการดำเนินการของรหัสนี้จะถูกบันทึกไว้ "เลือกจำนวน (*) จากกระต่ายที่อายุ> 8" ซึ่งหมายความว่าคุณสามารถใช้สตรีม Java 8 โดยที่คุณไม่ต้องใส่ใจมากเกี่ยวกับวิธีการแปลงสตรีมเป็น SQL
วิธีดาวน์โหลดและเข้าร่วมกับเรา
หากคุณต้องการเรียนรู้วิธีใช้ API ของ Speedment และวิธีการใช้ความเร็วในโครงการของคุณคุณสามารถเยี่ยมชม URL www.speedment.org และแสดงความคิดเห็นเกี่ยวกับ Gitter หรือดาวน์โหลดซอร์สโค้ดความเร็วจาก GitHub เพื่อสนับสนุนรหัสของคุณเอง
สรุป
เมื่อมองย้อนกลับไปที่โครงการเก่า ๆ ในวันแรก ๆ คลาสฐานข้อมูลที่มีรหัสมากกว่า 100 บรรทัดสามารถลดลงเป็น 1 บรรทัดของรหัสโดยใช้ Java 8 นั่นคือกฎหมายของมัวร์หลังจากการกลับรายการ ใน 14 ปี (= 7 ช่วงโมล) จำนวนเส้นลดลงประมาณครึ่งเจ็ดครั้ง นี่คือความคืบหน้า!
การไหลของข้อมูลคืออะไร
สตรีมแสดงถึงวัตถุจากลำดับที่รองรับแหล่งปฏิบัติการรวม ต่อไปนี้เป็นลักษณะของการไหลของข้อมูล
ลำดับองค์ประกอบ - สตรีมมีชุดองค์ประกอบเฉพาะในลักษณะที่เป็นลำดับ สตรีมการดึง/องค์ประกอบการคำนวณของอุปสงค์ มันไม่ได้จัดเก็บองค์ประกอบ
แหล่งที่มา - สตรีมใช้คอลเลกชันอาร์เรย์หรือทรัพยากร I/O เป็นแหล่งอินพุต
การดำเนินการรวม - การไหลของข้อมูลสนับสนุนการดำเนินการรวมเช่นตัวกรอง, แผนที่, ขีด จำกัด , ลด, ค้นหา, จับคู่, ฯลฯ
การถ่ายโอนไปป์ไลน์ - การดำเนินการสตรีมส่วนใหญ่ส่งคืนสตรีมตัวเองอนุญาตให้ส่งผลลัพธ์ของพวกเขา การดำเนินการเหล่านี้เรียกว่าการดำเนินการระดับกลางและฟังก์ชั่นของพวกเขาคือการใช้อินพุตอินพุตกระบวนการและเอาต์พุตเพื่อกลับไปยังเป้าหมาย วิธีการรวบรวม () เป็นการดำเนินการเทอร์มินัลซึ่งมักจะอยู่ที่ส่วนท้ายของการดำเนินการท่อเพื่อทำเครื่องหมายสิ้นสุดของสตรีม
การวนซ้ำอัตโนมัติ - การดำเนินการสตรีมจะถูกเปรียบเทียบซ้ำ ๆ ภายในซึ่งเป็นที่ชัดเจนว่าการวนซ้ำต้องมีการรวบรวมเพื่อจัดเตรียมองค์ประกอบแหล่งที่มา