في هذه المقالة ، سنرى كيفية استخدام HSQL في تطبيقات Vert.x ، بالطبع ، يمكنك أيضًا استخدام أي JDBC ، واستخدام واجهة برمجة التطبيقات غير المتزامنة التي توفرها Vertx-JDBC-Client. رمز هذه المقالة على جيثب.
غير متزامن؟
ميزة مهمة للغاية من Vert.x هي عدم التزامن. باستخدام واجهة برمجة تطبيقات غير متزامنة ، لا تحتاج إلى انتظار النتيجة للعودة. عندما يتم إرجاع النتيجة ، سوف يعلمك Vert.x بنشاط. لتوضيح ذلك ، دعونا نلقي نظرة على مثال بسيط.
لنفترض أن هناك طريقة إضافة. بشكل عام ، سيتم استخدامه مثل int r = إضافة (1 ، 1). هذه واجهة برمجة تطبيقات متزامنة ، لذلك عليك الانتظار حتى يتم إرجاع النتيجة. سيبدو واجهة برمجة تطبيقات غير متزامنة مثل هذا: إضافة (1 ، 1 ، r -> { /*افعل شيئًا بالنتيجة* /}). في هذا الإصدار ، تمر في معالج ، والذي يسمى فقط عندما يتم حساب النتيجة. هذه الطريقة لا تعيد شيئًا ، وتنفذها على النحو التالي:
إضافة الفراغ العام (int a ، int b ، handler <integer> resulthandler) {int r = a + b ؛ resulthandler.handle (r) ؛}لتجنب المفاهيم المربكة ، فإن واجهات برمجة التطبيقات غير المتزامنة ليست متعددة الخيوط. كما رأينا في مثال الإضافة ، لا يوجد أي مؤشرات تربع.
JDBC غير متزامن
بعد قراءة بعض واجهات برمجة التطبيقات الأساسية غير المتزامنة ، فهم الآن Vertx-JDBC-Client. يتيح لنا هذا المكون التفاعل مع قاعدة البيانات من خلال برنامج تشغيل JDBC. هذه التفاعلات غير متزامنة ، كما كان من قبل:
String SQL = "SELECT * From Products" ؛ ResultSet rs = stmt.executequery (SQL) ؛
الآن يبدو الأمر هكذا:
connection.query ("SELECT * from products" ، result -> {// افعل شيئًا بالنتيجة}) ؛هذا النموذج أكثر كفاءة ، وعندما تظهر النتيجة ، يتم إخطار Vert.x ، وتجنب انتظار النتيجة.
زيادة تبعيات مافن
إضافة اثنين من تبعيات Maven إلى ملف pom.xml
<Rependency> <roupiD> io.vertx </rougiD> <StifactId> Vertx-JDBC-Client </stifactid> <الإصدار> 3.1.0 </version> </sependency> <redency> <roucid> org.hsqldb </rougeid> <StifactId> hsqldb </ethifactid>
يوفر التبعية الأولى Vertx-JDBC-Client ، والثاني يوفر برنامج تشغيل HSQL JDBC. إذا كنت ترغب في استخدام قاعدة بيانات أخرى ، فقم بتعديل هذه التبعية ، وتحتاج أيضًا إلى تعديل أسماء برنامج URL و 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؟ إيقاف التشغيل = صحيح
_driver class-jdbc driver ، على سبيل المثال: org.hsqldb.jdbcdriver
مع العميل ، تحتاج إلى الاتصال بقاعدة البيانات التالية. يتم تحقيق الاتصال بقاعدة البيانات باستخدام JDBC.GetConnection ، والذي يتطلب معالج <asyncresult <sqlConnection >> تمرير المعلمة. دعونا نلقي نظرة أعمق على هذا النوع. أولاً ، هذا معالج ، لذلك سيتم استدعاؤه عندما تكون النتيجة جاهزة. هذه النتيجة هي مثيل من Asyncresult <SqlConnection>. Asyncresult هو هيكل توفره Vert.x. استخدمه لمعرفة ما إذا كانت العملية التي تتصل بقاعدة البيانات قد نجحت أو فشلت. إذا نجحت ، فإنه يوفر نتيجة ، وهو مثيل SQLConnection.
عندما تتلقى مثيلًا من Asyncresult ، يكون الرمز عادةً:
if (ar.failed ()) {system.err.println ("لقد فشلت العملية ...:"+ ar.cause (). getMessage ()) ؛} آخر {// استخدم النتيجة: result = ar.result () ؛}تحتاج إلى الحصول على SQLConnection ثم بدء تطبيق REST. لأنه يصبح غير متزامن ، وهذا يتطلب تغيير طريقة بدء التطبيق. لذلك ، إذا قمت بتقسيم تسلسل بدء التشغيل إلى كتل متعددة:
StartBackEnd ((Connection) -> createSomedata (اتصال ، (لا شيء) -> StartWebApp ((http) -> completeStartup (http ، fut)) ، fut) ، fut) ؛
StartBackend- احصل على كائن SQLConnection واتصل الخطوة التالية
CreateSomedata- تهيئة قاعدة البيانات وإدراج البيانات. عند الانتهاء ، اتصل بالخطوة التالية
StartWebApp - ابدأ تطبيق ويب
expenstartup- أبعد أخيرًا عن بدء التشغيل
يتم تمرير FUT بواسطة Vert.x لإخطار المشكلات التي تم البدء بها أو مواجهتها أثناء بدء التشغيل.
طريقة البداية:
startbackend private void (معالج <asyncresult <sqlConnection>> التالي ، المستقبل <void> fut) {jdbc.getConnection (ar -> {if (ar.failed ()) {fut.fail (ar.cause ()) ؛تحصل هذه الطريقة على كائن SQLConnection للتحقق مما إذا كانت العملية قد اكتملت. إذا نجحت ، سيتم استدعاء الخطوة التالية. إذا فشل ، سيتم الإبلاغ عن خطأ. طرق أخرى تتبع نفس النمط:
تحقق مما إذا كانت العملية السابقة ناجحة
التعامل مع منطق العمل
اتصل بالخطوة التالية
SQL
العميل جاهز ويكتب الآن SQL. بدءًا من طريقة CreateSomedata ، تعد هذه الطريقة أيضًا جزءًا من تسلسل بدء التشغيل:
void private createSomedata (Asyncresult <SqlConnection> النتيجة ، المعالج <asyncresult <void >> التالي ، المستقبل <void> fut) {if (result.failed ()) varchar (100) ، " +" Origin varchar (100)) ، ar -> {if (ar.failed ()) {fut.fail (ar.cause ()) ؛ connection.close () ؛ return ؛} connection.query ("select * from wishky" ، select -> {select.failed ()) (select.result (). getNumrows () == 0) {insert (New Whisky ("Bowmore 15 Years Laimrig" ، "Scotland ، Islay") ، Connection ، (V) -> insert (New Whisky ("Talisker 57 ° North" ، "Scotland ، Island") ، (R) -> {next.handle (المستقبل.تتحقق هذه الطريقة ما إذا كان SQLConnection متاحًا ثم ينفذ بعض عبارات SQL. أولاً ، قم بإنشاء جدول إذا لم يكن موجودًا. تحقق من الرمز التالي:
connection.execute (بيان SQL ، المعالج يسمى عندما تم تنفيذ البيان)
يتلقى المعالج Asyncresult <Doid> ، على سبيل المثال: إنه مجرد إشعار ، ولا توجد نتيجة إرجاع فعلية.
أغلق الاتصال
بعد اكتمال العملية ، لا تنس إغلاق رابط SQL. يتم وضع هذا الاتصال في تجمع الاتصال ويمكن إعادة استخدامه.
في رمز هذا المعالج ، نتحقق مما إذا كان يتم تنفيذ البيان بشكل صحيح. إذا كان هذا صحيحًا ، فسوف نتحقق مما إذا كان الجدول يحتوي على بيانات. إذا لم يكن الأمر كذلك ، فسنستخدم طريقة إدراج لإدراج البيانات:
private void insert (الويسكي الويسكي ، اتصال SQLConnection ، المعالج <asyncresult <ويسكي >> التالي) {String sql = "insert في الويسكي (الاسم ، الأصل) قيم؟ ،؟" (ar.failed ()))) {next.handle (future.failedfuture (ar.cause ())) ؛ return ؛} updateResult result = ar.result () ؛ // بناء مثيل ويسكي جديد مع المعرف الذي تم إنشاؤه. whisky.getorigin ()) ؛ next.handle (future.sucedeDfuture (w)) ؛}) ؛}تستخدم هذه الطريقة طريقة updatewithparams مع بيان إدراج (إعلان) ، ويتم تمرير القيمة. تتجنب هذه الطريقة حقن SQL. بمجرد تنفيذ البيان (سيتم إنشاءه عندما لا تحتوي قاعدة البيانات هذه على هذه البيانات) ، يتم إنشاء كائن ويسكي جديد ويتم إنشاء المعرف تلقائيًا.
استراحة مع قاعدة البيانات (SQL)
الطرق المذكورة أعلاه كلها جزء من تسلسل بدء التشغيل. ولكن ماذا عن طريقة استدعاء API REST؟ خذ طريقة getall كمثال. تسمى هذه الطريقة من قبل الواجهة الأمامية لتطبيق الويب ويسترجع جميع المنتجات المخزنة:
private void getall (RoutingContext RoutingContext) {jdbc.getConnection (ar -> {sqlconnection connection = ar.result () ؛ connection.query ("Select * from Whisky" ، result -> {list <shky> whiskeys = result.result (). getrows (). Stream (). الخريطة (ويسكي: جديد). collect (collectors.toList () ؛ RoutingContext.Response (). }) ؛}) ؛}تحصل هذه الطريقة على كائن SQLConnection ويصدر استعلامًا. بمجرد الحصول على نتيجة الاستعلام ، ستكتب استجابة HTTP مثل الطريقة السابقة. أساليب getOne و DeleteOne و UpdateOne و AddOne هي نفسها. لاحظ أنه بعد الاستجابة ، تحتاج إلى إغلاق اتصال SQL.
انظر إلى النتائج التي يوفرها المعالج في طريقة الاستعلام. الحصول على نتائج تحتوي على نتائج الاستعلام. كل صف عبارة عن JSONOBject ، لذلك إذا كان لديك كائن بيانات يستخدم JSONOBJECT كمعلمة واحدة ، فإن إنشاء هذا الكائن بسيط.
امتحان
يجب تحديث برنامج الاختبار بطريقة صغيرة ويتم إضافة تكوين JDBCClient. في فئة myfirstverticletest ، قم بتعديل كائن النشر الذي تم إنشاؤه في طريقة الإعداد إلى:
OptiplementOptions Options = New DeploymentOptions ().
بالإضافة إلى http.port ، تم أيضًا تكوين برامج تشغيل url url و jdbc. أثناء الاختبار ، يتم استخدام قاعدة بيانات في الذاكرة. يجب إجراء نفس التعديل في ملف SRC/Test/Resources/my-it-config.json.
{"http.port": $ {http.port} ، "url": "jdbc: hsqldb: mem: it-test؟يجب أيضًا تعديل ملف SRC/Main/Conf/My-Application-Conf.json ، ليس للاختبار ، ولكن لتشغيل هذا التطبيق:
{"http.port": 8082 ، "url":يختلف عنوان URL JDBC هنا قليلاً عن الملف السابق ، لأن قاعدة البيانات تحتاج إلى تخزينها على القرص الثابت.
وقت العرض!
ابدأ في بناء البرنامج:
حزمة نظيفة MVN
دون تعديل واجهة برمجة التطبيقات (لا تغيير ملفات Java المنشورة وواجهة الراحة) ، يجب أن يعمل الاختبار بسلاسة.
إطلاق التطبيق:
Java -jar Target/my-first-app-1.0-snapshot-fat.jar -conf src/main/conf/my-application-conf.json
تفضل بزيارة http: // localhost: 8082/arsets/index.html ، ثم يمكنك أن ترى أن هذا التطبيق يستخدم قاعدة بيانات. هذه المرة ، حتى إذا تم إعادة تشغيل التطبيق ، فإن البيانات لا تزال موجودة لأن منتج التخزين مستمر على القرص الثابت.
لخص
في هذه المقالة ، أعرف كيفية استخدام قاعدة بيانات JDBC في Vert.x ، وليس هناك العديد من الأشياء المعقدة. قد تفاجأ بنموذج التطوير غير المتزامن في البداية ، ولكن بمجرد البدء في استخدامه ، سيكون من الصعب عليك العودة.
في المرة القادمة ، سنرى كيف يستخدم هذا التطبيق MongoDB لاستبدال HSQL.
مرحبًا بك في متابعة <a href = "http://quanke.name/" rel = "nofollow"> </a>
مجموعة الاتصالات: 231419585
يرجى الإشارة إلى المصدر عند إعادة الطباعة ، شكرًا لك