Java-Synchronisationslogik arbeitet mit MobiLink und gemeinsam verwendeten Java-Klassen und bietet Ihnen Flexibilität beim Deployment von Anwendungen im Zusammenhang mit dem MobiLink-Server. Der folgende Abschnitt ist eine Einführung in diesen erweiterten Funktionsbereich anhand eines einfachen Beispiels.
In diesem Abschnitt wird ein funktionierendes Beispiel für Java-Synchronisationslogik beschrieben. Bevor Sie versuchen, diese Klasse einzusetzen, bzw. Ihre eigene Klasse zu schreiben, stellen Sie mithilfe der folgenden Checkliste sicher, dass alle Bestandteile am richtigen Ort vorhanden sind, bevor Sie die Klasse kompilieren.
Planen Sie die Funktionen, z.B. mit Pseudocode.
Erstellen Sie eine Übersicht der Datenbanktabellen und –spalten.
Konfigurieren Sie die konsolidierte Datenbank für Java, indem Sie sicherstellen, dass in den MobiLink-Systemtabellen Sprachtyp und Speicherort der Java-Synchronisationsmethoden angegeben sind.
Weitere Hinweise finden Sie unter Java-Synchronisationslogik einrichten.
Erstellen Sie eine Liste der zugeordneten Java-Klassen, die beim Ausführen Ihrer Java-Klassen aufgerufen werden.
Speichern Sie Ihre Java-Klassen an einem Speicherort, der in der Classpath-Variablen für MobiLink enthalten ist.
Die Java-Synchronisationslogik für dieses Beispiel verweist auf die zugeordneten Java-Dateien und –Klassen, die die für die Ausführung des Beispiels benötigten Funktionen enthalten. Das Beispiel zeigt, wie Sie eine CustEmpScripts-Klasse erstellen. Sie erfahren, wie ein Synchronisationskontext für die Verbindung eingerichtet wird. Schließlich liefert das Beispiel Java-Methoden für folgende Aufgaben:
Einen MobiLink-Benutzer authentifizieren.
Für jede einzelne Datenbanktabelle Download- und Uploadvorgänge mit einem Cursor durchführen.
Die zu synchronisierenden Tabellen sind emp und cust. Die Tabelle emp umfasst drei Spalten mit den Namen emp_id, emp_name und manager. Die Tabelle cust enthält die drei Spalten cust_id, cust_name und emp_id. Alle Spalten in den einzelnen Tabellen werden synchronisiert. Die Zuordnung von der konsolidierten zur entfernten Datenbank ist so, dass Tabellennamen und Spaltennamen in beiden Datenbanken identisch sind. Eine zusätzliche Tabelle, eine Audit-Tabelle, wird der konsolidierten Datenbank hinzugefügt.
Die in diesem Beispiel enthaltenen Dateien befinden sich im Verzeichnis Samples\MobiLink\JavaAuthentication.
Der folgende Code richtet die Java-Synchronisationslogik ein. Über die Import-Anweisungen wird der Java Virtual Machine der Speicherort der benötigten Dateien mitgeteilt. Mit der öffentlichen Klassenanweisung wird die Klasse deklariert.
// Use a package when you create your own script. import ianywhere.ml.script.InOutInteger; import ianywhere.ml.script.DBConnectionContext; import ianywhere.ml.script.ServerContext; import java.sql.*; public class CustEmpScripts { // Context for this synchronization connection. DBConnectionContext _conn_context; // Same connection MobiLink uses for sync. // Do not commit or close this. Connection _sync_connection; Connection _audit_connection; //Get a user id given the user name. On audit connection. PreparedStatement _get_user_id_pstmt; // Add record of user logins added. On audit connection. PreparedStatement _insert_login_pstmt; // Prepared statement to add a record to the audit table. // On audit connection. PreparedStatement _insert_audit_pstmt; // ... } |
Der Konstruktor CustEmpScripts passt alle vorbereiteten Anweisungen für die Methode authenticateUser an. Er richtet Mitgliederdaten ein.
public CustEmpScripts(DBConnectionContext cc) throws SQLException { try { _conn_context = cc; _sync_connection = _conn_context.getConnection(); ServerContext serv_context = _conn_context.getServerContext(); _audit_connection = serv_context.makeConnection(); // Get the prepared statements ready. _get_user_id_pstmt = _audit_connection.prepareStatement( "select user_id from ml_user where name = ?" ); _insert_login_pstmt = _audit_connection.prepareStatement( "INSERT INTO login_added(ml_user, add_time) " + "VALUES (?, { fn CONVERT({ fn NOW() }, SQL_VARCHAR) })" ); _insert_audit_pstmt = _audit_connection.prepareStatement( "INSERT INTO login_audit(ml_user_id, audit_time, audit_action) " + "VALUES (?, { fn CONVERT({ fn NOW() }, SQL_VARCHAR) }, ?)" ); } catch(SQLException e) { freeJDBCResources(); throw e; } catch(Error e) { freeJDBCResources(); throw e; } } |
Die Methode finalize bereinigt JDBC-Ressourcen, falls end_connection nicht aufgerufen wird. Sie ruft die Methode freeJDBCResources auf, wodurch zugewiesener Speicher freigegeben und die Audit-Verbindung geschlossen wird.
protected void finalize() throws SQLException, Throwable { super.finalize(); freeJDBCResources(); } private void freeJDBCResources() throws SQLException { if (_get_user_id_pstmt != null) { _get_user_id_pstmt.close(); } if (_insert_login_pstmt != null) { _insert_login_pstmt.close(); } if (_insert_audit_pstmt != null) { _insert_audit_pstmt.close(); } if (_audit_connection != null) { _audit_connection.close(); } _conn_context = null; _sync_connection = null; _audit_connection = null; _get_user_id_pstmt = null; _insert_login_pstmt = null; _insert_audit_pstmt = null; } |
Die Methode endConnection bereinigt die Ressourcen, wenn diese nicht mehr benötigt werden.
public void endConnection() throws SQLException { freeJDBCResources(); } |
Die Methode authenticateUser weiter unten genehmigt alle Benutzerlogins und protokolliert die Benutzerdaten in Datenbanktabellen. Wenn ein Benutzer nicht in der Tabelle ml_user enthalten ist, wird er in login_added erfasst. Wenn die Benutzer-ID in ml_user enthalten ist, wird sie in login_audit erfasst. In einem echten System muss auch das user_password berücksichtigt werden. Der Einfachheit halber werden in diesem Beispiel alle Benutzer genehmigt. Die Methode endConnection gibt eine SQL-Ausnahmebedingung aus, falls einer der Datenbankvorgänge mit einer Ausnahme fehlschlägt.
public void authenticateUser( InOutInteger authentication_status, String user_name) throws SQLException { boolean new_user; int user_id; // Get ml_user id. _get_user_id_pstmt.setString(1, user_name); ResultSet user_id_rs = _get_user_id_pstmt.executeQuery(); new_user = !user_id_rs.next(); if (!new_user) { user_id = user_id_rs.getInt(1); } else { user_id = 0; } user_id_rs.close(); user_id_rs = null; // In this tutorial always allow the login. authentication_status.setValue(1000); if (new_user) { _insert_login_pstmt.setString(1, user_name); _insert_login_pstmt.executeUpdate(); java.lang.System.out.println("user: " + user_name + " added. "); } else { _insert_audit_pstmt.setInt(1, user_id); _insert_audit_pstmt.setString(2, "LOGIN ALLOWED"); _insert_audit_pstmt.executeUpdate(); } _audit_connection.commit(); return; } |
Die folgenden Methoden benutzen SQL-Code als Cursor in den Datenbanktabellen. Da es sich dabei um Cursor-Skripten handelt, müssen sie eine SQL-Zeichenfolge zurückgeben.
public static String empUploadInsertStmt() { return("INSERT INTO emp(emp_id, emp_name) VALUES(?, ?)"); } public static String empUploadDeleteStmt() { return("DELETE FROM emp WHERE emp_id = ?"); } public static String empUploadUpdateStmt() { return("UPDATE emp SET emp_name = ? WHERE emp_id = ?"); } public static String empDownloadCursor() { return("SELECT emp_id, emp_name FROM emp"); } public static String custUploadInsertStmt() { return("INSERT INTO cust(cust_id, emp_id, cust_name) VALUES (?, ?, ?)"); } public static String custUploadDeleteStmt() { return("DELETE FROM cust WHERE cust_id = ?"); } public static String custUploadUpdateStmt() { return("UPDATE cust SET emp_id = ?, cust_name = ? WHERE cust_id = ?"); } public static String custDownloadCursor() { return("SELECT cust_id, emp_id, cust_name FROM cust"); } |
Mit dem folgenden Befehl kompilieren Sie den Code:
javac -cp %sqlany11%\java\mlscript.jar CustEmpScripts.java |
Führen Sie den MobiLink-Server mit der Position von CustEmpScripts.class in der Classpath-Variablen aus. Im Folgenden finden Sie den Ausschnitt einer Befehlszeile:
mlsrv11 ... -sl java (-cp <class_location>) |
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |