Microsoft JDBC-stuurprogramma voor Microsoft Fabric Data Engineering

JDBC (Java Database Connectivity) is een veelgebruikte standaard waarmee clienttoepassingen verbinding kunnen maken met en kunnen werken met gegevens uit databases en big data-platforms.

De Microsoft JDBC Driver for Fabric Data Engineering stelt je in staat om Spark-workloads in Fabric te verbinden, te bevragen en te beheren met de betrouwbaarheid en eenvoud van de JDBC-standaard. Gebouwd op Fabric's Livy-API's biedt de driver veilige en flexibele Spark SQL-connectiviteit naar je Java-applicaties en BI-tools. Deze integratie stelt je in staat om Spark-code direct in te dienen en uit te voeren zonder aparte notebook- of Spark-taakdefinitie-items te hoeven maken. Het stuurprogramma is compatibel met populaire JDBC-clients, zoals DbVisualizer en DBeaver, evenals BI-hulpprogramma's die ondersteuning bieden voor JDBC-connectiviteit, waaronder Tableau.

Belangrijke functies

  • JDBC 4.2 API's: Implementeert JDBC 4.2 API's voor Spark SQL-connectiviteit, met Spark- en Livy-beperkingen zoals geen JDBC-transacties en alleen vooruitgestuurde, alleen-lezen resultaatsets
  • Microsoft Entra ID-verificatie: meerdere verificatiestromen, waaronder interactieve, clientreferenties en verificatie op basis van certificaten
  • Sessies met hoge mate van gelijktijdigheid: Optioneel delen van Fabric-sessies voor gelijktijdige werkbelastingen
  • Expliciete verbindingspooling: Kies HikariCP, een standaard poolmanager, of LivyBuiltInPooledDataSource; directe toegangspunten poolen nooit
  • Spark SQL native query-ondersteuning: Directe uitvoering van Spark SQL-instructies zonder vertaling
  • Uitgebreide ondersteuning voor gegevenstypen: ondersteuning voor alle Spark SQL-gegevenstypen, waaronder complexe typen (ARRAY, MAP, STRUCT)
  • Asynchrone resultatenset prefetching: achtergrondgegevens laden voor verbeterde prestaties
  • Circuit Breaker-patroon: beveiliging tegen cascaderende fouten met automatische pogingen
  • Automatisch opnieuw verbinding maken: Transparant sessieherstel bij verbindingsfouten
  • Geavanceerde logica voor opnieuw proberen: Opnieuw proberen met exponentieel uitstel en sessieherstel voor verbeterde tolerantie
  • Proxyondersteuning: HTTP- en SOCKS-proxyconfiguratie voor bedrijfsomgevingen

Vereiste voorwaarden

Voordat je de Microsoft JDBC Driver for Fabric Data Engineering gebruikt, zorg ervoor dat je:

  • Java Development Kit (JDK): Java 11, 17 en 21 (Java 21 aanbevolen)
  • Fabric Access: Toegang tot een Fabric werkruimte
  • Microsoft Entra ID referenties: juiste referenties voor verificatie
  • Werkruimte- en Lakehouse-id's: GUID-id's voor uw Fabric-werkruimte en Lakehouse

Downloaden en installeren

Microsoft JDBC Driver for Fabric Data Engineering versie 2.0.1 ondersteunt Java 11, 17 en 21. Gebruik de nieuwste beschikbare versie.

  1. Download het zip- of tar-bestand via de bovenstaande koppelingen.
  2. Pak het gedownloade bestand uit om toegang te krijgen tot de JAR-bestanden van het stuurprogramma.
  3. Selecteer het JAR-bestand dat overeenkomt met uw JRE-versie:
    • Voor Java 11: ms-sparksql-jdbc-2.0.1.jre11.jar
    • Voor Java 17: ms-sparksql-jdbc-2.0.1.jre17.jar
    • Voor Java 21: ms-sparksql-jdbc-2.0.1.jre21.jar
  4. Voeg het geselecteerde JAR-bestand toe aan het klassepad van uw toepassing.
  5. Voor JDBC-clients configureert u de JDBC-stuurprogrammaklasse: com.microsoft.spark.livy.jdbc.LivyDriver

Snelstartvoorbeeld

Dit voorbeeld laat zien hoe je verbinding maakt met Fabric en een query uitvoert met behulp van de Microsoft JDBC Driver for Fabric Data Engineering. Voordat je deze code uitvoert, zorg ervoor dat je aan de vereisten voldoet en de driver installeert. Door AuthFlow=2 te gebruiken, gebruikt het stuurprogramma DefaultAzureCredential. Om Azure CLI als bron voor de aanmeldingsgegevens te gebruiken, installeer je Azure CLI en voer az login uit.

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;" +  // DefaultAzureCredential; Azure CLI can be one source
                     "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();
        }
    }
}

Formaat van verbindingsstring

Basisverbindingsreeks

De Microsoft JDBC Driver for Fabric Data Engineering gebruikt het volgende verbindingsreeks-formaat:

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

Componenten van de connection string

Onderdeel Description Example
Protocol JDBC URL-protocolidentificatie jdbc:fabricspark://
Hostnaam Hostnaam van het Fabric-eindpunt api.fabric.microsoft.com
port Optioneel poortnummer (standaard: 443) :443
Parameters Door puntkomma's gescheiden sleutel=waarde paren FabricWorkspaceID=<guid>

Voorbeeld van verbindingsreeksen

Basisverbinding (verificatie op basis van interactieve browser)

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

Met Spark-resourceconfiguratie

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

Met eigenschappen van Spark-sessie

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

Met modus voor hoge gelijktijdigheid

High-concurrency (HC) modus is beschikbaar voor Microsoft Fabric-verbindingen vanaf driverversie 1.1.0 en later. Voeg hcEnabled=true toe om een HC-sessie te verkrijgen in plaats van een klassieke Livy-sessie:

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

Je kunt optioneel de werklast identificeren met een sessietag en een Fabric-omgeving selecteren:

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=2;hcEnabled=true;sessionTag=orders_etl;FabricEnvironmentID=<environment-id>

HC-modus moet worden ingeschakeld. Als hcEnabled wordt weggelaten of ingesteld op false, gebruikt de driver het klassieke Livius-sessiepad.

Zie de sectie High-Concurrency (HC) Mode voor volledige configuratierichtlijnen.


Authenticatie

De Microsoft JDBC Driver for Fabric Data Engineering ondersteunt meerdere authenticatiemethoden via Microsoft Entra ID (voorheen Azure Active Directory). Verificatie wordt geconfigureerd met behulp van de AuthFlow parameter in de verbindingsreeks.

Verificatiestromen

AuthFlow Verificatiemethode Gebruikssituatie
1 Interactieve browser Interactieve gebruikersverificatie met OAuth 2.0
2 Standaard Azure-referentiegegevensketen Ontwikkeling en beheerde applicatieauthenticatie; Azure CLI kan één bron van credentials zijn
3 Referenties voor clientgeheim (service-principal) Geautomatiseerde/service-naar-service-authenticatie
4 Referentie voor clientcertificaat Authenticatie van een service-principal op basis van certificaat
5 Toegangstoken Vooraf verkregen bearer-toegangstoken

Interactieve browserverificatie

Geschikt voor: Ontwikkeling en interactieve toepassingen

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=1;" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Parameters:

  • AuthFlow=1: Specificeert interactieve browserverificatie

Gedrag:

  • Hiermee opent u een browservenster voor gebruikersverificatie
  • Cachet inloggegevens voor volgende verbindingen totdat ze verlopen
  • Geschikt voor toepassingen met één gebruiker

Client- of Servicegebruikerauthenticatie

Geschikt voor: Geautomatiseerde services en achtergrondtaken

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

Connection conn = DriverManager.getConnection(url);

Vereiste parameters:

  • AuthFlow=3: Hiermee specificeert u client-credentials-authenticatie
  • AuthClientID: Toepassings-ID (client) van Microsoft Entra ID
  • AuthClientSecret: Clientgeheim van Microsoft Entra-id
  • AuthTenantID: Microsoft Entra-tenant-id

Best practices:

  • Geheimen veilig opslaan (Azure Key Vault, omgevingsvariabelen)
  • Beheerde identiteiten gebruiken indien mogelijk
  • Geheimen regelmatig roteren

Certificate-Based Authenticatie

Geschikt voor: Bedrijfstoepassingen waarvoor verificatie op basis van certificaten is vereist

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

Connection conn = DriverManager.getConnection(url);

Vereiste parameters:

  • AuthFlow=4: Hiermee geeft u verificatie op basis van certificaten op
  • AuthClientID: Applicatie-ID (client)
  • AuthCertificatePath: Pad naar een PEM-certificaatbestand
  • AuthCertificatePassword: Certificaatwachtwoord
  • AuthTenantID: Microsoft Entra-tenant-id

Verificatie van toegangstokens

Geschikt voor: Scenario's voor aangepaste verificatie

// 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);

Verificatiecache

De driver cachet authenticatietokens en ververst deze op basis van de vervaldatum van de token. De parsed AuthEnableCaching en AuthCacheTTLMS eigenschappen sturen dit gedrag niet in versie 2.0.0.

Configuratieparameters

Vereiste parameters

Deze parameters moeten aanwezig zijn in elke verbindingsreeks:

Kenmerk Typologie Description Example
FabricWorkspaceID UUID (universeel unieke identificator) Fabric-werkruimte-id <workspace-id>
FabricLakehouseID UUID (universeel unieke identificator) Fabric-lakehouse-id <lakehouse-id>
AuthFlow Integer Verificatiestroomtype (1-5) 2

Optionele parameters

API-versieconfiguratie

Kenmerk Typologie Verstek Description
FabricVersion Snaar / Touwtje v1 Fabric API-versie
LivyApiVersion Snaar / Touwtje 2023-12-01 Livy-API-versie

Omgevingsconfiguratie

Kenmerk Typologie Verstek Description
FabricEnvironmentID UUID (universeel unieke identificator) Geen Fabric-omgeving-ID voor het refereren aan een item binnen de omgeving voor een Spark-sessie

Configuratie van sessies met hoge gelijktijdigheid

Ingesteld hcEnabled=true op HC-modus. De overige HC-eigenschappen worden alleen gebruikt wanneer HC-modus is ingeschakeld.

Kenmerk Typologie Verstek Description
hcEnabled Booleaan false Gebruikt een Fabric-sessie met hoge gelijktijdigheid.
sessionTag Snaar / Touwtje Geen Optionele sessietag aan serverzijde. Gebruik 1 tot en met 64 letters, cijfers, onderstreepjes of koppeltekens.
hcAcquireTimeoutSeconds Integer 300 Maximale wachttijd tot de HC-sessie klaar is. Geldige waarden variëren van 120 tot en met 3.600 seconden.
hcAcquirePollingIntervalMs Integer 1000 Interval tussen statuscontroles van HC-sessies. Geaccepteerde waarden variëren van 50 tot 30.000 milliseconden en worden tijdens de uitvoering vastgezet op 100 tot 5.000 milliseconden.

Example:

hcEnabled=true;sessionTag=interactive_reporting;hcAcquireTimeoutSeconds=600;hcAcquirePollingIntervalMs=2000;FabricEnvironmentID=<environment-id>
  • FabricEnvironmentID geldt voor zowel HC- als klassieke sessies
  • EnvironmentID wordt ook geaccepteerd als alias voor meerdere stuurprogramma's. Eigenschapsnamen zijn hoofdletterongevoelig.

Important

sessionTag Gebruik alleen voor niet-gevoelige operationele labels. Voeg geen geheimen, toegangstokens, persoonlijke gegevens, klantidentificaties of querytekst toe.

Zie de sectie High-Concurrency (HC) Mode voor volledige configuratierichtlijnen.

Spark-configuratie

Configuratie van sessieresource

Spark-sessiebronnen configureren voor optimale prestaties:

Kenmerk Typologie Verstek Description Example
DriverCores Integer Spark-standaardwaarde Aantal CPU-kernen voor stuurprogramma 4
DriverMemory Snaar / Touwtje Spark-standaardwaarde Geheugentoewijzing voor stuurprogramma 4g
ExecutorCores Integer Spark-standaardwaarde Aantal CPU-kernen per uitvoerder 4
ExecutorMemory Snaar / Touwtje Spark-standaardwaarde Geheugentoewijzing per uitvoerder 8g
NumExecutors Integer Spark-standaardwaarde Aantal uitvoerders 2
SessionName Snaar / Touwtje Automatisch gegenereerd Aangepaste sessienaam MySparkSession

Example:

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

Eigenschappen van aangepaste Spark-sessie

Elke parameter met het voorvoegsel spark. wordt automatisch toegepast op de Spark-sessie:

Voorbeeld van Spark-configuraties:

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

Systeemeigen uitvoeringsengine (NEE):

spark.nee.enabled=true

Volledig voorbeeld:

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-clientverbindingsinstellingen

Configureer de HTTP-transportverbindingen van de driver voor optimale netwerkprestaties. Deze instellingen configureren of beheren de JDBC-verbindingspooling niet:

Kenmerk Typologie Verstek Description
HttpMaxTotalConnections Integer 100 Maximumaantal HTTP-verbindingen
HttpMaxConnectionsPerRoute Integer 20 Maximum aantal verbindingen per route
HttpConnectionTimeoutInSeconds Integer 30 Verbindingstijd is verlopen
HttpSocketTimeoutInSeconds Integer 60 Time-out voor socketleesbewerking
HttpReadTimeoutInSeconds Integer 60 Time-out voor HTTP-leesbewerking
HttpConnectionRequestTimeoutSeconds Integer 10 Time-out van verbindingsaanvraag vanuit pool
HttpEnableKeepAlive Booleaan true HTTP-keep-alive inschakelen
HttpKeepAliveTimeoutSeconds Integer 60 Keep-alive time-out
HttpFollowRedirects Booleaan true HTTP-omleidingen volgen
HttpUseAsyncIO Booleaan true Asynchrone HTTP I/O gebruiken

Example:

HttpMaxTotalConnections=200;HttpMaxConnectionsPerRoute=100;HttpConnectionTimeoutInSeconds=60

Proxyconfiguratie

HTTP- en SOCKS-proxyinstellingen configureren voor bedrijfsomgevingen:

Kenmerk Typologie Verstek Description
UseProxy Booleaan false Proxy inschakelen
ProxyTransport Snaar / Touwtje http Proxy-transporttype (http/tcp)
ProxyHost Snaar / Touwtje Geen Proxyhostnaam
ProxyPort Integer Geen Proxypoort
ProxyAuthEnabled Booleaan false Proxyverificatie inschakelen
ProxyUsername Snaar / Touwtje Geen Gebruikersnaam voor proxyverificatie
ProxyPassword Snaar / Touwtje Geen Wachtwoord voor proxyverificatie
ProxyAuthScheme Snaar / Touwtje basic Authenticatieschema (basic/digest/ntlm)
ProxySocksVersion Integer 5 SOCKS-versie (4/5)

Voorbeeld van HTTP-proxy:

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

Voorbeeld van SOCKS-proxy:

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

Configuratie van logboekregistratie

Kenmerk Typologie Verstek Description
LogLevel Snaar / Touwtje WARN Niveau van logboekregistratie: TRACE, DEBUG, INFO, WAARSCHUWING, FOUT

Example:

LogLevel=DEBUG

Standaardlocatie van logboek:

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

Aangepaste logboekconfiguratie: Gebruik een aangepast log4j2.xml bestand of logback.xml bestand in uw klaspad.

Modus voor hoge gelijktijdigheid (HC)

High-concurrency (HC) modus is ontworpen voor JDBC-applicaties die meerdere verbindingen openen naar dezelfde Fabric-werkruimte en lakehouse. In plaats van voor elke verbinding een aparte klassieke Spark-sessie te provisioneren, bedient Fabric die verbindingen met gedeelde, serverbeheerde Spark-capaciteit.

HC-modus kan de opstarttijd van de verbinding verkorten, herhaalde Spark-sessieprovisioning vermijden en beschikbare capaciteit efficiënter benutten voor gelijktijdige workloads. Elke JDBC-verbinding blijft statements uitvoeren via zijn toegewezen context binnen de HC-sessie.

HC-modus is opt-in en vult JDBC verbindingspooling aan. HC-modus beheert Fabric Spark-sessies op de server, terwijl JDBC-verbindingspooling de verbindingen in de clientapplicatie beheert. Als je HC-modus niet inschakelt, maakt de driver een klassieke Livy-sessie aan.

Kies tussen HC en classic mode

Gebruik HC-modus wanneer:

  • Een applicatieservice verwerkt gelijktijdige verzoeken die Spark SQL via meerdere JDBC-verbindingen uitvoeren.
  • Een BI- of rapportagetool opent meerdere verbindingen naar dezelfde werkruimte en lakehouse.
  • Parallelle ETL-taken of geplande taken veroorzaken pieken in het aantal JDBC-verbindingen.
  • Verbindingen gebruiken compatibele Spark-configuraties en kunnen serverbeheerde Spark-capaciteit delen.
  • Het verkorten van de opstarttijd van de verbinding en het herhaald provisioneren van Spark-sessies is belangrijk.

Gebruik de klassieke modus wanneer:

  • Je applicatie gebruikt slechts één of een paar langlopende JDBC-verbindingen.
  • Elke verbinding vereist een speciale Spark-sessie voor strikte werklast- of resource-isolatie.
  • Verbindingen vereisen aanzienlijk verschillende Spark-configuraties of Fabric-omgevingen.
  • Het Fabric Livy-eindpunt voor de doelwerkruimte en het lakehouse biedt geen ondersteuning voor HC-modus.

Schakel de modus voor hoge gelijktijdigheid in

HC-modus moet worden ingeschakeld. Als je het weglaat hcEnabled of op false zet, gebruikt de driver het klassieke Livy-sessiepad. Zet hcEnabled op true om een HC-sessie te verkrijgen:

hcEnabled=true;

Vereiste parameters in HC-modus

HC-activatie vereist de volgende geldige identificaties:

Kenmerk Opmerkingen
WorkspaceId Moet een geldige Fabric workspace GUID zijn.
LakehouseId Moet een geldige Fabric lakehouse GUID zijn.

Neem het op SessionTag omdat het server-side matching voor warme sessies beïnvloedt.

Sessiekoppeling

HC-modus garandeert niet dat elke verbinding een bestaande sessie hergebruikt. Voor elk sessie-acquisitieverzoek stuurt de driver het volgende:

  • De SessionTag-waarde.
  • De effectieve Spark-configuratie, inclusief conf.* instellingen en EnvironmentId.

De Fabric Livy-dienst beoordeelt deze waarden en beslist of de verbinding aan een warme sessie wordt gekoppeld of een nieuwe sessie wordt aangemaakt. Om het hergebruik van sessies te verbeteren, gebruik consistente waarden over verbindingen die bedoeld zijn om serverbeheerde Spark-capaciteit te delen.

Schakel HC-modus uit

Je kunt nieuwe HC-sessieverwervingen uitschakelen zonder de driver opnieuw uit te rollen door de HC-verbindingsreeks op false te zetten of door de HC-parameters te verwijderen:

hcEnabled=false;

Noodterugrollen: Voor noodterugrol start je de JVM met -Dcom.microsoft.fabric.jdbc.hc.disable=true. Deze JVM-brede schakelaar dwingt de klassieke modus af, zelfs wanneer een verbindingsreeks hcEnabled=true bevat.

Begrijp het uitvoerende gedrag van HC

  • Het verkrijgen van de HC-sessie wordt geblokkeerd totdat de sessie gereed is of hcAcquireTimeoutSeconds verloopt.
  • Het sluiten van een verbinding terwijl de acquisitie bezig is onderbreekt de acquisitie en activeert een best-effort-opruiming van de HC-sessie.
  • Authenticatie, uitvoering van query's, annuleren, prepared statements, resultaatafhandeling en FabricEnvironmentID verlopen in beide modi via de standaard JDBC-interfaces.

