การโทร jdbc แบบอะซิงโครนัสเป็นไปได้หรือไม่?


158

ฉันสงสัยว่ามีวิธีการโทรแบบอะซิงโครนัสกับฐานข้อมูลหรือไม่?

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

ฉันไม่คิดว่าการใช้กลุ่มของเธรดเป็นวิธีแก้ปัญหาเพราะมันไม่ได้ปรับขนาดในกรณีที่มีการร้องขอที่เกิดขึ้นพร้อมกันจำนวนมากสิ่งนี้จะทำให้เกิดเธรดจำนวนมาก

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

หมายเหตุ: ฉันทราบว่าการใช้ FixedThreadPool อาจเป็นการแก้ไขที่ดี แต่ฉันประหลาดใจที่ไม่มีใครพัฒนาระบบแบบอะซิงโครนัสจริงๆ (โดยไม่ต้องใช้เธรดพิเศษ)

** ปรับปรุง **
เพราะการขาดของการแก้ปัญหาในทางปฏิบัติจริงที่ฉันตัดสินใจที่จะสร้างห้องสมุด (ส่วนหนึ่งของ finagle) ตัวเอง: finagle-MySQL โดยทั่วไปจะทำการถอดรหัส / ถอดรหัสการร้องขอ / ตอบกลับ mysql และใช้ Finagle / Netty ภายใต้ประทุน มันปรับขนาดได้อย่างดีเยี่ยมแม้จะมีการเชื่อมต่อจำนวนมาก



1
ดูเพิ่มเติมที่github.com/mauricio/postgresql-async
Daniel Worthington-Bodart

ปัญหาคือวิธีที่ db สามารถแจ้งเตือนไคลเอ็นต์เมื่อเคียวรีเสร็จสิ้น หนึ่งจะเป็น (เช่น) สำหรับ Oracle ที่จะใช้คุณสมบัติ "การแจ้งเตือนการเปลี่ยนแปลงผลการสืบค้นฐานข้อมูล" และได้รับแจ้งเมื่อมีการเปลี่ยนแปลงข้อมูล db ใช้กับแบบสอบถาม SQL ที่แก้ไขข้อมูล db สำหรับแบบสอบถามแบบอ่านอย่างเดียวสิ่งนี้จะไม่ทำงาน ในทางกลับกันฉันไม่แน่ใจว่าการเชื่อมต่อ async จะเป็นความคิดที่ดีเนื่องจากการสร้างพวกเขามีราคาแพง แน่นอนว่านี่ไม่ใช่คำตอบทั่วไป เพียงแค่อาหารสำหรับความคิด ...
Mike Argyriou

finagle-mysql ใช้ JDBC หรือไม่
Saeed Zarinfam

คำตอบ:


164

ฉันไม่เข้าใจว่าวิธีการใด ๆ ที่เสนอให้ตัดการเรียก JDBC ใน Actors, executors หรือสิ่งอื่นใดสามารถช่วยได้ที่นี่ - ใครบางคนสามารถชี้แจงได้

แน่นอนปัญหาพื้นฐานคือการดำเนินการ JDBC บล็อกในซ็อกเก็ต IO เมื่อมันทำเช่นนี้มันจะบล็อคเธรดที่กำลังทำงานอยู่ - ตอนจบของเรื่อง กรอบการตัดใดก็ตามที่คุณเลือกที่จะใช้เพื่อจบลงด้วยหนึ่งเธรดที่ถูกเก็บไว้ไม่ว่าง / ถูกบล็อกตามคำขอที่เกิดขึ้นพร้อมกัน

ถ้าไดรเวอร์ฐานข้อมูลพื้นฐาน (MySql?) เสนอวิธีการสกัดกั้นการสร้างซ็อกเก็ต (ดู SocketFactory) จากนั้นฉันคิดว่ามันเป็นไปได้ที่จะสร้างเลเยอร์ฐานข้อมูลที่ขับเคลื่อนด้วยเหตุการณ์ async ที่ด้านบนของ JDBC api แต่เราต้อง encapsulate JDBC ทั้งหมดที่อยู่ด้านหลังของกิจกรรมที่สร้างจากด้านหน้าและซุ้มนั้นจะไม่ดูเหมือน JDBC (หลังจากนั้นจะเป็นตัวขับเคลื่อนเหตุการณ์) การประมวลผลฐานข้อมูลจะเกิดขึ้นแบบอะซิงโครนัสบนเธรดอื่นไปยังผู้เรียกและคุณต้องหาวิธีสร้างตัวจัดการทรานแซคชันที่ไม่ต้องอาศัยความสัมพันธ์ของเธรด

