Microsoft JDBC-driver til Microsoft Fabric Data Engineering

JDBC (Java Database Connectivity) er en bredt anvendt standard, der gør det muligt for klientapplikationer at forbinde til og arbejde med data fra databaser og big data-platforme.

Microsoft JDBC Driver for Fabric Data Engineering lader dig forbinde, forespørge og administrere Spark-arbejdsbelastninger i Fabric med pålideligheden og enkelheden fra JDBC-standarden. Drevet af Fabric's Livy API'er leverer sikker og fleksibel Spark SQL-forbindelse til dine Java-applikationer og BI-værktøjer. Denne integration gør det muligt at indsende og køre Spark-kode direkte uden at skulle oprette separate notebook- eller Spark-jobdefinitionselementer. Driveren er kompatibel med populære JDBC-klienter som DbVisualizer og DBeaver samt BI-værktøjer, der understøtter JDBC-forbindelse, herunder Tableau.

Vigtige funktioner

  • JDBC 4.2 API'er: Implementerer JDBC 4.2 API'er til Spark SQL-forbindelse, med Spark- og Livy-begrænsninger såsom ingen JDBC-transaktioner og fremadrettede, læsebeskyttede resultatsæt
  • Microsoft Entra ID-autentificering: Flere autentificeringsflows, herunder interaktiv, klientoplysninger og certifikatbaseret autentificering
  • Høj-samtidighedssessioner: Opt-in Fabric-sessionsdeling for samtidige arbejdsbelastninger
  • Eksplicit forbindelsespooling: Vælg HikariCP, en standard poolmanager, eller LivyBuiltInPooledDataSource; direkte adgangspunkter pooler aldrig
  • Spark SQL native forespørgselsunderstøttelse: Direkte udførelse af Spark SQL-sætninger uden oversættelse
  • Omfattende understøttelse af datatyper: Understøttelse af alle Spark SQL-datatyper inklusive komplekse typer (ARRAY, MAP, STRUCT)
  • Asynkron resultatmængde forudhentning: Indlæsning af baggrundsdata for forbedret ydeevne
  • Circuit Breaker-mønster: Beskyttelse mod kaskaderede fejl med automatisk genprøvning
  • Auto-genforbindelse: Gennemsigtig sessionsgendannelse ved forbindelsesfejl
  • Avanceret Retry-logik: Genprøv med eksponentiel backoff og sessionsgenopretning for forbedret modstandsdygtighed
  • Proxy-understøttelse: HTTP- og SOCKS-proxykonfiguration til virksomhedsmiljøer

Forudsætninger

Før du bruger Microsoft JDBC Driver til Fabric Data Engineering, skal du sikre dig, at du har:

  • Java Development Kit (JDK): Java 11, 17 og 21 (Java 21 anbefalet)
  • Fabric Access: Adgang til et Fabric-arbejdsområde
  • Microsoft Entra ID legitimationsoplysninger: Passende legitimationsoplysninger til autentificering
  • Workspace og Lakehouse ID'er: GUID-identifikatorer for dit Fabric workspace og lakehouse

Download og installation

Microsoft JDBC Driver for Fabric Data Engineering version 2.0.1 understøtter Java 11, 17 og 21. Brug den nyeste tilgængelige version.

  1. Download enten zip- eller tar-filen fra linkene ovenfor.
  2. Udpak den downloadede fil for at få adgang til driverens JAR-filer.
  3. Vælg den JAR-fil, der matcher din JRE-version:
    • 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. Tilføj den valgte JAR-fil til din applikations classpath.
  5. For JDBC-klienter konfigureres JDBC-driverklassen: com.microsoft.spark.livy.jdbc.LivyDriver

Eksempel på hurtigstart

Dette eksempel demonstrerer, hvordan man forbinder til Fabric og udfører en forespørgsel ved at bruge Microsoft JDBC Driver for Fabric Data Engineering. Før du kører denne kode, skal du sikre dig, at du opfylder adgangskravene og installerer driveren. Ved at bruge AuthFlow=2, bruger DefaultAzureCredentialdriveren . For at bruge Azure CLI som kilde til legitimationsoplysninger, installer Azure CLI og kø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();
        }
    }
}

