การเปรียบเทียบฐานข้อมูล Java Embedded [ปิด]


99

ฉันตั้งใจจะพัฒนาแอปพลิเคชั่น (Java) ขนาดเล็กสำหรับจัดการการเงินของฉัน ฉันเชื่อว่าฉันจำเป็นต้องใช้ฐานข้อมูลแบบฝัง แต่ฉันไม่มีประสบการณ์เกี่ยวกับปัญหานี้ ฉันพยายามดูผลิตภัณฑ์ที่มีอยู่บ้าง แต่ไม่สามารถตัดสินใจได้ว่าจะเหมาะกับตัวเองมากกว่ากัน H2 , HSQLDB , DerbyและBerkeley DBดูเหมือนจะเป็นตัวเลือกที่ดี แต่ฉันยังไม่เห็นว่าพวกเขาเปรียบเทียบกันอย่างไร ขอขอบคุณที่ช่วยเปรียบเทียบและช่วยตัดสินใจว่าจะใช้อันไหนดี

ฉันตั้งใจจะใช้ Hibernate สำหรับแอปพลิเคชันของฉัน (เว้นแต่คุณจะแนะนำให้ใช้ API ที่ให้โดย DBMS) แต่ฉันก็ต้องการที่จะมีความสามารถในการแก้ไขฐานข้อมูลได้อย่างง่ายดายโดยใช้เครื่องมือเรียกดู SQL (การแก้ไขสคีมาและการเปลี่ยนแปลงข้อมูล)

ขอบคุณ.


โดยไม่ทราบว่าคุณกำลังพยายามทำอะไรจึงไม่สามารถตอบคำถามนี้ได้ ฉันขอแนะนำให้อัปเดตคำถามด้วยข้อมูลเกี่ยวกับขนาดของโครงการของคุณจำนวนตารางที่คุณคิดว่าคุณมีจำนวนบันทึก ฯลฯ
Outlaw Programmer



5
เป็นเรื่องน่ารำคาญที่พวกนาซีปิดคำถามดีๆแบบนี้ แน่นอนว่าคำถามที่คลุมเครือไม่เหมาะ แต่คำถามนี้แน่นอนที่สุด โดยที่ "เหมาะสม" หมายถึงมีประโยชน์สำหรับชุมชนแทนที่จะเป็นคำจำกัดความทางกฎหมาย
Tuntable

คำตอบ:


60

ทั้ง

  • HSQLDB - ใช้โดย OpenOffice ผ่านการทดสอบและเสถียร ใช้งานง่าย หากคุณต้องการแก้ไขข้อมูลฐานข้อมูลของคุณคุณสามารถเปิดไฟล์และแก้ไขคำสั่งแทรกได้

หรือ

  • H2 - บอกว่าเร็วกว่า (โดยนักพัฒนาที่ออกแบบ hsqldb ด้วย)

คุณจะใช้อันไหนขึ้นอยู่กับคุณขึ้นอยู่กับประสิทธิภาพและความเสถียรที่คุณต้องการ

ผู้พัฒนา H2 ได้ทำการประเมินประสิทธิภาพที่ดี:
http://www.h2database.com/html/performance.html


35

ฉันใช้Apache Derbyสำหรับความต้องการฐานข้อมูลฝังตัวทั้งหมดของฉัน คุณยังสามารถใช้ Java DB ของ Sun ที่ใช้ Derby แต่ Derby เวอร์ชันล่าสุดนั้นใหม่กว่ามาก รองรับตัวเลือกมากมายที่ฐานข้อมูลเชิงพาณิชย์และเนทีฟรองรับ แต่มีขนาดเล็กกว่าและฝังได้ง่ายกว่ามาก ฉันมีตารางฐานข้อมูลที่มีมากกว่าหนึ่งล้านรายการโดยไม่มีปัญหา

ฉันเคยใช้ HSQLDB และ Hypersonic เมื่อประมาณ 3 ปีที่แล้ว มันมีปัญหาด้านประสิทธิภาพที่สำคัญบางอย่างในเวลานั้นและฉันเปลี่ยนไปใช้ Derby เนื่องจากปัญหาเหล่านั้น ดาร์บี้เป็นของแข็งแม้ว่ามันจะอยู่ในตู้บ่มเพาะที่ Apache ก็ตาม