สิ่งที่ชอบวิธีที่ฉันพูดถึงจะช่วยให้แม้กระทั่งเธรดพื้นหลังเดียวในการประมวลผลการโหลดของ JDBC exec ที่เกิดขึ้นพร้อมกัน ในทางปฏิบัติคุณอาจใช้กลุ่มเธรดเพื่อใช้ประโยชน์จากหลายคอร์

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


ดูเหมือนว่า MySql อาจทำบางสิ่งตามบรรทัดที่ฉันแนะนำ --- http://code.google.com/p/async-mysql-connector/wiki/UsageExample


1
การใช้ Akka จะไม่ทำการเรียกไปยังฐานข้อมูลเชิงสัมพันธ์แบบอะซิงโครนัส จะช่วยให้คุณเรียกใช้พวกเขาในเครือหัวข้อเฉพาะสำหรับการเข้าถึงฐานข้อมูลได้อย่างง่ายดาย วิธีนี้คุณจะไม่ทำให้ไซต์ทั้งหมดล้มเหลวเมื่อไซต์ไม่ตอบสนองเพราะคุณทำการเรียกใช้ async ในเลเยอร์บริการไปยังเลเยอร์ DAO เสมอโดยสัญญาและเว็บเซิร์ฟเวอร์ของคุณจะแยกจากส่วนที่เหลือของแอปพลิเคชันของคุณ
Onur

นักแสดงไม่ใช่แค่วิธีแก้ปัญหาเท่านั้น (เช่น micro-services และ async http ซึ่งเราขยายไปถึงหลายพันต่อวินาที) และฉันจะไม่รีบถอดถอนพวกเขาในลักษณะที่ไม่ซิงโครนัสจากมุมมองของลูกค้า หากทราฟฟิกเธรด 1k UI เข้าสู่ระบบของคุณและมีเพียง 10 เธรดที่ถูกบล็อกบนฐานข้อมูลในขณะที่ 990 ข้อความ (หรือบางอย่างที่คล้ายกัน) จะถูกจัดคิวไว้ในหน่วยความจำโดยไม่ปิดกั้นเธรด UI 1k ใด ๆ .. นั่นไม่ใช่สิ่งที่จำเป็น? ฉันชอบที่จะเห็น async JDBC ที่แท้จริง แต่นั่นไม่ได้หมายความว่าจะไม่มีวิธีการแก้ปัญหาที่เหมาะสมในระหว่างกาล
Greg Pendlebury

42

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

ฉันไม่คิดว่าการใช้กลุ่มของเธรดเป็นวิธีแก้ปัญหาเพราะมันไม่ได้ปรับขนาดในกรณีที่มีการร้องขอที่เกิดขึ้นพร้อมกันจำนวนมากสิ่งนี้จะทำให้เกิดเธรดจำนวนมาก

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

หากคุณกำหนดเป้าหมายเป็น Java Akka Frameworkเป็นการนำโมเดล Actor ไปใช้ซึ่งมี API ที่ดีทั้งสำหรับ Java และ Scala


นอกจากนั้นธรรมชาติของ JDBC ซิงโครนัสก็สมเหตุสมผลดีสำหรับฉัน ค่าใช้จ่ายของเซสชันฐานข้อมูลสูงกว่าค่าใช้จ่ายของเธรด Java ที่ถูกบล็อก (ทั้งในส่วนหน้าหรือส่วนหลัง) และรอการตอบกลับ หากแบบสอบถามของคุณทำงานนานจนความสามารถของบริการผู้ปฏิบัติการ (หรือการตัดกรอบงานพร้อมกันของ Actor / fork-join / contract) ไม่เพียงพอสำหรับคุณ โหลดฐานข้อมูล โดยปกติแล้วการตอบสนองจากฐานข้อมูลจะกลับมาอย่างรวดเร็วและบริการผู้ให้บริการที่สำรองข้อมูลด้วยเธรดพูลคงที่นั้นเป็นทางออกที่ดีพอ หากคุณมีคิวรีที่ใช้เวลานานเกินไปคุณควรพิจารณาการประมวลผลล่วงหน้า (ล่วงหน้า) เช่นการคำนวณใหม่ทุกคืนของข้อมูลหรืออะไรทำนองนั้น