Forbindelsesstrengsformat

Grundlæggende forbindelsesstreng

Microsoft JDBC Driver for Fabric Data Engineering bruger følgende forbindelsesstreng-format:

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

Forbindelsesstrengskomponenter

Komponent Beskrivelse Eksempel
Protokol JDBC URL-protokolidentifikator jdbc:fabricspark://
Værtsnavn Fabric endpoint værtsnavn api.fabric.microsoft.com
Havn Valgfrit portnummer (standard: 443) :443
Parametre Semikolon-separeret nøgle=værdipar FabricWorkspaceID=<guid>

Eksempel på forbindelsesstrenge

Grundlæggende forbindelse (interaktiv browserbaseret autentificering)

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

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øj samtidighedsmode

High-concurrency (HC) tilstand er tilgængelig for Microsoft Fabric-forbindelser i driverversion 1.1.0 og nyere. Tilføj hcEnabled=true til en HC-session i stedet for en klassisk Livy-session:

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

Du kan valgfrit identificere arbejdsbelastningen med et sessionstag og vælge 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-tilstand er opt-in. Hvis hcEnabled er udeladt eller sat til false, bruger driveren den klassiske Livius-sessionsti.

Se afsnittet omHigh-Concurrency (HC) Mode for fuld konfigurationsvejledning.


Godkendelse

Microsoft JDBC Driver for Fabric Data Engineering understøtter flere autentificeringsmetoder via Microsoft Entra ID (tidligere Azure Active Directory). Autentificering konfigureres ved hjælp af parameteren AuthFlow i forbindelsesstrengen.

Autentificeringsflows

AuthFlow Godkendelsesmetode Brug sag
1 Interaktiv browser Interaktiv brugerautentificering ved brug af OAuth 2.0
2 Default Azure credential chain Udvikling og administreret applikationsautentificering; Azure CLI kan være én kilde til legitimationsoplysninger
3 Client Secret Credentials (Service Principal) Automatiseret/service-til-service autentificering
4 Klientcertifikat Certifikatbaseret service principal-autentificering
5 Adgangstoken Foruderhvervet bæreradgangstoken

Interaktiv browserautentificering

Bedst til: Udvikling og interaktive applikationer

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

Connection conn = DriverManager.getConnection(url);

Parametre:

  • AuthFlow=1: Specificerer interaktiv browserautentificering

Adfærd:

  • Åbner et browservindue til brugerautentificering
  • Cacher legitimationsoplysninger til efterfølgende forbindelser, indtil de udløber
  • Velegnet til enkeltbrugerapplikationer

Klientlegitimation eller Service Principal-autentificering

Bedst til: Automatiserede tjenester og baggrundsjobs

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

Påkrævede parametre:

  • AuthFlow=3: Angiver klientlegitimationsautentificering
  • AuthClientID: Application (klient) ID fra Microsoft Entra ID
  • AuthClientSecret: Klienthemmelighed fra Microsoft Entra ID
  • AuthTenantID: Microsoft Entra lejer-ID

Bedste praksis:

  • Lagre hemmeligheder sikkert (Azure Key Vault, miljøvariabler)
  • Brug managed identities, når det er muligt
  • Roterer hemmeligheder regelmæssigt

Certificate-Based Autentificering

Bedst til: Virksomhedsapplikationer, der kræver certifikatbaseret autentificering

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

Påkrævede parametre:

  • AuthFlow=4: Specificerer certifikatbaseret autentificering
  • AuthClientID: Applikations-ID (klient)
  • AuthCertificatePath: Sti til en PEM-certifikatfil
  • AuthCertificatePassword: Certifikatadgangskode
  • AuthTenantID: Microsoft Entra lejer-ID

Adgangstoktuifikation

Bedst til: Brugerdefinerede autentificeringsscenarier

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

Autentificeringscache

Driveren cacher autentificeringstokens og opdaterer dem baseret på tokenets udløb. Parsed AuthEnableCaching og AuthCacheTTLMS egenskaber styrer ikke denne adfærd i version 2.0.0.

Konfigurationsparametre

Påkrævede parametre