Gebruiksvoorbeelden

Basisverbinding

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();
        }
    }
}

Verbinding in modus voor hoge gelijktijdigheid

Het volgende voorbeeld opent een JDBC-verbinding in HC-modus, voert een query uit en verzicht automatisch op de verbinding:

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=2;" +
             "hcEnabled=true;" +
             "sessionTag=dashboard_queries;" +
             "FabricEnvironmentID=<environment-id>";

try (Connection conn = DriverManager.getConnection(url);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT current_timestamp()")) {
    while (rs.next()) {
        System.out.println(rs.getTimestamp(1));
    }
}

Queries uitvoeren

Eenvoudige query

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);
        }
    }
}

Query met filter

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);
        }
    }
}

Query met limiet

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();
        }
    }
}

Werken met resultatensets

Resultsets doorlopen

public void navigateResultSet(Connection conn) throws SQLException {
    String sql = "SELECT id, name, amount FROM orders";
    
    try (Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {

        while (rs.next()) {
            System.out.printf(
                "Order %d: %s, %.2f%n",
                rs.getInt("id"),
                rs.getString("name"),
                rs.getDouble("amount"));
        }
    }
}

Resultsets zijn alleen voorwaarts en schrijfbeveiligd. De driver ondersteunt geen methoden zoals first(), last(), en absolute().

Grote resultatensets verwerken

De driver pagineert resultaten op basis van de responsgrootte. Configureer LivyStatementPageSize in de JDBC-URL om de gevraagde paginagrootte in bytes in te stellen. De Statement.setFetchSize() methode regelt het ophalen of geheugengebruik niet.

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=2;LivyStatementPageSize=1048576
public void processLargeResultSet(Connection conn) throws SQLException {
    String sql = "SELECT * FROM large_table";
    
    try (Statement stmt = conn.createStatement()) {
        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
}

Voorbereide instructies gebruiken

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);
            }
        }
    }
}

Batchverwerkingen

De driver ondersteunt geen JDBC-transacties. Batchuitvoering is niet-transactioneel en kan gedeeltelijk slagen. Een latere mislukking draait eerdere succesvolle verklaringen niet terug.

public void executeBatchInsert(Connection conn) throws SQLException {
    String sql = "INSERT INTO logs (timestamp, level, message) VALUES (?, ?, ?)";
    int pendingStatements = 0;
    
    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        // 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();
            pendingStatements++;
            
            // Execute batch every 100 statements
            if ((i + 1) % 100 == 0) {
                pstmt.executeBatch();
                pstmt.clearBatch();
                pendingStatements = 0;
            }
        }
        
        if (pendingStatements > 0) {
            pstmt.executeBatch();
        }
        
        System.out.println("Batch insert completed successfully");
    }
}

Kies een verbindingseigenaar

Kies één onderdeel om de verbindingslevenscyclus te bezitten. Plaats niet de ene verbindingspool in een andere.

Gebruiksmodel Ingangspunt Zwembadeigenaar Een geleend Connection sluiten Eigenaar van de afsluiting
Onmiddellijk DriverManager, of LivyDriverLivyDataSource Geen Sluit fysiek de afzonderlijke Livy-verbinding en sessie. De applicatie sluit elke verbinding. Een directe LivyDataSource heeft geen aparte gesloten levenscyclus.
Externe HikariCP HikariDataSource ondersteund door een JDBC-URL of LivyDataSource Alleen HikariCP Geeft de Hikari-proxyverbinding terug aan HikariCP. De applicatie sluit zijn behoudene HikariDataSource.
Expliciet ingebouwd zwembad LivyBuiltInPooledDataSource Eén LivyConnectionPool die alleen wordt aangemaakt wanneer nodig voor elke geconfigureerde databron-generatie Stopt het logische huurcontract en gebruikt de fysieke sessie pas opnieuw na een veilige schoonmaak. De applicatie sluit zijn behouden ingebouwde databron.
Standaard pooling-SPI LivyConnectionPoolDataSource maakt objecten aan PooledConnection voor een poolmanager in het middenniveau De poolmanager van het middenniveau, niet de fabriek Sluit de logische handle en waarschuwt de manager synchroon na het opruimen. De manager belt PooledConnection.close() om elke fysieke verbinding te vernietigen.