2
@Victor นักแสดงทำงานในแบบคู่ขนานในการดำเนินการปิดกั้น (JDBC) ทุกจะทำงานในหัวข้อที่แยกต่างหากที่สตีฟพยายามที่จะหลีกเลี่ยง
วาชิ Remeniuk

36
แนวทางนักแสดงยังคงต้องใช้หนึ่งเธรดต่อธุรกรรมฐานข้อมูลที่ใช้งานอยู่ในขณะที่ธุรกรรมกำลังดำเนินอยู่ดังนั้นจึงไม่ใช่วิธีแก้ปัญหาของ OP เว้นแต่ว่าคุณเต็มใจที่จะ จำกัด จำนวนธุรกรรมฐานข้อมูลแบบขนานและรอการดำเนินการฐานข้อมูล "async" สำหรับบางคนดำเนินการแล้วเสร็จและเพิ่มด้าย นี่ไม่ใช่ความคิดที่ไม่ดี แต่ฐานข้อมูลอาจมีการโอเวอร์โหลดมากเกินไปหากคุณเปิดการเชื่อมต่อมากเกินไปดังนั้นการวางธุรกรรมฐานข้อมูลของคุณไว้ในคิวเพื่อการประมวลผลแทนที่จะบล็อกเธรดการประมวลผลคำขอ http ของคุณจะช่วยได้
Dobes Vandermeer

8
โซลูชันพื้นฐานของนักแสดงยังคงบล็อกเธรดอยู่ อย่าบอกว่าเป็นไปไม่ได้ที่จะเรียกใช้ async jdbc call มีไลบรารี่โอเพ่นซอร์สรุ่นทดลองที่พยายามใช้ async jdbc

6
+1 "ค่าใช้จ่ายของเซสชันฐานข้อมูลสูงกว่าค่าใช้จ่ายของเธรด Java ที่ถูกบล็อก"
Paul Draper

1
สำหรับการโทร DB ที่มีราคาแพงมักจะไม่เป็นปัญหาใหญ่ คือเมื่อมีการโทรเล็กน้อยที่ค่าใช้จ่ายเครือข่ายจะกลายเป็นปัญหา ถ้าคุณต้องการที่จะสร้าง 100 แบบสอบถามซึ่งใช้เวลา 1 ms ใน DB แต่ละครั้ง แต่ค่าใช้จ่ายเครือข่ายคือ 200 ms ดังนั้นมันจะใช้เวลามากกว่า 20 วินาทีในการซิงโครนัส แต่จะใช้เวลา 300 ms แบบอะซิงโครนัส
morten

12

บางทีคุณอาจใช้ระบบการส่งข้อความแบบอะซิงโครนัส JMS ซึ่งมีขนาดค่อนข้างดี IMHO:

  • ส่งข้อความไปยังคิวที่สมาชิกจะยอมรับข้อความและเรียกใช้กระบวนการ SQL กระบวนการหลักของคุณจะยังคงทำงานและยอมรับหรือส่งคำขอใหม่

  • เมื่อกระบวนการ SQL สิ้นสุดลงคุณสามารถเรียกใช้วิธีตรงกันข้าม: ส่งข้อความไปยัง ResponseQueue ด้วยผลลัพธ์ของกระบวนการและผู้ฟังทางฝั่งไคลเอ็นต์ยอมรับและดำเนินการรหัสเรียกกลับ


7

ไม่มีการสนับสนุนโดยตรงใน JDBC แต่คุณมีหลายตัวเลือกเช่น MDB, Executors จาก Java 5

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

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


ฉันคิดว่าอาร์กิวเมนต์หลักของเธรดคือโดยทั่วไปแล้วคุณอยู่นอกข้อ จำกัด คอนเทนเนอร์ Java มาตรฐานใด ๆ ดังนั้นคุณจึงสูญเสียการจัดการคอนเทนเนอร์ที่มีการจัดกลุ่มและล้มเหลวในความสามารถแม้ว่าคุณจะสามารถม้วนตัวเองหรือใช้อะไรเช่นดินเผา
mezmo

3
เราสามารถแตะลงในโพลโพลที่จัดการโดยเซิร์ฟเวอร์โดยใช้ผู้จัดการงาน websphere, weblogic และ glassfish รองรับมัน
Aravind Yarram

5

ดูเหมือนว่า jdbc API แบบอะซิงโครนัสใหม่ "JDBC next" จะอยู่ในผลงาน

ดูการนำเสนอที่นี่

คุณสามารถดาวน์โหลด API ได้จากที่นี่