Disse parametre skal være til stede i hver forbindelsesstreng:

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

Valgfrie parametre

API-versionskonfiguration

Parameter Type Standard Beskrivelse
FabricVersion String v1 Fabric API-version
LivyApiVersion String 2023-12-01 Livy API-versionen

Miljøkonfiguration

Parameter Type Standard Beskrivelse
FabricEnvironmentID UUID Ingen Fabric-miljøidentifikator til reference-miljøelement for Spark-session

Konfiguration af sessioner med høj samtidighed

Indstil hcEnabled=true til at bruge HC-tilstand. De resterende HC-egenskaber bruges kun, når HC-tilstand er aktiveret.

Parameter Type Standard Beskrivelse
hcEnabled Boolean false Bruger en Fabric høj-samtidighedssession.
sessionTag String Ingen Valgfrit serverside-sessionstag. Brug 1 til 64 bogstaver, cifre, understreger eller bindestreger.
hcAcquireTimeoutSeconds Integer 300 Maksimal tid til at vente på, at HC-sessionen bliver klar. Gyldige værdier spænder fra 120 til 3.600 sekunder.
hcAcquirePollingIntervalMs Integer 1000 Interval mellem statuskontroller af HC-sessioner. Accepterede værdier spænder fra 50 til 30.000 millisekunder og er fastklemt til 100 til 5.000 millisekunder ved kørsel.

Eksempel:

hcEnabled=true;sessionTag=interactive_reporting;hcAcquireTimeoutSeconds=600;hcAcquirePollingIntervalMs=2000;FabricEnvironmentID=<environment-id>
  • FabricEnvironmentID gælder både HC- og klassiske sessioner
  • EnvironmentID accepteres også som et cross-driver-alias. Ejendomsnavne er ikke små og små bogstaver.

Vigtig

Brug sessionTag kun til ikke-følsomme operationsetiketter. Inkluder ikke hemmeligheder, adgangstoks, personlige data, kundeidentifikatorer eller forespørgselstekst.

Se afsnittet omHigh-Concurrency (HC) Mode for fuld konfigurationsvejledning.

Spark-konfiguration

Konfiguration af sessionsressourcer

Konfigurer Spark-sessionsressourcer for optimal ydeevne:

Parameter Type Standard Beskrivelse Eksempel
DriverCores Integer Spark standard Antal CPU-kerner for driver 4
DriverMemory String Spark standard Hukommelsesallokering til driver 4g
ExecutorCores Integer Spark standard Antal CPU-kerner pr. eksekver 4
ExecutorMemory String Spark standard Hukommelsesallokering pr. eksekutor 8g
NumExecutors Integer Spark standard Antal eksekutorer 2
SessionName String Automatisk genereret Brugerdefineret sessionsnavn MySparkSession

Eksempel:

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

Brugerdefinerede Spark Session-egenskaber

Enhver parameter med præfikset spark. anvendes automatisk på Spark-sessionen:

Eksempler på gnistkonfigurationer:

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

Native Execution Engine (NEE):

spark.nee.enabled=true

Fuldstændigt 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-klientforbindelsesindstillinger

Konfigurer driverens HTTP-transportforbindelser for optimal netværksydelse. Disse indstillinger konfigurerer eller administrerer ikke JDBC-forbindelsespooling:

Parameter Type Standard Beskrivelse
HttpMaxTotalConnections Integer 100 Maksimalt antal HTTP-forbindelser
HttpMaxConnectionsPerRoute Integer 20 Maksimalt antal forbindelser pr. rute
HttpConnectionTimeoutInSeconds Integer 30 Timeout for forbindelse
HttpSocketTimeoutInSeconds Integer 60 Socket-læsetidsafbrydelse
HttpReadTimeoutInSeconds Integer 60 HTTP-læsetimeout
HttpConnectionRequestTimeoutSeconds Integer 10 Forbindelsesanmodning timeout fra poolen
HttpEnableKeepAlive Boolean sand Aktivér HTTP keep-alive
HttpKeepAliveTimeoutSeconds Integer 60 Keep-alive timeout
HttpFollowRedirects Boolean sand Følg HTTP-omdirigeringer
HttpUseAsyncIO Boolean sand Brug asynkron HTTP I/O