Derby จะดีมากถ้าไม่ใช่เพราะมีจุดบกพร่องมากมายและการอัปเดตครั้งล่าสุดเมื่อหลายปีก่อน
Hooli

2
@Hooli ฉันไม่สามารถยืนยันข้อบกพร่องได้ แต่ "... การอัปเดตล่าสุดเมื่อหลายปีก่อน" ไม่ถูกต้อง เทียบกับเวลาที่คุณโพสต์ความคิดเห็นของคุณ ( สิงหาคม 2016 ): มีการเผยแพร่น้อยกว่าหนึ่งปีก่อน ( ตุลาคม 2015 ), การเปิดตัวสองเดือนหลังจาก ( ตุลาคม 2016 ) และการเปิดตัวเพียงหนึ่งปีหลังจากนั้น ( ตุลาคม 2017 - ล่าสุด ).
Slaw

การอัปเดตความคิดเห็นนี้ในกรณีที่มีผู้อื่นพบหัวข้อนี้ในการค้นหา Derby เปิดตัวล่าสุดในเดือนมีนาคม / 2019 นี่คือข้อมูลไซต์ของพวกเขา: db.apache.org/derby
JavaJd

@Chris Dail คุณใช้ Derby สำหรับล้านเรกคอร์ดเป็นฐานข้อมูลปกติหรือในหน่วยความจำหรือเพื่อแคช?
Shreyans jain

30

ฉันจำเป็นต้องใช้ฐานข้อมูล Java แบบฝังในหนึ่งในโครงการของฉันและฉันได้ค้นคว้ามากมายเพื่อทำความเข้าใจข้อดีข้อเสียของแต่ละฐานข้อมูล ฉันเขียนบล็อกรายชื่อข้อดีข้อเสียของฐานข้อมูลจาวาแบบฝังตัวที่เป็นที่นิยม (H2, HSQLDB, Derby, ObjectDB, Neo4j, OrientDB) คุณสามารถดูได้ ฉันเลือก H2 เพราะคิดว่าเหมาะกับความต้องการของฉันที่สุด ลิงก์สำหรับบล็อก: http://sayrohan.blogspot.in/2012/12/choosing-light-weight-java-database.html หวังว่าจะช่วยได้!



14

HSQLDBเป็นตัวเลือกที่ดี (ความจริงที่ว่ามันถูกใช้ใน OpenOffice อาจทำให้คุณบางคนเชื่อ) แต่สำหรับแอปพลิเคชั่นส่วนตัวขนาดเล็กเช่นนี้ทำไมไม่ใช้ฐานข้อมูลวัตถุ (แทนที่จะเป็นฐานข้อมูลความสัมพันธ์แบบคลาสสิก)

ฉันใช้DB4Oในโครงการหนึ่งของฉันและฉันพอใจกับมันมาก ในเชิงวัตถุคุณไม่จำเป็นต้องมีเลเยอร์ไฮเบอร์เนตทั้งหมดและสามารถแทรก / อัปเดต / ลบ / ค้นหาวัตถุได้โดยตรง! ยิ่งไปกว่านั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับสคีมาคุณทำงานโดยตรงกับวัตถุและ DB4O จะจัดการส่วนที่เหลือ!

ฉันยอมรับว่าอาจต้องใช้เวลาสักพักในการทำความคุ้นเคยกับฐานข้อมูลประเภทใหม่นี้ แต่ตรวจสอบบทช่วยสอน DB40เพื่อดูว่าการทำงานกับฐานข้อมูลนั้นง่ายเพียงใด!

แก้ไข: ตามที่กล่าวไว้ในความคิดเห็น DB4O จะจัดการคลาสเวอร์ชันที่ใหม่กว่าโดยอัตโนมัติ นอกจากนี้ยังมีเครื่องมือสำหรับการเรียกดูและอัปเดตฐานข้อมูลภายนอกแอปพลิเคชันที่นี่: http://code.google.com/p/db4o-om/


