Microsoft JDBC-driver for Microsoft Fabric Data Engineering

JDBC (Java Database Connectivity) er en mye brukt standard som gjør det mulig for klientapplikasjoner å koble til og arbeide med data fra databaser og big data-plattformer.

Microsoft JDBC Driver for Fabric Data Engineering lar deg koble til, spørre og administrere Spark-arbeidsbelastninger i Fabric med påliteligheten og enkelheten til JDBC-standarden. Bygget på Fabric sine Livy-API-er, gir driveren sikker og fleksibel Spark SQL-tilkobling til dine Java-applikasjoner og BI-verktøy. Denne integrasjonen lar deg sende inn og kjøre Spark-kode direkte uten å måtte lage separate notatbok- eller Spark-jobbdefinisjonselementer. Driveren er kompatibel med populære JDBC-klienter som DbVisualizer og DBeaver, samt BI-verktøy som støtter JDBC-tilkobling, inkludert Tableau.

Viktige funksjoner

  • JDBC 4.2 API-er: Implementerer JDBC 4.2 API-er for Spark SQL-tilkobling, med Spark- og Livy-begrensninger som ingen JDBC-transaksjoner og fremoverbeskyttet, skrivebeskyttet resultatsett
  • Microsoft Entra ID-autentisering: Flere autentiseringsflyter inkludert interaktiv, klientlegitimasjon og sertifikatbasert autentisering
  • Høysamtidige økter: Opt-in Fabric-sesjonsdeling for samtidige arbeidsbelastninger
  • Eksplisitt tilkoblingspooling: Velg HikariCP, en standard poolmanager, eller LivyBuiltInPooledDataSource; direkte inngangspunkter pooler aldri pool
  • Spark SQL native spørringsstøtte: Direkte kjøring av Spark SQL-setninger uten oversettelse
  • Omfattende støtte for datatyper: Støtte for alle Spark SQL-datatyper, inkludert komplekse typer (ARRAY, MAP, STRUCT)
  • Asynkron resultatsett-prefetching: Bakgrunnsdatainnlasting for bedre ytelse
  • Sikringsmønster: Beskyttelse mot kaskaderende feil med automatisk omprøving
  • Auto-retilkobling: Transparent sesjonsgjenoppretting ved tilkoblingsfeil
  • Avansert retry-logikk: Retry med eksponentiell backoff og sesjonsgjenoppretting for bedre motstandskraft
  • Proxy-støtte: HTTP- og SOCKS-proxykonfigurasjon for bedriftsmiljøer

Forutsetning

Før du bruker Microsoft JDBC Driver for Fabric Data Engineering, sørg for at du har:

  • Java Development Kit (JDK): Java 11, 17 og 21 (Java 21 anbefalt)
  • Fabric Access: Tilgang til et Fabric-arbeidsområde
  • Microsoft Entra ID legitimasjon: Passende legitimasjon for autentisering
  • Workspace- og Lakehouse-ID-er: GUID-identifikatorer for ditt Fabric workspace og lakehouse

Nedlasting og installasjon

Microsoft JDBC Driver for Fabric Data Engineering versjon 2.0.1 støtter Java 11, 17 og 21. Bruk den nyeste tilgjengelige versjonen.

  1. Last ned enten zip- eller tar-filen fra lenkene ovenfor.
  2. Pakk ut den nedlastede filen for å få tilgang til driverens JAR-filer.
  3. Velg JAR-filen som matcher din JRE-versjon:
    • For Java 11:ms-sparksql-jdbc-2.0.1.jre11.jar
    • For Java 17:ms-sparksql-jdbc-2.0.1.jre17.jar
    • For Java 21:ms-sparksql-jdbc-2.0.1.jre21.jar
  4. Legg til den valgte JAR-filen i applikasjonens klassesti.
  5. For JDBC-klienter, konfigurer JDBC-driverklassen: com.microsoft.spark.livy.jdbc.LivyDriver

Eksempel på Quick Start

Dette eksempelet demonstrerer hvordan man kobler til Fabric og kjører en spørring ved å bruke Microsoft JDBC Driver for Fabric Data Engineering. Før du kjører denne koden, sørg for at du oppfyller forutsetningene og installerer driveren. Ved å bruke AuthFlow=2, bruker DefaultAzureCredentialdriveren . For å bruke Azure CLI som kilde til legitimasjon, installer Azure CLI og kjør az login.

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