Eksempel:

HttpMaxTotalConnections=200;HttpMaxConnectionsPerRoute=100;HttpConnectionTimeoutInSeconds=60

Proxy-konfiguration

Konfigurer HTTP- og SOCKS-proxyindstillinger til virksomhedsmiljøer:

Parameter Type Standard Beskrivelse
UseProxy Boolean falsk Aktiver proxy
ProxyTransport String http Proxy-transporttype (http/tcp)
ProxyHost String Ingen Proxy-værtsnavn
ProxyPort Integer Ingen Proxy-port
ProxyAuthEnabled Boolean falsk Aktivér proxy-autentificering
ProxyUsername String Ingen Brugernavn til proxy-autentificering
ProxyPassword String Ingen Proxy-autentificeringsadgangskode
ProxyAuthScheme String basic Auth-skema (basic/digest/ntlm)
ProxySocksVersion Integer 5 SOCKS-versionen (4/5)

HTTP-proxy eksempel:

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

Konfiguration af logning

Parameter Type Standard Beskrivelse
LogLevel String WARN Logningsniveau: TRACE, DEBUG, INFO, WARNING, ERROR

Eksempel:

LogLevel=DEBUG

Standardlogplacering:

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

Brugerdefineret logkonfiguration: Brug en custom log4j2.xml eller logback.xml fil på din classpath.

Høj-samtidighed (HC) tilstand

High-concurrency (HC) tilstand er designet til JDBC-applikationer, der åbner flere forbindelser til det samme Fabric-arbejdsområde og lakehouse. I stedet for at provisionere en separat klassisk Spark-session for hver forbindelse, betjener Fabric disse forbindelser med delt, serverstyret Spark-kapacitet.

HC-tilstand kan reducere forbindelsesopstartstiden, undgå gentagen Spark-sessionsprovisionering og udnytte tilgængelig kapacitet mere effektivt til samtidige arbejdsbelastninger. Hver JDBC-forbindelse fortsætter med at udføre statements gennem sin tildelte kontekst inden for HC-sessionen.

HC-tilstand er opt-in og supplerer JDBC forbindelsespooling. HC-tilstand håndterer Fabric Spark-sessioner på serveren, mens JDBC-forbindelsespooling håndterer forbindelser i klientapplikationen. Hvis du ikke aktiverer HC-tilstand, opretter driveren en klassisk Livy-session.

Vælg mellem HC og klassisk tilstand

Brug HC-tilstand når:

  • En applikationstjeneste håndterer samtidige forespørgsler, der kører Spark SQL gennem flere JDBC-forbindelser.
  • Et BI- eller rapporteringsværktøj åbner flere forbindelser til det samme arbejdsområde og lakehouse.
  • Parallelle ETL-opgaver eller planlagte jobs skaber bursts af JDBC-forbindelser.
  • Forbindelser bruger kompatible Spark-konfigurationer og kan dele serveradministreret Spark-kapacitet.
  • At reducere opstartstiden for forbindelsen og gentagne Spark-sessioner er vigtigt.

Brug klassisk tilstand, når:

  • Din applikation bruger kun én eller få langvarige JDBC-forbindelser.
  • Hver forbindelse kræver en dedikeret Spark-session til streng arbejdsbelastning eller ressourceisolering.
  • Forbindelser kræver væsentligt forskellige Spark-konfigurationer eller Fabric-miljøer.
  • Fabric Livy-endpointet for det målrettede arbejdsområde og lakehouse understøtter ikke HC-tilstand.

Aktiver høj-samtidighedstilstand

HC-tilstand er opt-in. Hvis du udelader hcEnabled eller sætter den til falsk, bruger driveren den klassiske Livy-sessionsrute. Sæt hcEnabled til true for at få en HC-session:

hcEnabled=true;

Påkrævede parametre i HC-tilstand

HC-aktivering kræver følgende gyldige identifikatorer:

Parameter Noter
WorkspaceId Skal være en gyldig Fabric workspace GUID.
LakehouseId Skal være en gyldig Fabric lakehouse GUID.

