Κοινοποίηση μέσω


Πρόγραμμα οδήγησης Microsoft JDBC για Microsoft Fabric Data Engineering (έκδοση προεπισκόπησης)

Σημείωμα

Αυτή η δυνατότητα είναι σε προεπισκόπηση.

Το JDBC (Java Database Connectivity) είναι ένα ευρέως διαδεδομένο πρότυπο που επιτρέπει στις εφαρμογές-πελάτες να συνδέονται και να εργάζονται με δεδομένα από βάσεις δεδομένων και πλατφόρμες μεγάλων δεδομένων.

Το πρόγραμμα οδήγησης Microsoft JDBC για μηχανική δεδομένων Fabric σάς επιτρέπει να συνδέετε, να υποβάλλετε ερωτήματα και να διαχειρίζεστε φόρτους εργασίας Spark στο Microsoft Fabric με την αξιοπιστία και την απλότητα του προτύπου JDBC. Χτισμένο στα Livy API του Microsoft Fabric, το πρόγραμμα οδήγησης παρέχει ασφαλή και ευέλικτη συνδεσιμότητα Spark SQL με τις εφαρμογές Java και τα εργαλεία BI. Αυτή η ενοποίηση σάς επιτρέπει να υποβάλλετε και να εκτελείτε κώδικα Spark απευθείας χωρίς να χρειάζεται να δημιουργήσετε ξεχωριστά τεχνουργήματα Notebook ή Spark Job Definition.

Βασικά χαρακτηριστικά

  • Συμβατό με JDBC 4.2: Πλήρης εφαρμογή της προδιαγραφής JDBC 4.2
  • Έλεγχος ταυτότητας Microsoft Entra ID: Πολλαπλές ροές ελέγχου ταυτότητας, συμπεριλαμβανομένων αλληλεπιδραστικών, διαπιστευτηρίων προγράμματος-πελάτη και ελέγχου ταυτότητας βάσει πιστοποιητικών
  • Enterprise Connection Pooling: Ενσωματωμένη συγκέντρωση συνδέσεων με παρακολούθηση της υγείας και αυτόματη ανάκτηση
  • Υποστήριξη εγγενών ερωτημάτων Spark SQL: Άμεση εκτέλεση προτάσεων Spark SQL χωρίς μετάφραση
  • Ολοκληρωμένη υποστήριξη τύπου δεδομένων: Υποστήριξη για όλους τους τύπους δεδομένων Spark SQL, συμπεριλαμβανομένων των πολύπλοκων τύπων (ARRAY, MAP, STRUCT)
  • Ασύγχρονη προφόρτωση συνόλου αποτελεσμάτων: Φόρτωση δεδομένων παρασκηνίου για βελτιωμένη απόδοση
  • Μοτίβο διακόπτη κυκλώματος: Προστασία από διαδοχικές αστοχίες με αυτόματη επανάληψη
  • Αυτόματη επανασύνδεση: Διαφανής ανάκτηση συνεδρίας σε αποτυχίες σύνδεσης
  • Υποστήριξη διακομιστή μεσολάβησης: Ρύθμιση παραμέτρων διακομιστή μεσολάβησης HTTP και SOCKS για εταιρικά περιβάλλοντα

Prerequisites

Πριν χρησιμοποιήσετε το πρόγραμμα οδήγησης Microsoft JDBC για το Microsoft Fabric Data Engineering, βεβαιωθείτε ότι έχετε:

  • Java Development Kit (JDK): Έκδοση 11 ή νεότερη (συνιστάται Java 21)
  • Microsoft Fabric Access: Πρόσβαση σε χώρο εργασίας Microsoft Fabric
  • Azure Entra ID Credentials: Κατάλληλα διαπιστευτήρια για έλεγχο ταυτότητας
  • Αναγνωριστικά χώρου εργασίας και lakehouse: Αναγνωριστικά GUID για τον χώρο εργασίας Fabric και το lakehouse

Λήψη και εγκατάσταση

Το πρόγραμμα οδήγησης Microsoft JDBC για Microsoft Fabric Data Engineering έκδοση 1.0.0 είναι η έκδοση δημόσιας προεπισκόπησης και υποστηρίζει Java 11, 17 και 21. Βελτιώνουμε συνεχώς την υποστήριξη συνδεσιμότητας Java και συνιστούμε να εργάζεστε με την πιο πρόσφατη έκδοση του προγράμματος οδήγησης Microsoft JDBC.

  1. Κατεβάστε είτε το αρχείο zip είτε tar από τους παραπάνω συνδέσμους.
  2. Εξαγάγετε το ληφθέν αρχείο για πρόσβαση στα αρχεία JAR του προγράμματος οδήγησης.
  3. Επιλέξτε το αρχείο JAR που ταιριάζει με την έκδοση JRE:
    • Για Java 11: ms-sparksql-jdbc-1.0.0.jre11.jar
    • Για Java 17: ms-sparksql-jdbc-1.0.0.jre17.jar
    • Για Java 21: ms-sparksql-jdbc-1.0.0.jre21.jar
  4. Προσθέστε το επιλεγμένο αρχείο JAR στη διαδρομή κλάσης της εφαρμογής σας.
  5. Για υπολογιστές-πελάτες JDBC, διαμορφώστε την κλάση προγράμματος οδήγησης JDBC: com.microsoft.spark.livy.jdbc.LivyDriver

Παράδειγμα γρήγορης εκκίνησης

Αυτό το παράδειγμα δείχνει πώς μπορείτε να συνδεθείτε στο Microsoft Fabric και να εκτελέσετε ένα ερώτημα χρησιμοποιώντας το πρόγραμμα οδήγησης Microsoft JDBC για το Microsoft Fabric Data Engineering. Πριν εκτελέσετε αυτόν τον κωδικό, βεβαιωθείτε ότι έχετε ολοκληρώσει τις προϋποθέσεις και έχετε εγκαταστήσει το πρόγραμμα οδήγησης.

import java.sql.*;