ConnectionPoolEnabled is standaard ingesteld op false in zowel de drivercode als de meegeleverde eigenschappen. Het is geen inschakeloptie voor de huidige toegangspunten. Gebruik LivyBuiltInPooledDataSource wanneer de driver eigenaar moet zijn van de pool, of configureer een externe pool zoals HikariCP. De andere toegangspunten creëren directe, niet-pool-eigenaar verbindingen.

Verbindingspooling met HikariCP

HikariCP kan verbindingen maken vanuit zowel LivyDataSource als de JDBC-URL, via LivyDriver. Maak één HikariCP-instantie aan, hergebruik deze voor de applicatielevensduur en gebruik slechts één verbindingspool in elke configuratie.

Maven-afhankelijkheid

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version>
</dependency>

Gebruik LivyDataSource

LivyDataSource Maakt onafhankelijke fysieke verbindingen en bezit geen verbindingspool of een aparte hechte levenscyclus. Geef het rechtstreeks aan HikariCP zodat HikariCP de enige zwembadeigenaar is:

import com.microsoft.spark.livy.jdbc.LivyDataSource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public final class ConnectionPoolExample implements AutoCloseable {
    private final HikariDataSource hikariDataSource;

    public ConnectionPoolExample(String url) {
        LivyDataSource configuredDataSource = new LivyDataSource();
        configuredDataSource.setUrl(url);

        HikariConfig config = new HikariConfig();
        config.setDataSource(configuredDataSource);
        config.setMaximumPoolSize(2);
        config.setMinimumIdle(0);
        config.setConnectionTimeout(900000);     // Wait up to 15 minutes for a connection
        config.setInitializationFailTimeout(-1); // Connect on demand
        config.setIdleTimeout(600000);           // 10 minutes
        config.setMaxLifetime(1800000);          // 30 minutes
        config.setPoolName("FabricSparkPool");

        hikariDataSource = new HikariDataSource(config);
    }

    public Connection getConnection() throws SQLException {
        return hikariDataSource.getConnection();
    }

    @Override
    public void close() {
        hikariDataSource.close();
    }

    public static void main(String[] args) throws SQLException {
        String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
                     "FabricWorkspaceID=<workspace-id>;" +
                     "FabricLakehouseID=<lakehouse-id>;" +
                     "AuthFlow=AZURE_CLI;" +
                     "hcEnabled=true;" +
                     "sessionTag=pooled_app;" +
                     "hcAcquireTimeoutSeconds=600";

        try (ConnectionPoolExample pool = new ConnectionPoolExample(url);
             Connection conn = pool.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT 'Pooled connection!' as message")) {

            if (rs.next()) {
                System.out.println(rs.getString("message"));
            }
        }
    }
}

Het voorbeeld schakelt HC-modus in de JDBC-URL in. HikariCP beheert client-side verbindingen, terwijl HC-modus gedeelde Spark-sessies in Fabric beheert. Verwijder hcEnabled en sessionTag als de applicatie klassieke sessies vereist.

Gebruik direct LivyDriver