1
ลิงก์เปลี่ยนเส้นทางที่ชี้ไปยังการใช้งานล่าสุดอยู่ที่นี่: oracle.com/goto/java-async-db
Remigius Stalder

4

ตามที่ระบุไว้ในคำตอบอื่น ๆ JDBC API ไม่ใช่ Async โดยธรรมชาติ
อย่างไรก็ตามหากคุณสามารถใช้ชีวิตกับชุดย่อยของการดำเนินการและ API ที่แตกต่างกันมีวิธีแก้ปัญหา ตัวอย่างหนึ่งคือhttps://github.com/jasync-sql/jasync-sqlที่ทำงานกับ MySQL และ PostgreSQL


3

โครงการ Ajdbc ดูเหมือนจะตอบปัญหานี้ได้http://code.google.com/p/adbcj/

ปัจจุบันมีไดร์เวอร์ async แบบทดลอง 2 ตัวสำหรับ mysql และ postgresql


ฉันต้องการให้วิธีนี้พร้อม JDBC มีวิวัฒนาการมามากมายตั้งแต่เริ่มต้น (ตัววนซ้ำแม่แบบขั้นตอนที่เตรียมไว้) แต่วิธีการซิงค์นี้ไม่เคยถูกนำมาใช้ มันจะน่าสนใจเป็นพิเศษสำหรับการเขียน (การแทรกการปรับปรุงการลบ) และโดยเฉพาะอย่างยิ่งชุด TX ที่เราทุกคนต้องเผชิญ ในความคิดของฉันวิธีการที่อิงกับลูกค้า (การรวมนักแสดงการกำหนดเวลาการส่งข้อความ ... ) จะนำไปสู่การได้รับรางวัลเล็กน้อยในแง่ของการใช้ทรัพยากร
Jaime Casero

