ในบทความนี้เราจะเห็นวิธีการใช้ HSQL ในแอปพลิเคชัน Vert.x แน่นอนว่าคุณสามารถใช้ JDBC ใด ๆ และใช้ API แบบอะซิงโครนัสที่จัดทำโดย VERTX-JDBC-Client รหัสของบทความนี้อยู่ใน GitHub
อะซิงโครนัส?
คุณลักษณะที่สำคัญมากของ vert.x คือความไม่แน่นอน การใช้ API แบบอะซิงโครนัสคุณไม่จำเป็นต้องรอผลลัพธ์ที่จะกลับมา เมื่อผลลัพธ์ถูกส่งคืน Vert.x จะแจ้งให้คุณทราบอย่างแข็งขัน เพื่อแสดงสิ่งนี้ลองดูตัวอย่างง่ายๆ
สมมติว่ามีวิธีเพิ่ม โดยทั่วไปแล้วมันจะถูกใช้เช่น int r = เพิ่ม (1, 1) นี่คือ API แบบซิงโครนัสดังนั้นคุณต้องรอจนกว่าผลลัพธ์จะถูกส่งคืน API แบบอะซิงโครนัสจะมีลักษณะเช่นนี้: เพิ่ม (1, 1, r -> { /*ทำอะไรกับผลลัพธ์* /}) ในรุ่นนี้คุณส่งผ่านตัวจัดการซึ่งเรียกว่าเฉพาะเมื่อคำนวณผลลัพธ์ วิธีนี้จะไม่ส่งคืนสิ่งใดและดำเนินการดังนี้:
โมฆะสาธารณะเพิ่ม (int a, int b, handler <จำนวนเต็ม> resulthandler) {int r = a + b; resulthandler.handle (r);};เพื่อหลีกเลี่ยงแนวคิดที่สับสน API แบบอะซิงโครนัสไม่ได้มีหลายเธรด ดังที่เราเห็นในตัวอย่างเพิ่มไม่มีการมัลติเธรดที่เกี่ยวข้อง
Asynchronous JDBC
หลังจากอ่าน API แบบอะซิงโครนัสพื้นฐานแล้วตอนนี้เข้าใจ VERTX-JDBC-CLIEN ส่วนประกอบนี้ช่วยให้เราสามารถโต้ตอบกับฐานข้อมูลผ่านไดรเวอร์ JDBC การโต้ตอบเหล่านี้เป็นแบบอะซิงโครนัสเหมือนก่อน:
String SQL = "SELECT * จากผลิตภัณฑ์"; ResultSet RS = STMT.ExecuteQuery (SQL);
ตอนนี้เป็นเช่นนี้:
Connection.Query ("เลือก * จากผลิตภัณฑ์", ผลลัพธ์ -> {// ทำอะไรกับผลลัพธ์});รุ่นนี้มีประสิทธิภาพมากขึ้นและเมื่อผลลัพธ์ออกมา Vert.x จะได้รับแจ้งหลีกเลี่ยงการรอผลลัพธ์
เพิ่มการพึ่งพา Maven
เพิ่มการพึ่งพา maven สองรายการในไฟล์ pom.xml
<Ependency> <sderctId> io.vertx </groupId> <ratifactId> vertx-jdbc-client </artifactid> <persion> 3.1.0 </version> </การพึ่งพา> <การพึ่งพา> <roupid> org.hsqldb </groupid>
การพึ่งพาครั้งแรกให้ VERTX-JDBC-client และที่สองให้ไดรเวอร์ของ HSQL JDBC หากคุณต้องการใช้ฐานข้อมูลอื่นแก้ไขการพึ่งพานี้และคุณต้องแก้ไขชื่อไดรเวอร์ JDBC และ JDBC
เริ่มต้นไคลเอนต์ JDBC
สร้างไคลเอนต์ JDBC:
ในคลาส MyFirstverticle ประกาศตัวแปรใหม่ JDBCCLient JDBC และเพิ่มในวิธีการเริ่มต้น:
jdbc = jdbcclient.createshared (vertx, config (), "my-whisky-collection");
อินสแตนซ์ไคลเอนต์ JDBC ถูกสร้างขึ้นและไคลเอนต์ JDBC ได้รับการกำหนดค่าโดยใช้ไฟล์การกำหนดค่าของ Verticle ไฟล์กำหนดค่านี้ต้องการการกำหนดค่าต่อไปนี้เพื่อให้ไคลเอนต์ JDBC ทำงานได้อย่างถูกต้อง:
url-jdbc url ตัวอย่างเช่น: jdbc: hsqldb: mem: db? shutdown = true
_driver ไดรเวอร์ jdbc jdbc ตัวอย่างเช่น org.hsqldb.jdbcdriver
ด้วยไคลเอนต์คุณต้องเชื่อมต่อกับฐานข้อมูลถัดไป การเชื่อมต่อกับฐานข้อมูลทำได้โดยใช้ jdbc.getConnection ซึ่งต้องใช้ตัวจัดการ <asyncresult <sqlconnection>> พารามิเตอร์ที่จะส่งผ่าน ลองมาดูประเภทนี้ให้ลึกซึ้งยิ่งขึ้น ก่อนอื่นนี่คือตัวจัดการดังนั้นมันจะถูกเรียกเมื่อผลลัพธ์พร้อม ผลลัพธ์นี้เป็นอินสแตนซ์ของ Asyncresult <SqlConnection> Asyncresult เป็นโครงสร้างที่จัดทำโดย Vert.x ใช้เพื่อทราบว่าการดำเนินการที่เชื่อมต่อกับฐานข้อมูลประสบความสำเร็จหรือล้มเหลว หากประสบความสำเร็จจะให้ผลลัพธ์ซึ่งเป็นตัวอย่างของการเชื่อมต่อ SQLConnection
เมื่อคุณได้รับอินสแตนซ์ของ asyncresult รหัสมักจะ:
if (ar.failed ()) {system.err.println ("การดำเนินการล้มเหลว ... :"+ ar.cuse (). getMessage ());} อื่น {// ใช้ผลลัพธ์: result = ar.result ();};คุณต้องได้รับ SQLConnection จากนั้นเริ่มแอปพลิเคชัน REST เนื่องจากมันกลายเป็นแบบอะซิงโครนัสสิ่งนี้ต้องเปลี่ยนวิธีการเริ่มต้นแอปพลิเคชัน ดังนั้นหากคุณแบ่งลำดับการเริ่มต้นเป็นหลายบล็อก:
startBackend ((การเชื่อมต่อ) -> createSomeData (การเชื่อมต่อ, (ไม่มีอะไร) -> startWebApp ((http) -> prectiveStartup (http, fut)), fut), fut);
startBackend- รับวัตถุ SQLConnection และโทรไปที่ขั้นตอนต่อไป
CreateSomeData- เริ่มต้นฐานข้อมูลและแทรกข้อมูล เมื่อเสร็จแล้วให้โทรขั้นตอนต่อไป
startWebApp - เริ่มเว็บแอปพลิเคชัน
เสร็จสมบูรณ์- ในที่สุดก็เริ่มต้นการเริ่มต้น
Fut ถูกส่งผ่านโดย Vert.x เพื่อแจ้งปัญหาที่เริ่มต้นหรือพบในระหว่างการเริ่มต้น
วิธี startbackend:
Private Void StartBackend (Handler <SyncResult <SQLConnection>> ถัดไป, อนาคต <Void> fut) {jdbc.getConnection (ar -> {ถ้า (ar.failed ()) {fut.fail (ar.cuse ());วิธีนี้ได้รับวัตถุ SQLConnection เพื่อตรวจสอบว่าการดำเนินการเสร็จสมบูรณ์หรือไม่ หากประสบความสำเร็จขั้นตอนต่อไปจะถูกเรียก หากล้มเหลวจะมีการรายงานข้อผิดพลาด วิธีอื่น ๆ เป็นไปตามรูปแบบเดียวกัน:
ตรวจสอบว่าการดำเนินการก่อนหน้านี้ประสบความสำเร็จหรือไม่
จัดการตรรกะทางธุรกิจ
เรียกขั้นตอนต่อไป
SQL
ลูกค้าพร้อมแล้วและตอนนี้เขียน SQL เริ่มต้นด้วยวิธี createSomedata วิธีนี้ยังเป็นส่วนหนึ่งของลำดับการเริ่มต้น:
โมฆะส่วนตัว createSomedata (asyncresult <SqlConnection> ผลลัพธ์, handler <asyncresult <Void>> ถัดไป, อนาคต <Void> fut) {ถ้า (result.failed ()) {fut.fail (ผลลัพธ์. Identity, ชื่อ varchar (100), " +" Origin Varchar (100)), ar -> {ถ้า (ar.failed ()) {fut.fail (ar.cuse ()); connection.close (); return;} connection.query ("select * จาก Whisky", select -> {ถ้า select.fail () (select.result (). getNumrows () == 0) {แทรก (วิสกี้ใหม่ ("Bowmore 15 ปี Laimrig", "สกอตแลนด์, Islay"), การเชื่อมต่อ, (v) -> แทรก (วิสกี้ใหม่ ("Talisker 57 ° North", "Scotland, Island") {next.handle (อนาคต <Void> ประสบความสำเร็จ future ()); connection.close ();}));วิธีนี้ตรวจสอบว่า SQLConnection พร้อมใช้งานหรือไม่จากนั้นเรียกใช้คำสั่ง SQL บางอย่าง ขั้นแรกให้สร้างตารางหากไม่มีอยู่ ตรวจสอบรหัสต่อไปนี้:
Connection.execute (คำสั่ง SQL, Handler เรียกว่าเมื่อมีการดำเนินการคำสั่ง)
ตัวจัดการได้รับ Asyncresult <Void> ตัวอย่างเช่น: มันเป็นเพียงการแจ้งเตือนและไม่มีผลการส่งคืนจริง
ปิดการเชื่อมต่อ
หลังจากการดำเนินการเสร็จสมบูรณ์อย่าลืมปิดลิงค์ SQL การเชื่อมต่อนี้ถูกวางไว้ในพูลการเชื่อมต่อและสามารถนำกลับมาใช้ใหม่ได้
ในรหัสของตัวจัดการนี้เราตรวจสอบว่าคำสั่งนั้นดำเนินการอย่างถูกต้องหรือไม่ หากถูกต้องเราจะตรวจสอบว่าตารางมีข้อมูลหรือไม่ ถ้าไม่เราจะใช้วิธีการแทรกเพื่อแทรกข้อมูล:
ช่องว่างส่วนตัว (วิสกี้วิสกี้, การเชื่อมต่อ sqlconnection, handler <asyncresult <วิสกี้ >> ถัดไป) {string sql = "แทรกลงในวิสกี้ (ชื่อต้นกำเนิด) ค่า?,?"; การเชื่อมต่อ {ถ้า (ar.failed ())) {next.handle (future.failedfuture (ar.cuse ())); return;} updateresult result = ar.result (); // สร้างวิสกี้ใหม่ด้วย id.whisky w = new Whisky whisky.getorigin ()); next.handle (future.succeededfuture (w));});}วิธีนี้ใช้วิธีการ UpdateWithParams พร้อมคำสั่งแทรก (การประกาศ) และค่าจะถูกส่งผ่านวิธีนี้จะหลีกเลี่ยงการฉีด SQL เมื่อคำสั่งถูกดำเนินการ (จะถูกสร้างขึ้นเมื่อฐานข้อมูลไม่มีข้อมูลชิ้นนี้) วัตถุวิสกี้ใหม่จะถูกสร้างขึ้นและ ID จะถูกสร้างขึ้นโดยอัตโนมัติ
พักกับฐานข้อมูล (SQL)
วิธีการข้างต้นเป็นส่วนหนึ่งของลำดับการเริ่มต้นทั้งหมด แต่วิธีการเรียกส่วนที่เหลือ API ล่ะ? ใช้วิธี Getall เป็นตัวอย่าง วิธีนี้เรียกโดย Front-end เว็บแอปพลิเคชันและดึงผลิตภัณฑ์ที่เก็บไว้ทั้งหมด:
โมฆะส่วนตัว getAll (เส้นทาง RoutingContext RoutingContext) {jdbc.getConnection (ar -> {sqlconnection connection = ar.result (); การเชื่อมต่อ QUARY ("เลือก * จากวิสกี้" ผลลัพธ์ -> {รายการ <Whisky> Whiskeys = whiskeys = whiskey result.result (). getrows (). สตรีม (). แผนที่ (วิสกี้ :: ใหม่). collect (collectors.tolist ()); routingContext.response (). putheader ("เนื้อหา", "json; charset = utf-8") -วิธีนี้ได้รับวัตถุ SQLConnection และออกคำค้นหา เมื่อได้รับผลลัพธ์การสืบค้นมันจะเขียนการตอบสนอง HTTP เช่นวิธีก่อนหน้า วิธี getone, deleteone, updateone และ addone เหมือนกัน โปรดทราบว่าหลังจากการตอบกลับคุณต้องปิดการเชื่อมต่อ SQL
ดูผลลัพธ์ที่จัดทำโดยตัวจัดการที่ส่งผ่านไปยังวิธีการสืบค้น รับชุดผลลัพธ์ที่มีผลลัพธ์การสืบค้น แต่ละแถวเป็น JSONObject ดังนั้นหากคุณมีวัตถุข้อมูลที่ใช้ JSONObject เป็นพารามิเตอร์เดียวจากนั้นการสร้างวัตถุนี้นั้นง่าย
ทดสอบ
โปรแกรมทดสอบจะต้องได้รับการอัปเดตด้วยวิธีเล็ก ๆ และการกำหนดค่าของ JDBCCLient จะถูกเพิ่มเข้ามา ในคลาส myfirstverticletest ให้แก้ไขวัตถุการปรับใช้งานที่สร้างขึ้นในวิธีการตั้งค่าเป็น:
DeploymentOptions Options = New DeploymentOptions (). setConfig (ใหม่ jsonObject (). ใส่ ("http.port", พอร์ต) .put ("url", "jdbc: hsqldb: mem: ทดสอบ?นอกจาก http.port แล้วไดรเวอร์ JDBC และไดรเวอร์ JDBC ยังได้รับการกำหนดค่า ในระหว่างการทดสอบจะใช้ฐานข้อมูลในหน่วยความจำ ควรทำการดัดแปลงเดียวกันในไฟล์ SRC/Test/Resources/My-It-config.json
{"http.port": $ {http.port}, "url": "jdbc: hsqldb: mem: it-test? shutdown = true", "driver_class": "org.hsqldb.jdbcdriver"}ไฟล์ src/main/conf/my-application-conf.json จำเป็นต้องได้รับการแก้ไขไม่ใช่สำหรับการทดสอบ แต่สำหรับการเรียกใช้แอปพลิเคชันนี้:
{"http.port": 8082, "url": "jdbc: hsqldb: ไฟล์: db/whiskeys", "driver_class": "org.hsqldb.jdbcdriver"}URL JDBC ที่นี่แตกต่างจากไฟล์ก่อนหน้าเล็กน้อยเนื่องจากฐานข้อมูลจะต้องเก็บไว้ในฮาร์ดดิสก์
แสดงเวลา!
เริ่มสร้างโปรแกรม:
แพ็คเกจ MVN Clean
โดยไม่ต้องแก้ไข API (ไม่มีการเปลี่ยนไฟล์ Java ที่เผยแพร่และส่วนต่อประสาน REST) การทดสอบควรทำงานได้อย่างราบรื่น
เปิดแอปพลิเคชัน:
Java -jar Target/My-First-app-1.0-snapshot-fat.jar -conf src/main/conf/my-application-conf.json
เยี่ยมชม http: // localhost: 8082/essets/index.html จากนั้นคุณจะเห็นว่าแอปพลิเคชันนี้ใช้ฐานข้อมูล เวลานี้แม้ว่าแอปพลิเคชันจะรีสตาร์ทข้อมูลยังคงอยู่ที่นั่นเพราะผลิตภัณฑ์จัดเก็บยังคงอยู่กับฮาร์ดดิสก์
สรุป
ในบทความนี้ฉันรู้วิธีใช้ฐานข้อมูล JDBC ใน vert.x และมีสิ่งที่ซับซ้อนไม่มากนัก คุณอาจประหลาดใจกับรูปแบบการพัฒนาแบบอะซิงโครนัสในตอนแรก แต่เมื่อคุณเริ่มใช้มันมันจะยากสำหรับคุณที่จะกลับไป
ครั้งต่อไปเราจะเห็นว่าแอปพลิเคชันนี้ใช้ MongoDB เพื่อแทนที่ HSQL อย่างไร
ยินดีต้อนรับสู่การติดตาม <a href = "http://quanke.name/" rel = "nofollow"> </a>
กลุ่มสื่อสาร: 231419585
โปรดระบุแหล่งที่มาเมื่อพิมพ์ซ้ำขอบคุณ