(การย้ายคำตอบของฉันจากการใช้ PostgreSQL ในหน่วยความจำและการสรุปคำตอบ):
คุณไม่สามารถเรียกใช้ Pg ในกระบวนการในหน่วยความจำ
ฉันไม่สามารถหาวิธีเรียกใช้ฐานข้อมูล Postgres ในหน่วยความจำเพื่อทำการทดสอบได้ เป็นไปได้ไหม?
ไม่เป็นไปไม่ได้ PostgreSQL ใช้งานใน C และคอมไพล์เป็นรหัสแพลตฟอร์ม ซึ่งแตกต่างจาก H2 หรือ Derby คุณไม่สามารถโหลดjar
และเปิดมันเป็นฐานข้อมูลในหน่วยความจำที่เหลือทิ้งได้
ไม่เหมือนกับ SQLite ซึ่งเขียนด้วย C และคอมไพล์เป็นรหัสแพลตฟอร์ม PostgreSQL ไม่สามารถโหลดในกระบวนการได้เช่นกัน ต้องใช้หลายกระบวนการ (หนึ่งกระบวนการต่อการเชื่อมต่อ) เนื่องจากเป็นสถาปัตยกรรมแบบหลายกระบวนการไม่ใช่สถาปัตยกรรมแบบมัลติเธรด ข้อกำหนดการประมวลผลหลายขั้นตอนหมายถึงคุณขั้นตอนต้องเปิดตัว postmaster เป็นกระบวนการแบบสแตนด์อโลน
แทน: กำหนดค่าการเชื่อมต่อล่วงหน้า
ฉันขอแนะนำให้เขียนการทดสอบของคุณเพื่อคาดหวังว่าชื่อโฮสต์ / ชื่อผู้ใช้ / รหัสผ่านเฉพาะจะทำงานได้และมีการทดสอบใช้ประโยชน์CREATE DATABASE
จากฐานข้อมูลที่เหลือจากนั้นDROP DATABASE
เมื่อสิ้นสุดการทำงาน รับรายละเอียดการเชื่อมต่อฐานข้อมูลจากไฟล์คุณสมบัติสร้างคุณสมบัติเป้าหมายตัวแปรสภาพแวดล้อม ฯลฯ
ปลอดภัยที่จะใช้อินสแตนซ์ PostgreSQL ที่มีอยู่ซึ่งคุณมีฐานข้อมูลที่คุณสนใจอยู่แล้วตราบใดที่ผู้ใช้ที่คุณระบุในการทดสอบหน่วยของคุณไม่ใช่ผู้ใช้ขั้นสูง แต่เป็นผู้ใช้ที่มีCREATEDB
สิทธิ์เท่านั้น อย่างเลวร้ายที่สุดคุณจะสร้างปัญหาด้านประสิทธิภาพในฐานข้อมูลอื่น ๆ ฉันชอบเรียกใช้การติดตั้ง PostgreSQL แบบแยกส่วนโดยสิ้นเชิงเพื่อทดสอบด้วยเหตุผลนั้น
แทน: เปิดใช้งานอินสแตนซ์ PostgreSQL สำหรับการทดสอบ
อีกวิธีหนึ่งคือถ้าคุณจริงๆกระตือรือร้นคุณสามารถมีเทียมทดสอบของคุณค้นหาinitdb
และpostgres
ไบนารีเรียกใช้initdb
ในการสร้างฐานข้อมูลการปรับเปลี่ยนpg_hba.conf
การtrust
เรียกใช้postgres
ที่จะเริ่มต้นในพอร์ตที่สุ่มสร้างผู้ใช้สร้างฐานข้อมูลและเรียกใช้การทดสอบ คุณสามารถรวมไบนารี PostgreSQL สำหรับสถาปัตยกรรมหลาย ๆ แบบไว้ใน jar และคลายไฟล์สำหรับสถาปัตยกรรมปัจจุบันลงในไดเร็กทอรีชั่วคราวก่อนที่จะรันการทดสอบ
โดยส่วนตัวแล้วฉันคิดว่านั่นเป็นความเจ็บปวดที่สำคัญที่ควรหลีกเลี่ยง ง่ายกว่าเพียงแค่กำหนดค่าฐานข้อมูลทดสอบ อย่างไรก็ตามมันง่ายขึ้นเล็กน้อยเมื่อมีการinclude_dir
สนับสนุนในpostgresql.conf
; ตอนนี้คุณสามารถต่อท้ายหนึ่งบรรทัดจากนั้นเขียนไฟล์กำหนดค่าที่สร้างขึ้นสำหรับส่วนที่เหลือทั้งหมด
ทดสอบได้เร็วขึ้นด้วย PostgreSQL
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการปรับปรุงประสิทธิภาพของ PostgreSQL อย่างปลอดภัยสำหรับวัตถุประสงค์ในการทดสอบโปรดดูคำตอบโดยละเอียดที่ฉันเขียนไว้ในหัวข้อนี้ก่อนหน้านี้: เพิ่มประสิทธิภาพ PostgreSQL เพื่อการทดสอบที่รวดเร็ว
ภาษา PostgreSQL ของ H2 ไม่ใช่สิ่งทดแทนที่แท้จริง
บางคนใช้ฐานข้อมูล H2 แทนในโหมดภาษา PostgreSQL เพื่อเรียกใช้การทดสอบ ฉันคิดว่าเกือบจะแย่พอ ๆ กับคน Rails ที่ใช้ SQLite สำหรับการทดสอบและ PostgreSQL สำหรับการปรับใช้งานจริง
H2 รองรับส่วนขยาย PostgreSQL และเลียนแบบภาษา PostgreSQL อย่างไรก็ตามมันก็แค่นั้น - การเลียนแบบ คุณจะพบพื้นที่ที่ H2 ยอมรับแบบสอบถาม PostgreSQL แต่ไม่ได้แตกต่างกันที่ลักษณะการทำงาน ฯลฯ นอกจากนี้คุณจะพบสถานที่มากมายที่ PostgreSQL รองรับการทำบางสิ่งที่ H2 ทำไม่ได้เช่นฟังก์ชันหน้าต่างในขณะที่เขียน
หากคุณเข้าใจข้อ จำกัด ของแนวทางนี้และการเข้าถึงฐานข้อมูลของคุณทำได้ง่าย H2 อาจจะใช้ได้ แต่ในกรณีนี้คุณอาจเป็นผู้สมัครที่ดีกว่าสำหรับ ORM ที่ทำให้ฐานข้อมูลเป็นนามธรรมเพราะคุณไม่ได้ใช้คุณสมบัติที่น่าสนใจอยู่แล้ว - และในกรณีนี้คุณไม่ต้องสนใจเกี่ยวกับความเข้ากันได้ของฐานข้อมูลอีกต่อไป
โต๊ะว่างไม่ใช่คำตอบ!
อย่าได้ใช้ตารางเพื่อสร้าง "ในความทรงจำ" ฐานข้อมูล ไม่เพียง แต่ไม่จำเป็นเนื่องจากจะไม่ช่วยเพิ่มประสิทธิภาพอย่างมีนัยสำคัญ แต่ยังเป็นวิธีที่ยอดเยี่ยมในการขัดขวางการเข้าถึงอื่น ๆ ที่คุณอาจสนใจในการติดตั้ง PostgreSQL เดียวกัน ขณะนี้เอกสาร 9.4 มีคำเตือนต่อไปนี้ :
คำเตือน
แม้ว่าจะอยู่นอกไดเร็กทอรีข้อมูล PostgreSQL หลัก แต่พื้นที่ตารางเป็นส่วนหนึ่งของคลัสเตอร์ฐานข้อมูลและไม่สามารถถือว่าเป็นการรวบรวมไฟล์ข้อมูลแบบอิสระ ขึ้นอยู่กับข้อมูลเมตาที่มีอยู่ในไดเร็กทอรีข้อมูลหลักดังนั้นจึงไม่สามารถแนบกับคลัสเตอร์ฐานข้อมูลอื่นหรือสำรองข้อมูลทีละรายการ ในทำนองเดียวกันถ้าคุณสูญเสียพื้นที่ตาราง (การลบไฟล์ความล้มเหลวของดิสก์ ฯลฯ ) คลัสเตอร์ฐานข้อมูลอาจไม่สามารถอ่านได้หรือไม่สามารถเริ่มทำงานได้ การวางพื้นที่ตารางบนระบบไฟล์ชั่วคราวเช่น ramdisk จะเสี่ยงต่อความน่าเชื่อถือของคลัสเตอร์ทั้งหมด
เพราะฉันสังเกตเห็นว่ามีคนจำนวนมากเกินไปและประสบปัญหา
(หากคุณทำสิ่งนี้เสร็จแล้วคุณสามารถmkdir
ใช้ไดเรกทอรีพื้นที่ตารางที่หายไปเพื่อให้ PostgreSQL เริ่มต้นใหม่อีกครั้งจากนั้นDROP
ฐานข้อมูลที่หายไปตาราง ฯลฯ จะดีกว่าที่จะไม่ทำมัน)