Tilkoblingsstrengformat

Grunnleggende tilkoblingsstreng

Microsoft JDBC Driver for Fabric Data Engineering bruker følgende tilkoblingsstreng-format:

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

Tilkoblingsstrengkomponenter

Komponent Beskrivelse Eksempel
Protokoll JDBC URL-protokollidentifikator jdbc:fabricspark://
Vertsnavn Fabric-endepunktets vertsnavn api.fabric.microsoft.com
Havn Valgfritt portnummer (standard: 443) :443
Parametere Semikolon-separert nøkkel=verdipar FabricWorkspaceID=<guid>

Eksempler på tilkoblingsstrenger

Grunnleggende tilkobling (interaktiv nettleserbasert autentisering)

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

Med Spark Resource Configuration

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

Med Spark Session-egenskaper

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

Med høy samtidighetsmodus

High-concurrency (HC)-modus er tilgjengelig for Microsoft Fabric-tilkoblinger i driverversjon 1.1.0 og nyere. Legg til hcEnabled=true for å få en HC-økt i stedet for en klassisk Livy-økt:

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

Du kan valgfritt identifisere arbeidsmengden med en session-tag og velge et Fabric-miljø:

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

HC-modus er frivillig. Hvis hcEnabled er utelatt eller satt til false, bruker driveren den klassiske Livy-sesjonsstien.

Se seksjonen omHigh-Concurrency (HC) Mode for fullstendig konfigurasjonsveiledning.


Autentisering

Microsoft JDBC Driver for Fabric Data Engineering støtter flere autentiseringsmetoder gjennom Microsoft Entra ID (tidligere Azure Active Directory). Autentisering konfigureres ved å bruke parameteren AuthFlow i tilkoblingsstrengen.

Autentiseringsflyter

AuthFlow Godkjenningsmetode Bruk sak
1 Interaktiv nettleser Interaktiv brukerautentisering ved bruk av OAuth 2.0
2 Default Azure credential chain Utvikling og administrert applikasjonsautentisering; Azure CLI kan være én kilde til legitimasjon
3 Klienthemmelige legitimasjoner (tjenesteleder) Automatisert/tjeneste-til-tjeneste-autentisering
4 Klientsertifikat Sertifikatbasert autentisering av tjenestehovedpersoner
5 Tilgangstoken Forhåndsanskaffet bærertilgangstoken

Interaktiv nettleserautentisering

Best for: Utvikling og interaktive applikasjoner

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

Connection conn = DriverManager.getConnection(url);

Parametere:

  • AuthFlow=1: Spesifiserer interaktiv nettleserautentisering

Oppførsel:

  • Åpner et nettleservindu for brukerautentisering
  • Cacher legitimasjon for påfølgende tilkoblinger til de utløper
  • Egnet for enkeltbrukerapplikasjoner

Klientlegitimasjon eller autentisering av tjenestehovedpersoner

Best for: Automatiserte tjenester og bakgrunnsjobber

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

Nødvendige parametere:

  • AuthFlow=3: Spesifiserer autentisering av klientlegitimasjon
  • AuthClientID: Applikasjons-(klient-)ID fra Microsoft Entra-ID
  • AuthClientSecret: Klienthemmelighet fra Microsoft Entra-ID
  • AuthTenantID: Microsoft Entra leietaker-ID

Beste praksis:

  • Lagre hemmeligheter sikkert (Azure Key Vault, miljøvariabler)
  • Bruk administrerte identiteter når det er mulig
  • Roter hemmeligheter regelmessig

Certificate-Based Autentisering

Best for: Bedriftsapplikasjoner som krever sertifikatbasert autentisering

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

Nødvendige parametere:

  • AuthFlow=4: Spesifiserer sertifikatbasert autentisering
  • AuthClientID: Applikasjons-ID (klient-ID)
  • AuthCertificatePath: Bane til en PEM-sertifikatfil
  • AuthCertificatePassword: Sertifikatpassord
  • AuthTenantID: Microsoft Entra leietaker-ID

Autentisering av tilgangstoken

Best for: Tilpassede autentiseringsscenarier

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

Autentiseringscache

Driveren cacher autentiseringstokens og oppdaterer dem basert på tokenets utløp. Parsed AuthEnableCaching og AuthCacheTTLMS egenskaper styrer ikke denne oppførselen i versjon 2.0.0.