เก่าและถูกทอดทิ้งสนับสนุนเพียงสองประเภทข้อมูลและไม่ใกล้เคียงกับการผลิตพร้อม น่าเสียดาย :(
Aaron Zinman

ปัญหา # 1 ของห้องสมุดนี้เกี่ยวกับเว็บไซต์ที่ไม่พร้อมใช้งานของห้องสมุดนี้เป็นเรื่องเกี่ยวกับเว็บไซต์ที่มีการไม่สามารถใช้ได้ มันมีอายุมากกว่าหนึ่งปี ฉันสงสัยว่าห้องสมุดนี้ตายไปแล้ว
Lukas Eder

3

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

ในฐานะที่เป็นหมายเหตุด้านผลิตภัณฑ์หนึ่งในตลาดมีวิธีการผลักดันนโยบายเพื่อให้การโทรแบบอะซิงโครนัสเหมือนที่ฉันอธิบายให้ทำแบบอะซิงโครนัส ( http://www.heimdalldata.com/ ) ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้ร่วมก่อตั้ง บริษัท นี้ อนุญาตให้ใช้นิพจน์ทั่วไปกับการร้องขอการแปลงข้อมูลเช่นการแทรก / อัพเดต / ลบสำหรับแหล่งข้อมูล JDBC ใด ๆ และจะทำการแบทช์เข้าด้วยกันโดยอัตโนมัติเพื่อการประมวลผล เมื่อใช้กับ MySQL และตัวเลือก rewriteBatchStatements ( MySQL และ JDBC กับ rewriteBatchStatements = true ) สิ่งนี้จะทำให้ภาระโดยรวมลดลงอย่างมากในฐานข้อมูล


แต่นี่ยังหมายความว่า JDBC ควรมีเธรดแยกกันอย่างน้อยหนึ่งเธรด สิ่งที่เกี่ยวกับกรอบและสแต็กที่เป็นเธรดเดี่ยว แต่ยังคงใช้การติดต่อกลับ (nodejs มาถึงใจ)? คุณรู้วิธีจัดการ JDBC อย่างไร
yuranos

3

คุณมีสามทางเลือกในความคิดของฉัน:

  1. ใช้คิวที่เกิดขึ้นพร้อมกันเพื่อกระจายข้อความข้ามเธรดจำนวนน้อยและคงที่ ดังนั้นหากคุณมี 1,000 การเชื่อมต่อคุณจะมี 4 กระทู้ไม่ใช่ 1000 กระทู้
  2. ทำการเข้าถึงฐานข้อมูลบนโหนดอื่น (เช่นกระบวนการหรือเครื่องอื่น) และให้ไคลเอนต์ฐานข้อมูลของคุณทำการเชื่อมต่อเครือข่ายแบบอะซิงโครนัสไปยังโหนดนั้น
  3. ใช้ระบบการกระจายที่แท้จริงผ่านข้อความแบบอะซิงโครนัส เพื่อที่คุณจะต้องมีคิวการส่งข้อความเช่น CoralMQ หรือ Tibco

คำปฏิเสธ:ฉันเป็นหนึ่งในผู้พัฒนาของ CoralMQ


3

มีการพัฒนาโซลูชันเพื่อให้สามารถเชื่อมต่อรีแอกทีฟได้ด้วยฐานข้อมูลเชิงสัมพันธ์มาตรฐาน

ผู้ที่ต้องการปรับขนาดในขณะที่การใช้งานฐานข้อมูลเชิงสัมพันธ์นั้นถูกตัดออกจากการเขียนโปรแกรมปฏิกิริยาเนื่องจากมาตรฐานที่มีอยู่ตามการบล็อก I / O R2DBC ระบุ API ใหม่ที่อนุญาตให้ใช้รหัสปฏิกิริยาที่ทำงานอย่างมีประสิทธิภาพกับฐานข้อมูลเชิงสัมพันธ์

R2DBC เป็นข้อมูลจำเพาะที่ออกแบบมาตั้งแต่ต้นสำหรับการเขียนโปรแกรมเชิงโต้ตอบด้วยฐานข้อมูล SQL ที่กำหนด SPI ที่ไม่ปิดกั้นสำหรับผู้พัฒนาโปรแกรมควบคุมฐานข้อมูลและผู้เขียนไลบรารีไคลเอ็นต์ ไดรเวอร์ R2DBC ใช้โพรโทคอล wire ของฐานข้อมูลด้านบนของเลเยอร์ I / O ที่ไม่บล็อก

เว็บไซต์ของ R2DBC

GitHub ของ R2DBC

คุณสมบัติเมทริกซ์

ป้อนคำอธิบายรูปภาพที่นี่


2

ตัวเรียกใช้Java 5.0อาจมีประโยชน์

คุณสามารถมีจำนวนเธรดที่แน่นอนเพื่อจัดการกับการดำเนินการที่ต้องใช้เวลานาน และRunnableคุณสามารถใช้Callableแทนซึ่งจะส่งคืนผลลัพธ์ ผลที่ได้ถูกห่อหุ้มในFuture<ReturnType>วัตถุดังนั้นคุณสามารถรับมันได้เมื่อมันกลับมา


2

นี่คือโครงร่างเกี่ยวกับสิ่งที่ jdbc api ที่ไม่มีการบล็อกอาจมีลักษณะเช่นนี้จาก Oracle ที่นำเสนอที่ JavaOne: https://static.rainfocus.com/oracle/oow16/sess/1461693351182001EmRq/ppt/CONF1578%2020160916.pdf

ดังนั้นดูเหมือนว่าในที่สุดการโทร JDBC แบบอะซิงโครนัสอย่างแท้จริงจะเป็นไปได้จริง ๆ


ไม่ใช่ JDBC แต่เป็น API เพิ่มเติม
yaccob

2

เป็นความคิดที่บ้าคลั่ง: คุณสามารถใช้รูปแบบ Iteratee บนชุดผลลัพธ์ JBDC ในอนาคต / สัญญาบางอย่าง

แฮมเมอร์ไม่ว่าสำหรับMongoDB


1

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

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


1

ห้องสมุดคอมมอน-dbutils มีการสนับสนุนการAsyncQueryRunnerที่คุณให้ไปและจะส่งกลับExecutorService Futureคุ้มค่าที่จะเช็คเอาท์เพราะมันใช้งานง่ายและให้แน่ใจว่าคุณจะไม่รั่วไหลของทรัพยากร


1

หากคุณมีความสนใจใน API ฐานข้อมูลแบบอะซิงโครนัสสำหรับ Java คุณควรทราบว่ามีความคิดริเริ่มใหม่ที่จะเกิดขึ้นกับชุดของ API มาตรฐานโดยยึดตาม CompletableFuture และ lambdas นอกจากนี้ยังมีการใช้งาน API เหล่านี้ผ่าน JDBC ซึ่งสามารถใช้เพื่อฝึก API เหล่านี้: https://github.com/oracle/oracle-db-examples/tree/master/java/AoJ JavaDoc ถูกกล่าวถึงใน README โครงการ GitHub

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.