Inkludér SessionTag , fordi det påvirker server-side matching for varme sessioner.

Sessionsmatchning

HC-tilstand garanterer ikke, at hver forbindelse genbruger en eksisterende session. For hver session-anskaffelsesanmodning sender driveren:

  • Værdien SessionTag .
  • Den effektive Spark-konfiguration, inklusive conf.* indstillinger og EnvironmentId.

Fabric Livy-tjenesten vurderer disse værdier og beslutter, om forbindelsen skal knyttes til en varm session eller oprettes en ny. For at forbedre genbrug af sessioner skal man bruge konsistente værdier på tværs af forbindelser, der er beregnet til at dele serveradministreret Spark-kapacitet.

Deaktiver HC-tilstand

Du kan deaktivere nye HC-sessionserhvervelser uden at genudrulle driveren ved at sætte HC-forbindelsesstreng til false eller ved at fjerne HC-parametrene:

hcEnabled=false;

Nød-rollbacks: Ved nød-rollback, start JVM med -Dcom.microsoft.fabric.jdbc.hc.disable=true. Denne JVM-omfattende switch tvinger klassisk tilstand, selv når en forbindelsesstreng indeholder hcEnabled=true.

Forstå HC-runtime-adfærd

  • HC-sessionsopkøbsblokke, indtil sessionen er klar eller hcAcquireTimeoutSeconds udløber.
  • At lukke en forbindelse, mens opkøbet er i gang, afbryder erhvervelsen og udløser oprydning af best-effort HC-sessioner.
  • Autentificering, forespørgselsudførelse, annullering, forberedte sætninger, resultathåndtering og FabricEnvironmentID arbejde gennem de standard JDBC-grænseflader i begge tilstande.

Anvendelseseksempler

Grundlæggende forbindelse

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øj-samtidighedstilstand forbindelse

Følgende eksempel åbner en JDBC-forbindelse i HC-tilstand, kører en forespørgsel og frigiver forbindelsen 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));
    }
}

Udførelse af forespørgsler

Simpel forespørgsel

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

Forespørgsel 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);
        }
    }
}

Forespørgsel med grænse

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

Arbejde med resultatmængder

Gennemløbsresultatmængder

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

Resultatsættene er kun fremadrettet og skrivebeskyttet. Driveren understøtter ikke metoder som first(), last(), og absolute().

Behandling af store resultatsæt

Driverens paginerer resultater efter svarstørrelse. Konfigurer LivyStatementPageSize i JDBC-URL'en til at sætte den ønskede sidestørrelse i bytes. Metoden Statement.setFetchSize() styrer ikke hentning eller hukommelsesforbrug.

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
}

Brug af forberedte udsagn

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

Batchoperationer

Driveren understøtter ikke JDBC-transaktioner. Batch-udførelse er ikke-transaktionel og kan delvist lykkes. En senere fiasko ruller ikke tidligere succesfulde udsagn tilbage.

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

Vælg en forbindelses-ejer

Vælg én komponent til at styre forbindelsens livscyklus. Placer ikke én forbindelsespool i en anden.

Brugsmodel Indgangspunkt Poolejer Lukning af en lånt Connection Nedlukningsejer
Direkte DriverManager, LivyDrivereller LivyDataSource Ingen Fysisk lukker den sin uafhængige Livy-forbindelse og session. Applikationen lukker alle forbindelser. En direkte LivyDataSource har ingen separat tæt livscyklus.
Ekstern HikariCP HikariDataSource understøttet af en JDBC-URL eller LivyDataSource Kun HikariCP Returnerer Hikari-proxyforbindelsen til HikariCP. Applikationen lukker sin bevarede HikariDataSource.
Eksplicit indbygget pool LivyBuiltInPooledDataSource En dovent skabt LivyConnectionPool for hver konfigureret datakildegenerering Pensionerer den logiske lejekontrakt og genbruger den fysiske session kun efter sikker oprydning. Applikationen lukker sin tilbageholdte indbyggede datakilde.
Standard pooling SPI LivyConnectionPoolDataSource opretter PooledConnection objekter til en mellemniveau poolmanager Mellemlederen af poolen, ikke fabrikken Lukker det logiske håndtag og giver synkront besked til lederen efter oprydning. Manageren ringer PooledConnection.close() for at ødelægge hver fysisk forbindelse.