Konfigurasjonsparametere

Obligatoriske parametere

Disse parameterne må være til stede i hver tilkoblingsstreng:

Parameter Type Beskrivelse Eksempel
FabricWorkspaceID UUID Identifikator for stoffarbeidsområde <workspace-id>
FabricLakehouseID UUID Fabric lakehouse-identifikator <lakehouse-id>
AuthFlow Integer Autentiseringsflyttype (1-5) 2

Valgfrie parametere

API-versjonskonfigurasjon

Parameter Type Default Beskrivelse
FabricVersion Streng v1 Fabric API-versjon
LivyApiVersion Streng 2023-12-01 Livy API-versjon

Miljøkonfigurasjon

Parameter Type Default Beskrivelse
FabricEnvironmentID UUID Ingen Fabric-miljøidentifikator for referanse til miljøelement for Spark-sesjon

Høy-samtidig-sesjonskonfigurasjon

Satt hcEnabled=true til å bruke HC-modus. De gjenværende HC-egenskapene brukes kun når HC-modus er aktivert.

Parameter Type Default Beskrivelse
hcEnabled boolsk false Bruker en Fabric høy-samtidig-sesjon.
sessionTag Streng Ingen Valgfri serverside sesjonstagg. Bruk 1 til 64 bokstaver, sifre, understreker eller bindestreker.
hcAcquireTimeoutSeconds Integer 300 Maksimal tid til å vente på at HC-økten skal bli klar. Gyldige verdier varierer fra 120 til 3 600 sekunder.
hcAcquirePollingIntervalMs Integer 1000 Intervall mellom statussjekker for HC-økter. Aksepterte verdier varierer fra 50 til 30 000 millisekunder og klemmes ved kjøring til 100 til 5 000 millisekunder.

Eksempel:

hcEnabled=true;sessionTag=interactive_reporting;hcAcquireTimeoutSeconds=600;hcAcquirePollingIntervalMs=2000;FabricEnvironmentID=<environment-id>
  • FabricEnvironmentID gjelder både HC- og klassiske økter
  • EnvironmentID er også akseptert som et kryssdriver-alias. Eiendomsnavn er ikke små og små bokstaver.

Important

Bruk sessionTag kun for ikke-sensitive operasjonsetiketter. Ikke inkluder hemmeligheter, tilgangstokens, personopplysninger, kundeidentifikatorer eller spørringstekst.

Se seksjonen omHigh-Concurrency (HC) Mode for fullstendig konfigurasjonsveiledning.

Spark-konfigurasjon

Sesjonsressurskonfigurasjon

Konfigurer Spark-sesjonsressurser for optimal ytelse:

Parameter Type Default Beskrivelse Eksempel
DriverCores Integer Spark-standard Antall CPU-kjerner for driver 4
DriverMemory Streng Spark-standard Minneallokering for driver 4g
ExecutorCores Integer Spark-standard Antall CPU-kjerner per utøver 4
ExecutorMemory Streng Spark-standard Minneallokering per utøver 8g
NumExecutors Integer Spark-standard Antall eksekutorer 2
SessionName Streng Automatisk generert Egendefinert sesjonsnavn MySparkSession

Eksempel:

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

Egendefinerte Spark-sesjonsegenskaper

Enhver parameter med prefikset spark. brukes automatisk på Spark-økten:

Eksempler på Spark-konfigurasjoner:

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

Innebygd utførelsesmotor (NEE):

spark.nee.enabled=true

Fullstendig eksempel:

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

Konfigurer driverens HTTP-transportforbindelser for optimal nettverksytelse. Disse innstillingene konfigurerer eller administrerer ikke JDBC-tilkoblingspooling:

Parameter Type Default Beskrivelse
HttpMaxTotalConnections Integer 100 Maksimalt antall HTTP-tilkoblinger
HttpMaxConnectionsPerRoute Integer 20 Maksimalt antall forbindelser per rute
HttpConnectionTimeoutInSeconds Integer 30 Tidsavbrudd for tilkobling
HttpSocketTimeoutInSeconds Integer 60 Sokkellesetidsavbrudd
HttpReadTimeoutInSeconds Integer 60 HTTP-lesetidsavbrudd
HttpConnectionRequestTimeoutSeconds Integer 10 Timeout for tilkoblingsforespørsel fra poolen
HttpEnableKeepAlive boolsk sann Aktiver HTTP keep-alive
HttpKeepAliveTimeoutSeconds Integer 60 Hold i live-timeout
HttpFollowRedirects boolsk sann Følg HTTP-omdirigeringer
HttpUseAsyncIO boolsk sann Bruk asynkron HTTP I/O