2
ขอบคุณ. DB4O ดูดีสำหรับโครงการขนาดเล็กเช่นนี้ แต่ฉันเชื่อว่าความสามารถในการเรียกดูและแก้ไขข้อมูลภายนอกแอปพลิเคชันมีความสำคัญมาก การจัดการคลาสเวอร์ชันใหม่ ๆ จะเป็นเรื่องง่ายหรือไม่? (เช่นเพิ่ม / ลบช่อง)
Hosam Aly

ตามที่กล่าวไว้ในการแก้ไขของฉันมีเครื่องมือสำหรับเรียกดูและแก้ไขฐานข้อมูลภายนอกแอปพลิเคชัน และอย่างที่เฟเบียนกล่าวไว้คลาสเวอร์ชันใหม่กว่าจะได้รับการจัดการโดยอัตโนมัติ
Wookai

ขอบคุณสำหรับการอัพเดท. การมีเครื่องมือเรียกดูเป็นสิ่งสำคัญสำหรับฉันมากขอบคุณมาก
Hosam Aly

12

Java DB (การกระจาย Apache Derby ของ Sun) จัดส่งใน JDK 6 แล้ว!

ฉันเคยอยากทำบางอย่างเหมือน Jason Cohen และคิดว่านี่ดูเหมือนเป็นวิธีที่ง่ายที่สุดในการอยู่ใน JDK distro (ซึ่งในสัปดาห์ที่แล้วเป็นข้อกำหนดสำหรับแอปของฉัน) หรือบางทีฉันก็ขี้เกียจแบบนั้น


คุณคงพูดถูก! เรามีข้อกำหนดให้ทำงานภายใต้ Java 1.5 ด้วยดังนั้นนี่จึงไม่ใช่ตัวเลือกสำหรับเรา
Jason Cohen

... ฉันหมายความว่าคุณคิดถูกแล้วว่ามันเป็นวิธีที่ง่ายที่สุดไม่ใช่เรื่องขี้เกียจ :-P
Jason Cohen

Java DB มาพร้อมกับการใช้งาน Sun / Oracle ของ JDK เท่านั้น ไม่ใช่ส่วนมาตรฐานของ Java
Basil Bourque

7

เราใช้ HSQLDB ในการผลิตเป็นตัวเลือก "ไม่มีการกำหนดค่า" สำหรับแอปพลิเคชันของเรา ช่วยให้ผู้คนทดลองใช้โดยไม่ต้องยุ่งยากในการตั้งค่าฐานข้อมูลจริง

อย่างไรก็ตามเราไม่สนับสนุนสำหรับการใช้งานปกติ สาเหตุมีหลายประการ:

  1. ช้าลงตามสัดส่วนของขนาดของข้อมูล
  2. ยากที่จะเข้าถึงภายนอกแอปของเรา (เช่นสำหรับรายงานที่กำหนดเอง)
  3. ธุรกรรม / การซิงค์ดิสก์เป็นเรื่องยากที่จะทำให้ถูกต้องข้อมูลจึงสูญหายได้ง่าย

อย่างน้อย (2) และ (3) มีวิธีรอบ ๆ แต่มันยาก ง่ายกว่ามากเช่นติดตั้ง MySQL


7

neo4jคือ:

เอ็นจินการคงอยู่ของ Java แบบฝังบนดิสก์ที่ทำธุรกรรมเต็มรูปแบบซึ่งเก็บข้อมูลที่มีโครงสร้างในกราฟแทนที่จะเป็นตาราง

ฉันยังไม่มีโอกาสได้ลองเลย - แต่มันก็ดูดีมาก โปรดทราบว่านี่ไม่ใช่ฐานข้อมูล SQL กราฟออบเจ็กต์ของคุณยังคงอยู่สำหรับคุณดังนั้นจึงอาจไม่เหมาะสมกับแอปที่คุณมีอยู่



5

มีการพูดถึงเรื่องส่วนใหญ่ไปแล้ว แต่ฉันสามารถเพิ่มได้ว่าฉันใช้ HSQL, Derby และ Berkely DB ในโครงการสัตว์เลี้ยงบางส่วนของฉันและพวกเขาก็ทำงานได้ดี ดังนั้นฉันไม่คิดว่ามันสำคัญมากที่จะซื่อสัตย์ สิ่งหนึ่งที่ควรกล่าวถึงคือ HSQL บันทึกตัวเองเป็นไฟล์ข้อความด้วยคำสั่ง SQL ซึ่งค่อนข้างดี ทำให้ง่ายมากเมื่อคุณกำลังพัฒนาเพื่อทำการทดสอบและตั้งค่าข้อมูลอย่างรวดเร็ว นอกจากนี้ยังสามารถแก้ไขอย่างรวดเร็วได้หากจำเป็น เดาว่าคุณสามารถถ่ายโอนข้อมูลทั้งหมดไปยังฐานข้อมูลใด ๆ ได้อย่างง่ายดายหากคุณต้องการเปลี่ยนแปลงเช่นกัน :)


