In diesem Artikel werden wir sehen, wie HSQL in Vert.x-Anwendungen verwendet werden. Natürlich können Sie auch JEDE JDBC verwenden und die von vertx-jdbc-Client bereitgestellte asynchrone API verwenden. Der Code dieses Artikels befindet sich auf GitHub.
asynchron?
Ein sehr wichtiges Merkmal von Vert.x ist seine Asynchronität. Mit einer asynchronen API müssen Sie nicht warten, bis das Ergebnis zurückkehrt. Wenn ein Ergebnis zurückgegeben wird, benachrichtigt Vert.x Sie aktiv. Um dies zu veranschaulichen, schauen wir uns ein einfaches Beispiel an.
Nehmen wir an, es gibt eine Add -Methode. Im Allgemeinen wird es wie int r = add (1, 1) verwendet. Dies ist eine synchrone API, daher müssen Sie warten, bis das Ergebnis zurückgegeben wird. Die asynchrone API sieht so aus: add (1, 1, r -> { /*Machen Sie etwas mit dem Ergebnis* /}). In dieser Version passieren Sie einen Handler, der nur dann aufgerufen wird, wenn das Ergebnis berechnet wird. Diese Methode gibt nichts zurück und implementiert sie wie folgt:
public void add (int a, int b, Handler <Integer> resulthandler) {int r = a + b; ResultHandler.Handle (r);}Um verwirrende Konzepte zu vermeiden, sind asynchrone APIs nicht mehrfach mit Thread. Wie wir im Beispiel für das Hinzufügen gesehen haben, ist kein Multithreading beteiligt.
Asynchrone JDBC
Verstehen Sie nun Vertx-JDBC-Client, nachdem Sie einige grundlegende asynchrone APIs gelesen haben. Mit dieser Komponente können wir über den JDBC -Treiber mit der Datenbank interagieren. Diese Interaktionen sind wie zuvor asynchron:
String SQL = "Select * aus Produkten"; Ergebnisset RS = STMT.ExecuteQuery (SQL);
Jetzt ist es so:
connection.Query ("aus Produkten auswählen", Ergebnis -> {// etwas mit dem Ergebnis});Dieses Modell ist effizienter, und wenn das Ergebnis herauskommt, wird Vert.x benachrichtigt, wodurch es vermieden wird, auf das Ergebnis zu warten.
Erhöhen Sie die Abhängigkeiten von Maven
Fügen Sie der Datei pom.xml zwei Maven -Abhängigkeiten hinzu
<Depepy> <GroupId> io.vertx </GroupId> <artifactId> vertx-jdbc-client </artifactId> <version> 3.1.0 </Version> </abhängig> <abhängigkeit> <GroupId> org.hsqldb </gruppen> <artifactid> hsqldb </artifactid> </artifactid> </artifactid> </artifactid> </artifactid> </artifactid>
Die erste Abhängigkeit liefert Vertx-JDBC-Client und die zweite liefert den Treiber von HSQL JDBC. Wenn Sie eine andere Datenbank verwenden möchten, ändern Sie diese Abhängigkeit und müssen auch die JDBC -URL- und JDBC -Treibernamen ändern.
Initialisieren Sie den JDBC -Client
Erstellen Sie einen JDBC -Client:
Deklarieren Sie in der MyFirstverticle -Klasse eine neue Variable JDBCClient JDBC und fügen Sie sie in die Startmethode hinzu:
jdbc = jdbcclient.createShared (vertx, config (), "my-Whisky-collection");
Eine JDBC -Client -Instanz wurde erstellt und der JDBC -Client wird mithilfe der Konfigurationsdatei der Vertikeln konfiguriert. Diese Konfigurationsdatei erfordert die folgende Konfiguration, damit der JDBC -Client ordnungsgemäß funktioniert:
URL-JDBC-URL, zum Beispiel: JDBC: HSQLDB: MEM: DB? STALLDOWN = TRUE
_driver class-JDBC-Treiber zum Beispiel: org.hsqldb.jdbcdriver
Mit dem Client müssen Sie als nächstes eine Verbindung zur Datenbank herstellen. Die Verbindung mit der Datenbank wird durch die Verwendung von jdbc.getConnection erreicht, für die ein Handler <Asyncresult <SQLConnection >> Parameter übergeben werden muss. Schauen wir uns diesen Typ tiefer an. Erstens ist dies ein Handler, also wird er aufgerufen, wenn das Ergebnis fertig ist. Dieses Ergebnis ist eine Instanz von Asyncresult <SqlConnection>. Asyncresult ist eine Struktur von Vert.x. Verwenden Sie es, um zu wissen, ob der Betrieb, der eine Verbindung zur Datenbank herstellt, erfolgreich oder fehlgeschlagen war. Wenn es erfolgreich ist, liefert es ein Ergebnis, das eine Instanz der SQLConnection ist.
Wenn Sie eine Instanz von Asyncresult erhalten, ist der Code normalerweise:
if (ar.failed ()) {System.err.println ("Die Operation ist fehlgeschlagen ...:"+ ar.cause (). getMessage ());} else {// Verwenden Sie das Ergebnis: result = ar.result ();};};};};Sie müssen SQLConnection erhalten und dann die REST -Anwendung starten. Da es asynchron wird, erfordert dies die Art und Weise, wie die Anwendung gestartet wird. Wenn Sie also die Startsequenz in mehrere Blöcke teilen:
Startbackend ((Verbindung) -> createSomedata (Verbindung, (nichts) -> startWebApp ((http) -> vollstartup (http, fut)), fut), fut);
Startbackend- SQLConnection-Objekt und rufen Sie den nächsten Schritt auf
Erstellt die Datenbank und fügt Daten ein. Wenn Sie fertig sind, rufen Sie den nächsten Schritt an
StartWebapp - Starten Sie eine Webanwendung
Fertigstart- endlich abgeschlossenes Startup
FUT wird von Vert.x übergeben, um Probleme zu benachrichtigen, die während des Starts gestartet oder auftreten.
Startbackend -Methode:
private void Streetbackend (Handler <Asyncresult <
Diese Methode erhält ein SQLConnection -Objekt, um zu überprüfen, ob der Vorgang abgeschlossen ist. Bei Erfolg wird der nächste Schritt aufgerufen. Wenn es fehlschlägt, wird ein Fehler gemeldet. Andere Methoden folgen dem gleichen Muster:
Überprüfen Sie, ob die vorherige Operation erfolgreich war
Geschäftslogik umgehen
Rufen Sie den nächsten Schritt an
Sql
Der Kunde ist bereit und schreibt jetzt SQL. Ab der Methode createSomedata ist diese Methode auch Teil der Start -up -Sequenz:
private void createsomedata (asyncresult <SQLConnection> Ergebnis, Handler <Asyncresult <void >> Weiter, zukünftige <void> fut) {if (result.Failed ()) {fut.fail (result.cause ());} else {SQLCONNECTION CONTECTION = EXISTSEL. Name varchar (100), " +" Ursprung varchar (100)), ar -> {if (ar.Failed ()) {fut.fail (ar.cause (); connection.close (return;} connection.Query ("Select * aus Whiskey", Select -> {if (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"),connection,(r) -> {Next.Handle (Future.Diese Methode prüft, ob SQLConnection verfügbar ist, und führt dann einige SQL -Anweisungen aus. Erstellen Sie zunächst eine Tabelle, wenn sie nicht existiert. Schauen Sie sich den folgenden Code an:
Connection.execute (SQL Anweisung, Handler aufgerufen, als die Anweisung ausgeführt wurde)
Der Handler empfängt asyncresult <void> zum Beispiel: Es handelt sich nur um eine Benachrichtigung, und es gibt kein tatsächliches Rückgabeergebnis.
Schließen Sie die Verbindung
Vergessen Sie nicht, den SQL -Link zu schließen. Diese Verbindung wird in den Verbindungspool platziert und kann wiederverwendet werden.
Im Code dieses Handlers prüfen wir, ob die Anweisung korrekt ausgeführt wird. Wenn es korrekt ist, werden wir überprüfen, ob die Tabelle Daten enthält. Wenn nicht, verwenden wir die Einfügen -Methode, um die Daten einzufügen:
Private Void Insert (Whisky Whisky, SQLConnection -Verbindung, Handler <Asyncresult <Whisky >> Weiter) {String SQL = "In Whisky (Name, Ursprung) Werte?"; Verbindung. (ar.Failed ()) {next.handle (future.failedfuture (ar.cause ())); Whisky.getOrigin ()); Next.Handle (Future.SuctesededFuture (w));});}Diese Methode verwendet die updateWithParams -Methode mit Insert -Anweisung (Deklaration), und der Wert wird übergeben. Diese Methode vermeidet die SQL -Injektion. Sobald die Anweisung ausgeführt wurde (sie wird erstellt, wenn die Datenbank über diese Daten nicht verfügt), wird ein neues Whisky -Objekt erstellt und die ID automatisch generiert.
Ruhe mit Datenbank (SQL)
Die obigen Methoden sind alle Teil der Start -up -Sequenz. Aber was ist mit der Methode, die Rest -API aufzurufen? Nehmen Sie die Getall -Methode als Beispiel. Diese Methode wird von der Webanwendung Front-End aufgerufen und holt alle gespeicherten Produkte ab:
private void getAll (RoutingContext RoutingContext) {jdbc.getConnection (ar -> {sqlConnection Connection = ar.result (); Connection.Query ("Select * From Whiskey", Ergebnis -> {List <whiskkey> Whiskeys = result.Result (). });});}Diese Methode erhält ein SQLConnection -Objekt und gibt eine Abfrage aus. Sobald das Abfrageergebnis erzielt wurde, wird eine HTTP -Antwort wie die vorherige Methode geschrieben. Die Methoden Getone, Deleteone, UpdateOne und Addone sind gleich. Beachten Sie, dass Sie nach der Antwort die SQL -Verbindung schließen müssen.
Schauen Sie sich die Ergebnisse des Handlers an, die in die Abfragemethode übergeben wurden. Erhalten Sie ein Ergebnis, das die Abfrageergebnisse enthält. Jede Zeile ist ein JsonObject. Wenn Sie also ein Datenobjekt haben, das JSONObject als einziger Parameter verwendet, ist das Erstellen dieses Objekts einfach.
prüfen
Das Testprogramm muss auf kleine Weise aktualisiert werden und die Konfiguration von JDBCClient wird hinzugefügt. Ändern Sie in der MyFirstverticletest -Klasse das in der Setup -Methode erstellte Bereitstellungsobjekt an:
Bereitstellungsoptionen = neue Bereitstellungen (). SetConfig (new jsonObject ().
Zusätzlich zu HTTP.PORT sind auch JDBC -URL- und JDBC -Treiber konfiguriert. Während des Tests wird eine In-Memory-Datenbank verwendet. Die gleiche Änderung sollte in der Datei SRC/Test/Ressourcen/my-it-config.json vorgenommen werden.
oder
Die Datei src/main/conf/my-application-conf.json muss auch nicht zum Testen geändert werden, sondern zum Ausführen dieser Anwendung:
oder
Die JDBC -URL hier unterscheidet sich etwas von der vorherigen Datei, da die Datenbank auf der Festplatte gespeichert werden muss.
Anzeigezeit!
Beginnen Sie mit dem Aufbau des Programms:
MVN Clean Package
Ohne die API zu ändern (nicht die veröffentlichten Java -Dateien und die REST -Schnittstelle ändern), sollte der Test reibungslos ausgeführt werden.
Starten Sie die Anwendung:
Java-Jar Target/My-First-App-1.0-Snapshot-fat.jar -conf Src/Main/Conf/My-Application-conf.json
Besuchen Sie http: // localhost: 8082/assets/index.html, und dann können Sie sehen, dass diese Anwendung eine Datenbank verwendet. Auch wenn die Anwendung neu gestartet wird, sind die Daten immer noch vorhanden, da das Speicherprodukt auf der Festplatte bestehen wird.
Zusammenfassen
In diesem Artikel weiß ich, wie man die JDBC -Datenbank in vert.x verwendet, und es gibt nicht viele komplizierte Dinge. Sie werden von diesem asynchronen Entwicklungsmodell zunächst überrascht sein, aber sobald Sie es verwenden, wird es für Sie schwierig sein, zurück zu gehen.
Das nächste Mal werden wir sehen, wie diese Anwendung MongoDB verwendet, um HSQL zu ersetzen.
Willkommen bei Follow <a href = "http://quanke.name/" rel = "nofollow"> </a>
Kommunikationsgruppe: 231419585
Bitte geben Sie die Quelle beim Nachdruck an, danke