Eksempel:

HttpMaxTotalConnections=200;HttpMaxConnectionsPerRoute=100;HttpConnectionTimeoutInSeconds=60

Proxy-konfigurasjon

Konfigurer HTTP- og SOCKS-proxyinnstillinger for bedriftsmiljøer:

Parameter Type Default Beskrivelse
UseProxy boolsk falsk Aktiver proxy
ProxyTransport Streng http Proxy-transporttype (http/tcp)
ProxyHost Streng Ingen Proxy-vertsnavn
ProxyPort Integer Ingen Proxy-port
ProxyAuthEnabled boolsk falsk Aktiver proxy-autentisering
ProxyUsername Streng Ingen Proxy-autentiseringsbrukernavn
ProxyPassword Streng Ingen Proxy-autentiseringspassord
ProxyAuthScheme Streng basic Auth-skjema (basic/digest/ntlm)
ProxySocksVersion Integer 5 SOCKS-versjonen (4/5)

Eksempel på HTTP-proxy:

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

SOCKS-proxy-eksempel:

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

Konfigurasjon av logging

Parameter Type Default Beskrivelse
LogLevel Streng WARN Loggingsnivå: SPOR, FEILSØK, INFO, ADVARSEL, FEIL

Eksempel:

LogLevel=DEBUG

Standard loggplassering:

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

Egendefinert loggkonfigurasjon: Bruk en egendefinert log4j2.xml fil eller logback.xml fil på klassestien din.

Høy-samtidighet (HC) modus

High-concurrency (HC)-modus er designet for JDBC-applikasjoner som åpner flere tilkoblinger til samme Fabric-arbeidsområde og lakehouse. I stedet for å opprette en egen klassisk Spark-økt for hver tilkobling, betjener Fabric disse forbindelsene med delt, serverstyrt Spark-kapasitet.

HC-modus kan redusere oppstartstiden for tilkoblingen, unngå gjentatt Spark-sesjonsoppsetting, og bruke tilgjengelig kapasitet mer effektivt for samtidige arbeidsbelastninger. Hver JDBC-tilkobling fortsetter å utføre setninger gjennom sin tildelte kontekst i HC-økten.

HC-modus er opt-in og utfyller JDBC-tilkoblingspooling. HC-modus håndterer Fabric Spark-økter på serveren, mens JDBC-tilkoblingspooling håndterer tilkoblinger i klientapplikasjonen. Hvis du ikke aktiverer HC-modus, lager driveren en klassisk Livy-økt.

Velg mellom HC og klassisk modus

Bruk HC-modus når:

  • En applikasjonstjeneste håndterer samtidige forespørsler som kjører Spark SQL gjennom flere JDBC-tilkoblinger.
  • Et BI- eller rapporteringsverktøy åpner flere tilkoblinger til samme arbeidsområde og lakehouse.
  • Parallelle ETL-oppgaver eller planlagte jobber skaper utbrudd av JDBC-tilkoblinger.
  • Tilkoblinger bruker kompatible Spark-konfigurasjoner og kan dele serveradministrert Spark-kapasitet.
  • Å redusere oppstartstid for tilkoblingen og gjentatt Spark-sesjonsoppsetting er viktig.

Bruk klassisk modus når:

  • Applikasjonen din bruker bare én eller noen få langvarige JDBC-tilkoblinger.
  • Hver tilkobling krever en dedikert Spark-økt for streng arbeidsmengde eller ressursisolasjon.
  • Tilkoblinger krever vesentlig forskjellige Spark-konfigurasjoner eller Fabric-miljøer.
  • Fabric Livy-endepunktet for målarbeidsområdet og lakehouse støtter ikke HC-modus.

Aktiver høy-samtidighetsmodus

HC-modus er frivillig. Hvis du utelater hcEnabled eller setter den til falsk, bruker driveren den klassiske Livy-sesjonsruten. Sett hcEnabled til true for å få en HC-økt:

hcEnabled=true;

Nødvendige parametere i HC-modus