5

HSQLDB อาจทำให้เกิดปัญหากับแอพพลิเคชั่นขนาดใหญ่ซึ่งไม่ค่อยเสถียรนัก

สิ่งที่ดีที่สุดที่ฉันเคยได้ยินมา (ไม่ใช่ประสบการณ์โดยตรง) คือ berkleyDB แต่ถ้าคุณไม่เปิดแหล่งที่มาคุณจะต้องเสียค่าใช้จ่ายทั้งแขนและขาเนื่องจากการออกใบอนุญาต ... ดูhttp://www.oracle.com/technology/software/products/berkeley-db/htdocs/licensing.htmlนี้เพื่อดูรายละเอียด

ปล. berkleyDB ไม่ใช่ฐานข้อมูลเชิงสัมพันธ์ในกรณีที่คุณไม่รู้


โอ้ฉันไม่รู้ว่า Berkeley ไม่ใช่ฐานข้อมูลเชิงสัมพันธ์! ขอบคุณมาก!
Hosam Aly

ไม่ได้หมายความว่ามันไม่ดี แต่ฉันสงสัยว่ามันอาจจะดีเกินไปสำหรับการใช้งานของคุณโดยพิจารณาจากสิ่งที่เป็นส่วนตัว ลองดูที่ sqlite ฉันคิดว่ามันมีการผูก java แต่ไม่สามารถหา atm ได้
Chii

4

ฉันเป็นแฟนตัวยงของDB4O สำหรับทั้ง. Net และ JavaJava

ประสิทธิภาพดีขึ้นมากตั้งแต่รุ่นแรก ๆ รูปแบบการออกใบอนุญาตก็ไม่เลวเช่นกัน ฉันชอบตัวเลือกสำหรับการสืบค้นวัตถุของคุณเป็นพิเศษ การค้นหาตามตัวอย่างมีประสิทธิภาพมากและง่ายต่อการทำความคุ้นเคย


4

คุณจะใช้เกณฑ์อะไรในการประเมินสิ่งเหล่านี้ หากคุณยังไม่รู้ก็ไม่จำเป็นต้องตัดสินใจในตอนนี้ พยายามทำให้แอปพลิเคชันของคุณเป็นฐานข้อมูลที่ไม่เชื่อเรื่องพระเจ้ามากที่สุดเท่าที่จะทำได้ - จัดหา Wrapper ที่เหมาะสมออบเจ็กต์การเข้าถึงข้อมูล ฯลฯ และตัดสินใจเรื่องนี้เมื่อคุณมีข้อเท็จจริงทั้งหมดในมือและคุณต้องตัดสินใจ

หากคุณใช้ฐานข้อมูลเชิงสัมพันธ์และ SQL ข้างต้นไม่ควรยากเกินไป (ใช้ JDBC เป็นต้น) ตรวจสอบให้แน่ใจว่าคุณมีการทดสอบโดยรอบมากมายเพื่อที่ว่าเมื่อคุณต้องการสลับไปมาระหว่างฐานข้อมูลคุณสามารถระบุได้ว่าการทำงานของแอปพลิเคชันของคุณยังคงเหมือนเดิม

ฉันพบปัญหาเดียวกันเมื่อไม่นานมานี้ ฉันไม่รู้ว่าจะใช้ฐานข้อมูลใดดังนั้นโซลูชันแรกของฉันจึงใช้ Derby (หรือ HSQLDB?) และในภายหลังฉันสามารถเปลี่ยนไปใช้ HSQLDB (หรือ Derby จำไม่ได้ว่าโซลูชันใดทำงานได้) เมื่อฉันกำหนดที่ ฉันมีปัญหา (เกี่ยวกับประสิทธิภาพ) และวิธีแก้ปัญหาใดที่เหมาะกับฉันจริงๆ