Configureer de JDBC-URL en driverklasse zodat HikariCP fysieke verbindingen maakt via LivyDriver. Het expliciet opgeven van de driverklasse is optioneel wanneer automatische detectie van de JDBC-serviceprovider beschikbaar is. Deze configuratie instantieert LivyDataSourceniet , dus de ingebouwde pool is niet betrokken:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public final class DriverConnectionPoolExample {
    public static HikariDataSource createPool(String url) {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName("com.microsoft.spark.livy.jdbc.LivyDriver");
        config.setJdbcUrl(url);

        // Keep pool sizes small: each classic-mode physical connection owns a Livy session.
        config.setMaximumPoolSize(2);
        config.setMinimumIdle(0);
        config.setConnectionTimeout(900000);     // Wait up to 15 minutes to borrow a connection
        config.setInitializationFailTimeout(-1); // Skip startup validation; connect on demand
        config.setIdleTimeout(600000);           // 10 minutes
        config.setMaxLifetime(1800000);          // 30 minutes
        config.setPoolName("FabricSparkDriverPool");

        return new HikariDataSource(config);
    }

    public static void main(String[] args) throws SQLException {
        String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
                     "FabricWorkspaceID=<workspace-id>;" +
                     "FabricLakehouseID=<lakehouse-id>;" +
                     "AuthFlow=AZURE_CLI;" +            // Uses the DefaultAzureCredential chain
                     "hcEnabled=true;" +
                     "sessionTag=pooled_app;" +
                     "hcAcquireTimeoutSeconds=600";  // Poll up to 10 minutes for HC readiness

        // Reuse this pool for the application lifetime; main closes it at process exit.
        try (HikariDataSource pool = createPool(url);
             Connection conn = pool.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT 'Pooled LivyDriver connection!' as message")) {

            if (rs.next()) {
                System.out.println(rs.getString("message"));
            }
        }
    }
}

Gebruik de volgende richtlijnen bij het configureren van de pool:

Instelling of gedrag Guidance
Eigendom van het zwembad LivyDataSource is alleen rechtstreeks. Wanneer je het levert aan HikariCP, is HikariCP eigenaar van het zwembad. Gebruik LivyBuiltInPooledDataSource in plaats daarvan wanneer de chauffeur eigenaar zou moeten zijn van de pool.
Poolgrootte Begin met een kleine pool en vergroot deze pas nadat je de gelijktijdigheid van de werklast en het capaciteitsgebruik hebt gemeten. In de klassieke modus heeft elke fysieke verbinding een Livy-sessie. In HC-modus kunnen verbindingen serverbeheerde Spark-capaciteit delen.
connectionTimeout Bepaalt hoe lang een beller wacht om een verbinding te lenen, maar annuleert een verbindingspoging die al bezig is niet. Voor HC-URL's, ondersteun hcAcquireTimeoutSeconds; ondersteun voor de klassieke modus LivySessionTimeoutSeconds, authenticatie, HTTP-herhalingen en validatie. HikariCP drukt deze instelling uit in milliseconden.
initializationFailTimeout Een negatieve waarde slaat de opstartverbinding en validatiepoging over. Connectiviteitsstoringen komen dan naar voren wanneer de applicatie voor het eerst een verbinding aanvraagt. Gebruik een positieve waarde als de applicatie de connectiviteit tijdens het opstarten moet verifiëren.
Verificatie van de verbinding HikariCP gebruikt Connection.isValid(). De effectieve duur wordt bepaald door de HTTP-timeout en retry/backoff-instellingen van de driver, niet door die validationTimeoutvan HikariCP. Configureer geen verbindingstestquery, want die vervangt de lichtere validatiecheck door een Spark-instructie.

Voor de volledige lijst van HikariCP-configuratieopties, zie:

Gegevenstypemapping

Het stuurprogramma wijst Spark SQL-gegevenstypen toe aan JDBC SQL-typen en Java-typen:

Spark SQL-type JDBC SQL-type Java type Opmerkingen
BOOLEAN BOOLEAN Boolean
BYTE TINYINT Byte
SHORT SMALLINT Short
INT INTEGER Integer
LONG BIGINT Long
FLOAT FLOAT Float
DOUBLE DOUBLE Double
DECIMAL DECIMAL BigDecimal Precisie en schaal behouden
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 ARRAY String Opgehaald als JSON-tekst; metadatatype garandeert geen volledige java.sql.Array accessor-ondersteuning
MAP JAVA_OBJECT String Geraadpleegd als JSON-tekst
STRUCT STRUCT String Opgehaald als JSON-tekst; metadatatype garandeert geen volledige java.sql.Struct accessor-ondersteuning