HC-aktivering krever følgende gyldige identifikatorer:

Parameter Notater
WorkspaceId Må være en gyldig Fabric workspace GUID.
LakehouseId Må være en gyldig Fabric lakehouse GUID.

Inkluder SessionTag fordi det påvirker server-side matching for varme økter.

Sesjonsmatching

HC-modus garanterer ikke at hver tilkobling gjenbruker en eksisterende økt. For hver forespørsel om sesjonsinnhenting sender driveren:

  • Verdien SessionTag .
  • Den effektive Spark-konfigurasjonen, inkludert conf.* innstillinger og EnvironmentId.

Fabric Livy-tjenesten vurderer disse verdiene og bestemmer om forbindelsen skal knyttes til en varm sesjon eller opprettes en ny. For å forbedre gjenbruk av sesjoner, bruk konsistente verdier på tvers av tilkoblinger som er ment å dele serveradministrert Spark-kapasitet.

Deaktiver HC-modus

Du kan deaktivere nye HC-sesjonsinnhentinger uten å redeployere driveren ved å sette HC-tilkoblingsstreng til false eller ved å fjerne HC-parameterne:

hcEnabled=false;

Nødtilbakerullinger: For nødtilbakerulling, start JVM med -Dcom.microsoft.fabric.jdbc.hc.disable=true. Denne JVM-omfattende bryteren tvinger klassisk modus selv når en tilkoblingsstreng inneholder hcEnabled=true.

Forstå HC sin kjøretidsoppførsel

  • HC-sesjonsinnhentingsblokker til økten er klar eller hcAcquireTimeoutSeconds utløper.
  • Å lukke en tilkobling mens anskaffelsen pågår, avbryter anskaffelsen og utløser opprydding av beste innsats i HC-økten.
  • Autentisering, spørringsutførelse, kansellering, forberedte setninger, resultathåndtering og FabricEnvironmentID arbeid gjennom standard JDBC-grensesnitt i begge moduser.

Brukseksempler

Grunnleggende tilkobling

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

Høy-samtidighetsmodus-tilkobling

Følgende eksempel åpner en JDBC-tilkobling i HC-modus, kjører en spørring, og frigjør tilkoblingen automatisk:

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

Utførelse av forespørsler

Enkel spørring

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

Søk med 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);
        }
    }
}

Søk med grense

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

Arbeid med resultatsett

Traverseringsresultatsett

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

Resultatsettene er kun fremover- og skrivebeskyttet. Driveren støtter ikke metoder som first(), last(), og absolute().

Behandling av store resultatsett

Driverens paginerer resultatene etter svarstørrelse. Konfigurer LivyStatementPageSize JDBC-URL-en til å sette den ønskede sidestørrelsen i bytes. Metoden Statement.setFetchSize() styrer ikke henting eller minnebruk.

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
}

Bruk av forberedte utsagn

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

Batchoperasjoner

Driveren støtter ikke JDBC-transaksjoner. Batch-utførelse er ikke-transaksjonell og kan delvis lykkes. En senere feil ruller ikke tilbake tidligere vellykkede uttalelser.

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

Velg en tilkoblingseier

Velg én komponent for å eie forbindelsens livssyklus. Ikke plasser én tilkoblingspool i en annen.

Bruksmodell Inngangspunkt Bassengeier Å lukke en lånt Connection Nedstengt eier
Direkte DriverManager, LivyDrivereller LivyDataSource Ingen Fysisk avslutter sin uavhengige Livy-forbindelse og sesjon. Applikasjonen lukker alle tilkoblinger. En direkte LivyDataSource har ingen separat nær livssyklus.
Ekstern HikariCP HikariDataSource støttet av en JDBC-URL eller LivyDataSource Kun HikariCP Returnerer Hikari-proxy-forbindelsen til HikariCP. Applikasjonen avslutter sin retained HikariDataSource.
Eksplisitt innebygd pool LivyBuiltInPooledDataSource En lat laget LivyConnectionPool for hver konfigurert datakildegenerering Pensjonerer den logiske leiekontrakten og gjenbruker den fysiske økten kun etter sikker opprydding. Applikasjonen lukker sin innebygde datakilde.
Standard pooling SPI LivyConnectionPoolDataSource Lager PooledConnection objekter for en poolmanager på mellomnivå Mellomlederen for bassenget, ikke fabrikken Lukker det logiske håndtaket og varsler samtidig lederen etter opprydding. Lederen ringer PooledConnection.close() for å ødelegge hver fysisk tilkobling.