ConnectionPoolEnabled går som standard både false i driverkoden og de leverede egenskaber. Det er ikke en opt-in switch for de nuværende indgangspunkter. Brug LivyBuiltInPooledDataSource den, når driveren skal eje poolen, eller konfigurer en ekstern pool som HikariCP. De andre indgangspunkter skaber direkte, ikke-pool-ejere forbindelser.

Forbindelsespooling med HikariCP

HikariCP kan skabe forbindelser fra enten LivyDataSource eller JDBC-URL'en via LivyDriver. Opret én HikariCP-instans, genbrug den for applikationens levetid, og brug kun én forbindelsespool i hver konfiguration.

Maven-afhængighed

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

Brug LivyDataSource

LivyDataSource skaber uafhængige fysiske forbindelser og ejer ikke en forbindelsespulje eller en separat tæt livscyklus. Giv det direkte til HikariCP, så HikariCP er den eneste pool-ejer:

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

Eksemplet aktiverer HC-tilstand i JDBC-URL'en. HikariCP håndterer klient-side forbindelser, mens HC-tilstand håndterer delte Spark-sessioner i Fabric. Fjern hcEnabled det, og sessionTag hvis applikationen kræver klassiske sessioner.

Brug LivyDriver direkte

Konfigurer JDBC URL'en og driverklassen, så HikariCP opretter fysiske forbindelser gennem LivyDriver. At sætte driverklassen eksplicit er valgfrit, når JDBC-serviceudbyderens auto-discovery er tilgængelig. Denne konfiguration instansierer LivyDataSourceikke , så dens indbyggede pool er ikke involveret:

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

Brug følgende vejledning, når du konfigurerer poolen:

Miljø eller adfærd Vejledning
Poolejerskab LivyDataSource er kun direkte. Når du leverer det til HikariCP, ejer HikariCP poolen. Brug LivyBuiltInPooledDataSource i stedet, når chaufføren burde eje puljen.
Poolstørrelse Start med en lille pulje og øg den først efter at have målt arbejdsbelastningens samtidighed og kapacitetsforbrug. I klassisk tilstand ejer hver fysisk forbindelse en Livy-session. I HC-tilstand kan forbindelser dele serveradministreret Spark-kapacitet.
connectionTimeout Styrer, hvor længe en opkalder venter på at låne en forbindelse, men afbryder ikke et forbindelsesforsøg, der allerede er i gang. For HC-URL'er, tillad ; hcAcquireTimeoutSecondsfor klassisk tilstand, tillad LivySessionTimeoutSeconds, autentificering, HTTP-gentagelser og validering. HikariCP udtrykker denne indstilling i millisekunder.
initializationFailTimeout En negativ værdi springer opstartsforbindelsen og valideringsforsøget over. Forbindelsesfejl dukker så op, når applikationen først anmoder om en forbindelse. Brug en positiv værdi, hvis applikationen skal verificere forbindelsen under opstart.
Forbindelsesvalidering HikariCP bruger Connection.isValid(). Dens effektive varighed styres af driverens HTTP-timeout og retry/backoff-indstillinger, ikke HikariCPs.validationTimeout Konfigurer ikke en forbindelsestestforespørgsel, fordi den erstatter den lettere valideringskontrol med en Spark-sætning.

For den komplette liste over HikariCP-konfigurationsmuligheder, se:

Datatypekortlægning

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

Spark SQL Type JDBC SQL Type Java-type Noter
BOOLEAN BOOLEAN Boolean
BYTE TINYINT Byte
SHORT SMALLINT Short
INT INTEGER Integer
LONG BIGINT Long
FLOAT FLOAT Float
DOUBLE DOUBLE Double
DECIMAL DECIMAL BigDecimal Præcision og skala bevaret
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 fuld java.sql.Array accessor-understøttelse
MAP JAVA_OBJECT String Hentet som JSON-tekst
STRUCT STRUCT String Hentet som JSON-tekst; metadatatypen garanterer ikke fuld java.sql.Struct accessor-understøttelse