public class QuickStartExample {
    public static void main(String[] args) {
        // Connection string with required parameters
        String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
                     "FabricWorkspaceID=<workspace-id>;" +
                     "FabricLakehouseID=<lakehouse-id>;" +
                     "AuthFlow=2;" +  // Interactive browser authentication
                     "LogLevel=INFO";
        
        try (Connection conn = DriverManager.getConnection(url)) {
            // Execute a simple query
            try (Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT 'Hello from Fabric!' as message")) {
                
                if (rs.next()) {
                    System.out.println(rs.getString("message"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Μορφή συμβολοσειράς σύνδεσης

Βασική συμβολοσειρά σύνδεσης

Το πρόγραμμα οδήγησης Microsoft JDBC για το Microsoft Fabric Data Engineering χρησιμοποιεί την ακόλουθη μορφή συμβολοσειράς σύνδεσης:

jdbc:fabricspark://<hostname>[:<port>][;<parameter1>=<value1>;<parameter2>=<value2>;...]

Στοιχεία συμβολοσειράς σύνδεσης

Συνθετικός Περιγραφή Παράδειγμα
Πρωτόκολλο Αναγνωριστικό πρωτοκόλλου URL JDBC jdbc:fabricspark://
Όνομα κεντρικού υπολογιστή Όνομα κεντρικού υπολογιστή τελικού σημείου Microsoft Fabric api.fabric.microsoft.com
Λιμάνι Προαιρετικός αριθμός θύρας (προεπιλογή: 443) :443
Παράμετροι Ζεύγη κλειδιών=τιμών διαχωρισμένων με ερωτηματικό FabricWorkspaceID=<guid>

Παράδειγμα συμβολοσειρών σύνδεσης

Βασική σύνδεση (αλληλεπιδραστικός έλεγχος ταυτότητας)

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=2

Με τη ρύθμιση παραμέτρων πόρων Spark

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;DriverCores=4;DriverMemory=4g;ExecutorCores=4;ExecutorMemory=8g;NumExecutors=2;AuthFlow=2

Με ιδιότητες περιόδου λειτουργίας Spark

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;spark.sql.adaptive.enabled=true;spark.sql.shuffle.partitions=200;AuthFlow=2

Έλεγχος ταυτότητας

Το πρόγραμμα οδήγησης Microsoft JDBC για το Microsoft Fabric Data Engineering υποστηρίζει πολλές μεθόδους ελέγχου ταυτότητας μέσω του Microsoft Entra ID (πρώην Azure Active Directory). Ο έλεγχος ταυτότητας διαμορφώνεται χρησιμοποιώντας την AuthFlow παράμετρο στη συμβολοσειρά σύνδεσης.

Ροές ελέγχου ταυτότητας

Ροή ελέγχου ταυτότητας Μέθοδος ελέγχου ταυτότητας Περίπτωση χρήσης
0 Διαπιστευτήρια Azure CLI Ανάπτυξη με χρήση Azure CLI
1 Διαπιστευτήρια πελάτη (Κύρια υπηρεσία) Αυτοματοποιημένος έλεγχος ταυτότητας/έλεγχος ταυτότητας από υπηρεσία σε υπηρεσία
2 Διαδραστικό πρόγραμμα περιήγησης Αλληλεπιδραστικός έλεγχος ταυτότητας χρήστη (προεπιλογή)
3 ΣΠΝ Έλεγχος ταυτότητας κύριας υπηρεσίας
4 Certificate-Based Έλεγχος ταυτότητας κύριας υπηρεσίας βάσει πιστοποιητικού
5 Διακριτικό πρόσβασης Προαποκτηθέν διακριτικό πρόσβασης

Αλληλεπιδραστικός έλεγχος ταυτότητας προγράμματος περιήγησης

Καλύτερα για: Ανάπτυξη και διαδραστικές εφαρμογές

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=2;" +  // Interactive browser authentication
             "AuthTenantID=<tenant-id>;" +  // Optional
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Παράμετροι:

  • AuthFlow=2: Καθορίζει αλληλεπιδραστικό έλεγχο ταυτότητας προγράμματος περιήγησης
  • AuthTenantID (προαιρετικό): Αναγνωριστικό μισθωτή Azure
  • AuthClientID (προαιρετικό): Αναγνωριστικό εφαρμογής (πελάτης)

Συμπεριφορά:

  • Ανοίγει ένα παράθυρο του προγράμματος περιήγησης για έλεγχο ταυτότητας χρήστη
  • Τα διαπιστευτήρια αποθηκεύονται προσωρινά για τις επόμενες συνδέσεις μέχρι να λήξουν
  • Κατάλληλο για εφαρμογές ενός χρήστη

Έλεγχος ταυτότητας διαπιστευτηρίων πελάτη

Καλύτερα για: Αυτοματοποιημένες υπηρεσίες και εργασίες παρασκηνίου

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=1;" +  // Client credentials authentication
             "AuthClientID=<client-id>;" +
             "AuthClientSecret=<client-secret>;" +
             "AuthTenantID=<tenant-id>;" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Απαιτούμενες παράμετροι:

  • AuthFlow=1: Καθορίζει τον έλεγχο ταυτότητας διαπιστευτηρίων προγράμματος-πελάτη
  • AuthClientID: Αναγνωριστικό εφαρμογής (προγράμματος-πελάτη) από το Microsoft Entra ID
  • AuthClientSecret: Μυστικός κωδικός προγράμματος-πελάτη από το Microsoft Entra ID
  • AuthTenantID: Αναγνωριστικό μισθωτή Azure

Βέλτιστες πρακτικές:

  • Αποθηκεύστε τα μυστικά με ασφάλεια (Azure Key Vault, μεταβλητές περιβάλλοντος)
  • Χρήση διαχειριζόμενων ταυτοτήτων όταν είναι δυνατό
  • Εναλλάσσετε τακτικά μυστικά

Certificate-Based Έλεγχος ταυτότητας

Ιδανικό για: Εταιρικές εφαρμογές που απαιτούν έλεγχο ταυτότητας βάσει πιστοποιητικών

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=4;" +  // Certificate-based authentication
             "AuthClientID=<client-id>;" +
             "AuthCertificatePath=/path/to/certificate.pfx;" +
             "AuthCertificatePassword=<certificate-password>;" +
             "AuthTenantID=<tenant-id>;" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Απαιτούμενες παράμετροι:

  • AuthFlow=4: Καθορίζει τον έλεγχο ταυτότητας βάσει πιστοποιητικού
  • AuthClientID: Αναγνωριστικό εφαρμογής (προγράμματος-πελάτη)
  • AuthCertificatePath: Διαδρομή προς το αρχείο πιστοποιητικού PFX/PKCS12
  • AuthCertificatePassword: Κωδικός πρόσβασης πιστοποιητικού
  • AuthTenantID: Αναγνωριστικό μισθωτή Azure

Έλεγχος ταυτότητας κύριας υπηρεσίας

Ιδανικό για: Περιβάλλοντα χωρίς κεφάλι και απομακρυσμένες συνεδρίες

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=3;" +  // Device code authentication
             "AuthClientID=<client-id>;" +
             "AuthTenantID=<tenant-id>;" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Συμπεριφορά:

  • Εμφανίζει έναν κωδικό συσκευής και μια διεύθυνση URL στην κονσόλα
  • Ο χρήστης επισκέπτεται τη διεύθυνση URL και εισάγει τον κώδικα
  • Ο έλεγχος ταυτότητας ολοκληρώνεται μετά την επαλήθευση χρήστη

Έλεγχος ταυτότητας διακριτικού πρόσβασης

Ιδανικό για: Προσαρμοσμένα σενάρια ελέγχου ταυτότητας

// Acquire token through custom mechanism
String accessToken = acquireTokenFromCustomSource();

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=5;" +  // Access token authentication
             "AuthAccessToken=" + accessToken + ";" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Προσωρινή αποθήκευση ελέγχου ταυτότητας

Το πρόγραμμα οδήγησης αποθηκεύει αυτόματα προσωρινά τα διακριτικά ελέγχου ταυτότητας για να βελτιώσει τις επιδόσεις:

// Enable/disable caching (enabled by default)
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=2;" +
             "AuthEnableCaching=true;" +  // Enable token caching
             "AuthCacheTTLMS=3600000";    // Cache TTL: 1 hour

Connection conn = DriverManager.getConnection(url);

Παράμετροι διαμόρφωσης

Απαιτούμενες παράμετροι

Αυτές οι παράμετροι πρέπει να υπάρχουν σε κάθε συμβολοσειρά σύνδεσης:

Παράμετρος Type Περιγραφή Παράδειγμα
FabricWorkspaceID UUID Αναγνωριστικό χώρου εργασίας Microsoft Fabric <workspace-id>
FabricLakehouseID UUID Αναγνωριστικό λίμνης Microsoft Fabric <lakehouse-id>
AuthFlow Integer Τύπος ροής ελέγχου ταυτότητας (0-5) 2

Προαιρετικές παράμετροι

Διαμόρφωση έκδοσης API

Παράμετρος Type Προεπιλεγμένος Περιγραφή
FabricVersion Συμβλοσειρά v1 Έκδοση Microsoft Fabric API
LivyApiVersion Συμβλοσειρά 2023-12-01 Έκδοση Livy API

Ρύθμιση παραμέτρων περιβάλλοντος

Παράμετρος Type Προεπιλεγμένος Περιγραφή
FabricEnvironmentID UUID Κανένα Αναγνωριστικό περιβάλλοντος Fabric για αναφορά σε στοιχείο περιβάλλοντος για περίοδο λειτουργίας Spark

Διαμόρφωση Spark

Ρύθμιση πόρων συνεδρίας

Διαμορφώστε τους πόρους περιόδου λειτουργίας Spark για βέλτιστη απόδοση:

Παράμετρος Type Προεπιλεγμένος Περιγραφή Παράδειγμα
DriverCores Integer Προεπιλογή Spark Αριθμός πυρήνων CPU για πρόγραμμα οδήγησης 4
DriverMemory Συμβλοσειρά Προεπιλογή Spark Εκχώρηση μνήμης για πρόγραμμα οδήγησης 4g
ExecutorCores Integer Προεπιλογή Spark Αριθμός πυρήνων CPU ανά εκτελεστή 4
ExecutorMemory Συμβλοσειρά Προεπιλογή Spark Εκχώρηση μνήμης ανά εκτελεστή 8g
NumExecutors Integer Προεπιλογή Spark Αριθμός εκτελεστών 2

Παράδειγμα:

DriverCores=4;DriverMemory=4g;ExecutorCores=4;ExecutorMemory=8g;NumExecutors=2

Ιδιότητες προσαρμοσμένης περιόδου λειτουργίας Spark

Οποιαδήποτε παράμετρος με το πρόθεμα spark. εφαρμόζεται αυτόματα στην περίοδο λειτουργίας Spark:

Παράδειγμα διαμορφώσεων Spark:

spark.sql.adaptive.enabled=true
spark.sql.adaptive.coalescePartitions.enabled=true
spark.sql.shuffle.partitions=200
spark.sql.autoBroadcastJoinThreshold=10485760
spark.dynamicAllocation.enabled=true
spark.dynamicAllocation.minExecutors=1
spark.dynamicAllocation.maxExecutors=10
spark.executor.memoryOverhead=1g

Εγγενής μηχανή εκτέλεσης (NEE):

spark.nee.enabled=true

Πλήρες παράδειγμα:

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<guid>;FabricLakehouseID=<guid>;DriverMemory=4g;ExecutorMemory=8g;NumExecutors=2;spark.sql.adaptive.enabled=true;spark.nee.enabled=true;AuthFlow=2

Διαμόρφωση χώρου συγκέντρωσης συνδέσεων HTTP

Διαμορφώστε τη συγκέντρωση συνδέσεων HTTP για βέλτιστη απόδοση δικτύου:

Παράμετρος Type Προεπιλεγμένος Περιγραφή
HttpMaxTotalConnections Integer 100 Μέγιστες συνολικές συνδέσεις HTTP
HttpMaxConnectionsPerRoute Integer 50 Μέγιστος αριθμός συνδέσεων ανά δρομολόγιο
HttpConnectionTimeoutInSeconds Integer 30 Χρονικό όριο σύνδεσης
HttpSocketTimeoutInSeconds Integer 60 Χρονικό όριο ανάγνωσης υποδοχής
HttpReadTimeoutInSeconds Integer 60 Χρονικό όριο ανάγνωσης HTTP
HttpConnectionRequestTimeoutSeconds Integer 30 Χρονικό όριο αιτήματος σύνδεσης από το χώρο συγκέντρωσης
HttpEnableKeepAlive Boolean true Ενεργοποίηση διατήρησης ενεργού HTTP
HttpKeepAliveTimeoutSeconds Integer 60 Χρονικό όριο διατήρησης εν ενεργεία
HttpFollowRedirects Boolean true Ακολουθήστε τις ανακατευθύνσεις HTTP
HttpUseAsyncIO Boolean ψευδής Χρήση ασύγχρονης εισόδου/εξόδου HTTP

Παράδειγμα:

HttpMaxTotalConnections=200;HttpMaxConnectionsPerRoute=100;HttpConnectionTimeoutInSeconds=60

Διαμόρφωση διακομιστή μεσολάβησης

Διαμορφώστε τις ρυθμίσεις διακομιστή μεσολάβησης HTTP και SOCKS για εταιρικά περιβάλλοντα:

Παράμετρος Type Προεπιλεγμένος Περιγραφή
UseProxy Boolean ψευδής Ενεργοποίηση διακομιστή μεσολάβησης
ProxyTransport Συμβλοσειρά http Τύπος μεταφοράς διακομιστή μεσολάβησης (http/tcp)
ProxyHost Συμβλοσειρά Κανένα Όνομα κεντρικού υπολογιστή διακομιστή μεσολάβησης
ProxyPort Integer Κανένα Θύρα διακομιστή μεσολάβησης
ProxyAuthEnabled Boolean ψευδής Ενεργοποίηση ελέγχου ταυτότητας διακομιστή μεσολάβησης
ProxyUsername Συμβλοσειρά Κανένα Όνομα χρήστη ελέγχου ταυτότητας διακομιστή μεσολάβησης
ProxyPassword Συμβλοσειρά Κανένα Κωδικός πρόσβασης ελέγχου ταυτότητας διακομιστή μεσολάβησης
ProxyAuthScheme Συμβλοσειρά basic Σχήμα ελέγχου ταυτότητας (basic/digest/ntlm)
ProxySocksVersion Integer 5 Έκδοση SOCKS (4/5)

Παράδειγμα διακομιστή μεσολάβησης HTTP:

UseProxy=true;ProxyTransport=http;ProxyHost=proxy.company.com;ProxyPort=8080;ProxyAuthEnabled=true;ProxyUsername=user;ProxyPassword=pass

Παράδειγμα διακομιστή μεσολάβησης SOCKS:

UseProxy=true;ProxyTransport=tcp;ProxyHost=socks.company.com;ProxyPort=1080;ProxySocksVersion=5

Καταγραφή διαμόρφωσης

Παράμετρος Type Προεπιλεγμένος Περιγραφή
LogLevel Συμβλοσειρά INFO Επίπεδο καταγραφής: TRACE, DEBUG, INFO, WARN, ERROR

Παράδειγμα:

LogLevel=DEBUG

Προεπιλεγμένη τοποθεσία καταγραφής:

${user.home}/.microsoft/livy-jdbc-driver/driver.log

Προσαρμοσμένη διαμόρφωση αρχείου καταγραφής: Χρησιμοποιήστε ένα προσαρμοσμένο log4j2.xml αρχείο ή logback.xml ένα αρχείο στη διαδρομή κλάσης σας.


Παραδείγματα χρήσης

Βασική σύνδεση

import java.sql.*;

public class BasicConnectionExample {
    public static void main(String[] args) {
        String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
                     "FabricWorkspaceID=<workspace-id>;" +
                     "FabricLakehouseID=<lakehouse-id>;" +
                     "AuthFlow=2";
        
        try (Connection conn = DriverManager.getConnection(url)) {
            System.out.println("Connected successfully!");
            System.out.println("Database: " + conn.getMetaData().getDatabaseProductName());
            System.out.println("Driver: " + conn.getMetaData().getDriverName());
            System.out.println("Driver Version: " + conn.getMetaData().getDriverVersion());
        } catch (SQLException e) {
            System.err.println("Connection failed: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Εκτέλεση ερωτημάτων

Απλό ερώτημα

public void executeSimpleQuery(Connection conn) throws SQLException {
    String sql = "SELECT current_timestamp() as now";
    
    try (Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {
        
        if (rs.next()) {
            Timestamp now = rs.getTimestamp("now");
            System.out.println("Current timestamp: " + now);
        }
    }
}

Ερώτημα με φίλτρο

public void executeQueryWithFilter(Connection conn) throws SQLException {
    String sql = "SELECT * FROM sales WHERE amount > 1000 ORDER BY amount DESC";
    
    try (Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {
        
        while (rs.next()) {
            int id = rs.getInt("id");
            double amount = rs.getDouble("amount");
            Date date = rs.getDate("sale_date");
            
            System.out.printf("ID: %d, Amount: %.2f, Date: %s%n", 
                            id, amount, date);
        }
    }
}

Ερώτημα με όριο

public void executeQueryWithLimit(Connection conn) throws SQLException {
    String sql = "SELECT * FROM customers LIMIT 10";
    
    try (Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {
        
        ResultSetMetaData metaData = rs.getMetaData();
        int columnCount = metaData.getColumnCount();
        
        // Print column names
        for (int i = 1; i <= columnCount; i++) {
            System.out.print(metaData.getColumnName(i) + "\t");
        }
        System.out.println();
        
        // Print rows
        while (rs.next()) {
            for (int i = 1; i <= columnCount; i++) {
                System.out.print(rs.getString(i) + "\t");
            }
            System.out.println();
        }
    }
}

Εργασία με σύνολα αποτελεσμάτων

public void navigateResultSet(Connection conn) throws SQLException {
    String sql = "SELECT id, name, amount FROM orders";
    
    try (Statement stmt = conn.createStatement(
            ResultSet.TYPE_SCROLL_INSENSITIVE,
            ResultSet.CONCUR_READ_ONLY);
         ResultSet rs = stmt.executeQuery(sql)) {
        
        // Move to first row
        if (rs.first()) {
            System.out.println("First row: " + rs.getString("name"));
        }
        
        // Move to last row
        if (rs.last()) {
            System.out.println("Last row: " + rs.getString("name"));
            System.out.println("Total rows: " + rs.getRow());
        }
        
        // Move to specific row
        if (rs.absolute(5)) {
            System.out.println("Row 5: " + rs.getString("name"));
        }
    }
}

Επεξεργασία μεγάλων συνόλων αποτελεσμάτων

public void processLargeResultSet(Connection conn) throws SQLException {
    String sql = "SELECT * FROM large_table";
    
    try (Statement stmt = conn.createStatement()) {
        // Set fetch size for efficient memory usage
        stmt.setFetchSize(1000);
        
        try (ResultSet rs = stmt.executeQuery(sql)) {
            int rowCount = 0;
            while (rs.next()) {
                // Process row
                processRow(rs);
                rowCount++;
                
                if (rowCount % 10000 == 0) {
                    System.out.println("Processed " + rowCount + " rows");
                }
            }
            System.out.println("Total rows processed: " + rowCount);
        }
    }
}

private void processRow(ResultSet rs) throws SQLException {
    // Process individual row
}

Χρήση προετοιμασμένων δηλώσεων

public void usePreparedStatement(Connection conn) throws SQLException {
    String sql = "SELECT * FROM products WHERE category = ? AND price > ?";
    
    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        // Set parameters
        pstmt.setString(1, "Electronics");
        pstmt.setDouble(2, 100.0);
        
        try (ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                String name = rs.getString("name");
                double price = rs.getDouble("price");
                System.out.printf("Product: %s, Price: $%.2f%n", name, price);
            }
        }
    }
}

Λειτουργίες παρτίδας

public void executeBatchInsert(Connection conn) throws SQLException {
    String sql = "INSERT INTO logs (timestamp, level, message) VALUES (?, ?, ?)";
    
    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        conn.setAutoCommit(false);  // Disable auto-commit for batch
        
        // Add multiple statements to batch
        for (int i = 0; i < 1000; i++) {
            pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
            pstmt.setString(2, "INFO");
            pstmt.setString(3, "Log message " + i);
            pstmt.addBatch();
            
            // Execute batch every 100 statements
            if (i % 100 == 0) {
                pstmt.executeBatch();
                pstmt.clearBatch();
            }
        }
        
        // Execute remaining statements
        pstmt.executeBatch();
        conn.commit();
        
        System.out.println("Batch insert completed successfully");
    } catch (SQLException e) {
        conn.rollback();
        throw e;
    } finally {
        conn.setAutoCommit(true);
    }
}

Αντιστοίχιση τύπου δεδομένων

Το πρόγραμμα οδήγησης αντιστοιχίζει τους τύπους δεδομένων Spark SQL σε τύπους JDBC SQL και τύπους Java:

Τύπος SQL Spark Τύπος SQL JDBC Τύπος Java Σημειώσεις
BOOLEAN BOOLEAN Boolean
BYTE TINYINT Byte
SHORT SMALLINT Short
INT INTEGER Integer
LONG BIGINT Long
FLOAT FLOAT Float
DOUBLE DOUBLE Double
DECIMAL DECIMAL BigDecimal Διατήρηση της ακρίβειας και της κλίμακας
STRING VARCHAR String
VARCHAR(n) VARCHAR String
CHAR(n) CHAR String
BINARY BINARY byte[]
DATE DATE java.sql.Date
TIMESTAMP TIMESTAMP java.sql.Timestamp
ARRAY VARCHAR String Σειριακή ως JSON
MAP VARCHAR String Σειριακή ως JSON
STRUCT VARCHAR String Σειριακή ως JSON