ConnectionPoolEnabled som standard både false i driverkoden og de sendte egenskapene. Det er ikke en opt-in-bryter for de nåværende inngangspunktene. Bruk LivyBuiltInPooledDataSource når driveren skal eie poolen, eller konfigurer en ekstern pool som HikariCP. De andre inngangspunktene skaper direkte, ikke-pool-eiere forbindelser.

Tilkoblingspooling med HikariCP

HikariCP kan opprette forbindelser fra enten LivyDataSource eller JDBC-URL-en gjennom LivyDriver. Opprett én HikariCP-instans, gjenbruk den for applikasjonens levetid, og bruk kun én tilkoblingspool i hver konfigurasjon.

Maven-avhengighet

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

Bruk LivyDataSource

LivyDataSource Skaper uavhengige fysiske forbindelser og eier ikke en tilkoblingspool eller en separat nær livssyklus. Gi det direkte til HikariCP slik at HikariCP er den eneste bassengeieren:

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

Eksempelet aktiverer HC-modus i JDBC-URL-en. HikariCP håndterer klienttilkoblinger, mens HC-modus håndterer delte Spark-økter i Fabric. Fjern hcEnabled og sessionTag hvis applikasjonen krever klassiske økter.

Bruk LivyDriver direkte

Konfigurer JDBC-URL-en og driverklassen slik at HikariCP oppretter fysiske forbindelser gjennom LivyDriver. Å sette driver-klassen eksplisitt er valgfritt når JDBC-tjenesteleverandørens auto-discovery er tilgjengelig. Denne konfigurasjonen instansierer LivyDataSourceikke , så dens innebygde pool er ikke involvert:

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

Bruk følgende veiledning når du konfigurerer poolen:

Setting eller atferd Veiledning
Bassengeierskap LivyDataSource er kun direkte. Når du leverer det til HikariCP, eier HikariCP bassenget. Bruk LivyBuiltInPooledDataSource i stedet når sjåføren skal eie bassenget.
Bassengstørrelse Start med en liten pool og øk den først etter å ha målt arbeidsmengdens samtidighet og kapasitetsbruk. I klassisk modus eier hver fysisk forbindelse en Livy-økt. I HC-modus kan tilkoblinger dele serveradministrert Spark-kapasitet.
connectionTimeout Styrer hvor lenge en innringer venter på å låne en tilkobling, men avbryter ikke et tilkoblingsforsøk som allerede pågår. For HC-URL-er, tillat hcAcquireTimeoutSeconds; for klassisk modus, tillat LivySessionTimeoutSeconds, autentisering, HTTP-forsøk og validering. HikariCP uttrykker denne innstillingen i millisekunder.
initializationFailTimeout En negativ verdi hopper over oppstartstilkoblingen og valideringsforsøket. Tilkoblingsfeil dukker opp når applikasjonen først ber om en tilkobling. Bruk en positiv verdi hvis applikasjonen må verifisere tilkoblingen under oppstart.
Bekreftelse av tilkobling HikariCP bruker Connection.isValid(). Den effektive varigheten styres av driverens HTTP-timeout og retry/backoff-innstillinger, ikke HikariCPs validationTimeout. Ikke konfigurer en tilkoblingstestspørring, fordi den erstatter den lettere valideringssjekken med en Spark-setning.

For den komplette listen over HikariCP-konfigurasjonsalternativer, se:

Datatypekartlegging

Driveren tilordner Spark SQL-datatyper til JDBC SQL-typer og Java-typer:

Spark SQL Type JDBC SQL Type Java-type Notater
BOOLEAN BOOLEAN Boolean
BYTE TINYINT Byte
SHORT SMALLINT Short
INT INTEGER Integer
LONG BIGINT Long
FLOAT FLOAT Float
DOUBLE DOUBLE Double
DECIMAL DECIMAL BigDecimal Presisjon og skala bevart
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 Hentet som JSON-tekst; metadatatypen garanterer ikke full java.sql.Array støtte for accessorer
MAP JAVA_OBJECT String Hentet som JSON-tekst
STRUCT STRUCT String Hentet som JSON-tekst; metadatatypen garanterer ikke full java.sql.Struct støtte for accessorer