3

ฉันเคยใช้ Derby และฉันเกลียดฟังก์ชันการแปลงประเภทข้อมูลโดยเฉพาะฟังก์ชันวันที่ / เวลา (Number Type) <--> การแปลง Varchar มันเป็นความเจ็บปวด

ดังนั้นหากคุณวางแผนที่จะใช้การแปลงประเภทข้อมูลในคำสั่ง DB ของคุณให้พิจารณาการใช้ DB แบบฝังตัวฉันเรียนรู้ว่ามันสายเกินไป

การแปลงประเภทข้อมูล Derby Version ล่าสุด


3

ฉันชอบ HSQLDB เป็นการส่วนตัว แต่ส่วนใหญ่เป็นเพราะเป็นครั้งแรกที่ฉันลอง

H2 ได้รับการกล่าวขานว่าเร็วกว่าและให้ส่วนหน้า GUI ที่ดีกว่า (ซึ่งเป็นแบบทั่วไปและทำงานร่วมกับไดรเวอร์ JDBC ใด ๆ ก็ตาม)

อย่างน้อย HSQLDB, H2 และ Derby จะมีโหมดเซิร์ฟเวอร์ซึ่งเหมาะสำหรับการพัฒนาเนื่องจากคุณสามารถเข้าถึงฐานข้อมูลด้วยแอปพลิเคชันและเครื่องมือบางอย่างในเวลาเดียวกัน (ซึ่งโดยปกติแล้วโหมดฝังตัวจะไม่อนุญาต)


3

ฉันเดาว่าฉันมาสายเล็กน้อย (สายมาก ;-)) ในโพสต์นี้ แต่ฉันต้องการเพิ่ม Perst ซึ่งเป็นโอเพ่นซอร์สฐานข้อมูลฝังตัวเชิงวัตถุสำหรับ Java & .NET สำหรับการพิจารณาของคุณ. Perst เป็นฐานข้อมูลแบบฝังตัวแบบโอเพนซอร์ส / ใบอนุญาตคู่สำหรับ Java การแจกจ่ายเข้ากันได้กับแพลตฟอร์ม Android ของ Google และยังรวมถึง Perst Lite สำหรับ Java ME เราได้สร้างเกณฑ์มาตรฐานของ Android และจัดทำเอกสารไวท์เปเปอร์เกี่ยวกับเรื่องนี้ ... คุณสามารถดูได้ที่นี่: http://www.mcobject.com/index.cfm?fuseaction=download&pageid=581§ionid=133

สุดยอดคริส


3

ถ้าฉันแก้ไข H2 มาจากคนเดียวกันกับที่เขียน HSQLDB จะดีกว่ามากหากคุณเชื่อถือเกณฑ์มาตรฐานบนไซต์ของตน นอกจากนี้ยังมีความคิดที่ว่าชุมชนดวงอาทิตย์พุ่งเข้าสู่ดาร์บี้เร็วเกินไป


2
ความคิดเกี่ยวกับดาร์บี้ก่อนวัยอันควรเกี่ยวข้องกับ DerbyDB อย่างไร? วุฒิภาวะ?
simgineer

2

ผมทราบดีว่าที่คุณกล่าวถึงการเรียกดู SQL แต่ทุกสิ่งทุกอย่างในคำถามของคุณทำให้ผมอยากจะแนะนำให้คุณพิจารณาdb4oซึ่งเป็นเป็นฐานข้อมูลวัตถุที่เรียบง่าย


ขอบคุณ. DB4O ดูดีสำหรับโครงการขนาดเล็กเช่นนี้ แต่ฉันเชื่อว่าความสามารถในการเรียกดูและแก้ไขข้อมูลภายนอกแอปพลิเคชันมีความสำคัญมาก การจัดการคลาสเวอร์ชันใหม่ ๆ จะเป็นเรื่องง่ายหรือไม่? (เช่นช่องที่เพิ่ม / ลบ)
Hosam Aly

ใช่มันรองรับการปรับโครงสร้างใหม่โดยอัตโนมัติคุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่นี่: ibm.com/developerworks/java/library/j-db4o3.html
Fabian Steeg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.