Microsoft JDBC-drivrutin för Microsoft Fabric Data Engineering

JDBC (Java Database Connectivity) är en allmänt antagen standard som gör det möjligt för klientprogram att ansluta till och arbeta med data från databaser och stordataplattformar.

Microsoft JDBC Driver för Fabric Data Engineering låter dig koppla samman, fråga och hantera Spark-arbetsbelastningar i Fabric med samma tillförlitlighet och enkelhet som JDBC-standarden. Byggd på Fabric:s Livy-API:er erbjuder drivrutinen säker och flexibel Spark SQL-anslutning till dina Java-applikationer och BI-verktyg. Denna integration gör det möjligt att skicka in och köra Spark-kod direkt utan att behöva skapa separata notebook- eller Spark-jobbdefinitionsobjekt. Drivrutinen är kompatibel med populära JDBC-klienter som DbVisualizer och DBeaver, samt BI-verktyg som stöder JDBC-anslutning, inklusive Tableau.

Huvudfunktioner    

  • JDBC 4.2 API:er: Implementerar JDBC 4.2 API:er för Spark SQL-anslutning, med Spark- och Livy-begränsningar såsom inga JDBC-transaktioner och framåtriktade, skrivskyddade resultatuppsättningar
  • Microsoft Entra-ID-autentisering: Flera autentiseringsflöden, inklusive interaktiva klientautentiseringsuppgifter och certifikatbaserad autentisering
  • Sessioner för hög samtidighet: Valbar delning av Fabric-sessioner för samtidiga arbetsbelastningar
  • Explicit anslutningspoolning: Välj HikariCP, en standardpoolhanterare, eller LivyBuiltInPooledDataSource; direkta anslutningspunkter använder aldrig poolning
  • Spark SQL nativt frågestöd: Direkt körning av Spark SQL-satser utan översättning
  • Omfattande stöd för datatyper: Stöd för alla Spark SQL-datatyper, inklusive komplexa typer (ARRAY, MAP, STRUCT)
  • Asynkron förinläsning av resultatuppsättning: Inläsning av bakgrundsdata för bättre prestanda
  • Kretsbrytarmönster: Skydd mot sammanhängande fel med automatiskt återförsök
  • Automatisk återanslutning: Transparent sessionsåterställning vid anslutningsfel
  • Avancerad logik för återförsök: Försök igen med exponentiell backoff och sessionsåterställning för bättre motståndskraft
  • Proxystöd: HTTP- och SOCKS-proxykonfiguration för företagsmiljöer

Förutsättningar

Innan du använder Microsoft JDBC Driver för Fabric Data Engineering, se till att du har:

  • Java Development Kit (JDK): Java 11, 17 och 21 (rekommenderas av Java 21)
  • Fabric Access: Tillgång till en arbetsyta för Fabric
  • Microsoft Entra ID-autentiseringsuppgifter: Lämpliga uppgifter för autentisering
  • Workspace- och Lakehouse-ID: GUID-identifierare för din Fabric-arbetsyta och lakehouse

Ladda ned och installera

Microsoft JDBC Driver for Fabric Data Engineering version 2.0.1 stöder Java 11, 17 och 21. Använd den senaste tillgängliga versionen.

  1. Ladda ned zip- eller tar-filen från länkarna ovan.
  2. Extrahera den nedladdade filen för att få åtkomst till drivrutins-JAR-filerna.
  3. Välj DEN JAR-fil som matchar din JRE-version:
    • För Java 11: ms-sparksql-jdbc-2.0.1.jre11.jar
    • För Java 17: ms-sparksql-jdbc-2.0.1.jre17.jar
    • För Java 21: ms-sparksql-jdbc-2.0.1.jre21.jar
  4. Lägg till den valda JAR-filen i programmets klassökväg.
  5. För JDBC-klienter konfigurerar du JDBC-drivrutinsklassen: com.microsoft.spark.livy.jdbc.LivyDriver

Snabbstartsexempel

Detta exempel visar hur man ansluter till Fabric och kör en fråga genom att använda Microsoft JDBC Driver for Fabric Data Engineering. Innan du kör denna kod, se till att du uppfyller förkunskaperna och installerar drivrutinen. Genom att använda AuthFlow=2 använder drivrutinen DefaultAzureCredential. För att använda Azure CLI som källkälla för legitimation, installera Azure CLI och 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();
        }
    }
}

Format för anslutningssträng

Grundläggande anslutningssträng

Microsoft JDBC Driver for Fabric Data Engineering använder följande reťazec pripojenia-format:

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

Komponenter för anslutningssträngar

Komponent Description Example
Protocol JDBC URL-protokollidentifierare jdbc:fabricspark://
Värdnamn Fabric-endpointens värdnamn api.fabric.microsoft.com
Hamn Valfritt portnummer (standard: 443) :443
Parameters Semikolonavgränsad nyckel=värdepar FabricWorkspaceID=<guid>

Exempel på anslutningssträngar

Grundläggande anslutning (interaktiv webbläsarbaserad autentisering)

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

Med Spark-resurskonfiguration

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 Egenskaper för Spark-sessioner

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 läge för hög samtidighet

Läge för hög samtidighet (HC) är tillgängligt för Microsoft Fabric-anslutningar i drivrutinsversion 1.1.0 och senare. Lägg till hcEnabled=true för att skaffa en HC-session istället för en klassisk Livy-session:

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

Du kan valfritt identifiera arbetsbelastningen med en sessionstagg och välja en 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-läget är frivilligt. Om hcEnabled utelämnas eller sätts till false, använder föraren den klassiska Livy-sessionsvägen.

Se avsnittet omHigh-Concurrency (HC) Mode för fullständig konfigurationsvägledning.


Authentication

Microsoft JDBC Driver for Fabric Data Engineering stöder flera autentiseringsmetoder via Microsoft Entra ID (tidigare Azure Active Directory). Autentisering konfigureras med hjälp av parametern AuthFlow i anslutningssträngen.

Autentiseringsflöden

AuthFlow Autentiseringsmetod Användningsfall
1 Interaktiv webbläsare Interaktiv användarautentisering med OAuth 2.0
2 Standardkedja för Azure-autentiseringsuppgifter Utveckling och hanterad applikationsautentisering; Azure CLI kan vara en källa för inloggningsuppgifter
3 Autentiseringsuppgifter för klienthemlighet (tjänstens huvudidentifierare) Automatiserad/tjänst-till-tjänst-autentisering
4 Autentiseringsuppgifter för klientcertifikat Certifikatbaserad autentisering av tjänstekonto
5 Åtkomsttoken Fördefinierad ägaråtkomsttoken

Interaktiv webbläsarautentisering

Bäst för: Utveckling och interaktiva program

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: Anger interaktiv webbläsarautentisering

Uppförande:

  • Öppnar ett webbläsarfönster för användarautentisering
  • Cachar inloggningsuppgifter för efterföljande anslutningar tills de går ut
  • Lämplig för enanvändarprogram

Klientautentiseringsuppgifter eller tjänstehuvudkontoautentisering

Bäst för: Automatiserade tjänster och bakgrundsjobb

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

Obligatoriska parametrar:

  • AuthFlow=3: Anger autentiseringsuppgifter för klienten
  • AuthClientID: Program-ID (klient) från Microsoft Entra-ID
  • AuthClientSecret: Klienthemlighet från Microsoft Entra-ID
  • AuthTenantID: Microsoft Entra klientorganisations-ID

Metodtips:

  • Lagra hemligheter på ett säkert sätt (Azure Key Vault, miljövariabler)
  • Använda hanterade identiteter när det är möjligt
  • Rotera hemligheter regelbundet

Certifikatbaserad autentisering

Bäst för: Företagsprogram som kräver certifikatbaserad 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);

Obligatoriska parametrar:

  • AuthFlow=4: Anger certifikatbaserad autentisering
  • AuthClientID: Program-ID (klient)-ID
  • AuthCertificatePath: Väg till en PEM-certifikatfil
  • AuthCertificatePassword: Certifikatlösenord
  • AuthTenantID: Microsoft Entra klientorganisations-ID

Åtkomsttokenautentisering

Bäst för: Scenarier för anpassad autentisering

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

Cachelagring för autentisering

Drivrutinen cachar autentiseringstoken och uppdaterar dem baserat på tokens utgångsdatum. De tolkade egenskaperna AuthEnableCaching och AuthCacheTTLMS styr inte detta beteende i version 2.0.0.

Konfigurationsparametrar

Obligatoriska parametrar

Dessa parametrar måste finnas i varje anslutningssträng:

Parameter Typ Description Example
FabricWorkspaceID universellt unik identifierare (UUID) Identifierare för Fabric-arbetsyta <workspace-id>
FabricLakehouseID universellt unik identifierare (UUID) Fabric lakehouse-identifierare <lakehouse-id>
AuthFlow Integer Typ av autentiseringsflöde (1–5) 2

Valfria parametrar

Konfiguration av API-version

Parameter Typ Förinställning Description
FabricVersion String v1 Fabric API-versionen
LivyApiVersion String 2023-12-01 Livy API-version

Miljökonfiguration

Parameter Typ Förinställning Description
FabricEnvironmentID universellt unik identifierare (UUID) None Infrastrukturmiljöidentifierare för referens av miljöobjekt för Spark-session

Konfiguration av sessioner med hög samtidighet

Ställ hcEnabled=true in på HC-läge. De återstående HC-egenskaperna används endast när HC-läge är aktiverat.

Parameter Typ Förinställning Description
hcEnabled Boolean false Använder en Fabric-session med hög samtidighet.
sessionTag String None En valfri sessionstagg på serversidan. Använd 1 till 64 bokstäver, siffror, understreck eller bindestreck.
hcAcquireTimeoutSeconds Integer 300 Maximal tid att vänta på att HC-sessionen ska bli klar. Giltiga värden varierar från 120 till 3 600 sekunder.
hcAcquirePollingIntervalMs Integer 1000 Intervall mellan statuskontroller för HC-sessioner. Godkända värden sträcker sig från 50 upp till 30 000 millisekunder och begränsas under körning till 100–5 000 millisekunder.

Example:

hcEnabled=true;sessionTag=interactive_reporting;hcAcquireTimeoutSeconds=600;hcAcquirePollingIntervalMs=2000;FabricEnvironmentID=<environment-id>
  • FabricEnvironmentID gäller både HC- och klassiska sessioner
  • EnvironmentID accepteras också som ett cross-driver-alias. Egenskapsnamn är inte skiftlägeskänsliga.

Important

Använd sessionTag endast för icke-känsliga operativa etiketter. Inkludera inte hemligheter, åtkomsttokens, personuppgifter, kundidentifierare eller förfrågningstext.

Se avsnittet omHigh-Concurrency (HC) Mode för fullständig konfigurationsvägledning.

Spark-konfiguration

Sessionsresurskonfiguration

Konfigurera Spark-sessionsresurser för optimala prestanda:

Parameter Typ Förinställning Description Example
DriverCores Integer Standardvärde för Spark Antal CPU-kärnor för drivrutin 4
DriverMemory String Standardvärde för Spark Minnesallokering för drivrutin 4g
ExecutorCores Integer Standardvärde för Spark Antal CPU-kärnor per köre 4
ExecutorMemory String Standardvärde för Spark Minnesallokering per exekverare 8g
NumExecutors Integer Standardvärde för Spark Antal utförare 2
SessionName String Automatiskt genererad Anpassat sessionsnamn MySparkSession

Example:

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

Egenskaper för anpassad Spark-session

Alla parametrar med prefixet spark. tillämpas automatiskt på Spark-sessionen:

Exempel på Spark-konfigurationer:

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

Inbyggd exekveringsmotor (NEE):

spark.nee.enabled=true

Fullständigt exempel:

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-klientanslutningsinställningar

Konfigurera drivrutinens HTTP-transportanslutningar för optimal nätverksprestanda. Dessa inställningar konfigurerar eller hanterar inte JDBC:s anslutningspoolning:

Parameter Typ Förinställning Description
HttpMaxTotalConnections Integer 100 Maximalt antal HTTP-anslutningar
HttpMaxConnectionsPerRoute Integer 20 Maximalt antal anslutningar per väg
HttpConnectionTimeoutInSeconds Integer 30 Tidsgräns för anslutning
HttpSocketTimeoutInSeconds Integer 60 Tidsgräns för socket-läsning
HttpReadTimeoutInSeconds Integer 60 Tidsgräns för HTTP-läsning
HttpConnectionRequestTimeoutSeconds Integer 10 Tidsgräns för anslutningsbegäran från poolen
HttpEnableKeepAlive Boolean true Aktivera HTTP keep-alive
HttpKeepAliveTimeoutSeconds Integer 60 Timeout för keep-alive
HttpFollowRedirects Boolean true Följ HTTP-omdirigeringar
HttpUseAsyncIO Boolean true Använda asynkront HTTP I/O

Example:

HttpMaxTotalConnections=200;HttpMaxConnectionsPerRoute=100;HttpConnectionTimeoutInSeconds=60

Proxykonfiguration

Konfigurera HTTP- och SOCKS-proxyinställningar för företagsmiljöer:

Parameter Typ Förinställning Description
UseProxy Boolean false Aktivera proxy
ProxyTransport String http Proxytransporttyp (http/tcp)
ProxyHost String None Proxyvärdnamn
ProxyPort Integer None Proxyport
ProxyAuthEnabled Boolean false Aktivera proxyautentisering
ProxyUsername String None Användarnamn för proxyautentisering
ProxyPassword String None Proxyautentiseringslösenord
ProxyAuthScheme String basic Autentiseringsschema (basic/digest/ntlm)
ProxySocksVersion Integer 5 SOCKS-version (4/5)

HTTP-proxyexempel:

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

EXEMPEL på SOCKS-proxy:

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

Loggningskonfiguration

Parameter Typ Förinställning Description
LogLevel String WARN Loggningsnivå: TRACE, DEBUG, INFO, WARN, ERROR

Example:

LogLevel=DEBUG

Standardloggplats:

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

Anpassad loggkonfiguration: Använd en anpassad log4j2.xml fil eller logback.xml fil på din klasssökväg.

Läge för hög samtidighet (HC)

High-concurrency (HC)-läge är utformat för JDBC-applikationer som öppnar flera anslutningar till samma Fabric-arbetsyta och lakehouse. Istället för att provisionera en separat klassisk Spark-session för varje anslutning, betjänar Fabric dessa anslutningar med delad, serverhanterad Spark-kapacitet.

HC-läge kan minska anslutningsstart, undvika upprepad Spark-sessionprovisionering och använda tillgänglig kapacitet mer effektivt för samtidiga arbetsbelastningar. Varje JDBC-anslutning fortsätter att exekvera satser genom sin tilldelade kontext inom HC-sessionen.

HC-läget är opt-in och kompletterar JDBC:s anslutningspoolning. HC-läget hanterar Fabric Spark-sessioner på servern, medan JDBC-anslutningspoolning hanterar anslutningar i klientapplikationen. Om du inte aktiverar HC-läget skapar föraren en klassisk Livy-session.

Välj mellan HC och klassiskt läge

Använd HC-läge när:

  • En applikationstjänst hanterar samtidiga förfrågningar som kör Spark SQL via flera JDBC-anslutningar.
  • Ett BI- eller rapporteringsverktyg öppnar flera anslutningar till samma arbetsyta och lakehouse.
  • Parallella ETL-uppgifter eller schemalagda jobb skapar burstar av JDBC-anslutningar.
  • Anslutningar använder kompatibla Spark-konfigurationer och kan dela serverhanterad Spark-kapacitet.
  • Att minska anslutningsstarttiden och upprepad Spark-sessionsprovisionering är viktigt.

Använd klassiskt läge när:

  • Din applikation använder bara en eller några långlivade JDBC-anslutningar.
  • Varje anslutning kräver en dedikerad Spark-session för strikt arbetsbelastning eller resursisolering.
  • Anslutningar kräver väsentligt olika Spark-konfigurationer eller Fabric-miljöer.
  • Fabric Livy-endpointen för målarbetsytan och lakehouse stöder inte HC-läge.

Aktivera läge för hög samtidighet

HC-läget är frivilligt. Om du utelämnar hcEnabled eller sätter det till falskt, använder drivrutinen den klassiska Livy-sessionsvägen. Ställ hcEnabled in på true för att få en HC-session:

hcEnabled=true;

Nödvändiga parametrar i HC-läge

HC-aktivering kräver följande giltiga identifierare:

Parameter Noteringar
WorkspaceId Måste vara en giltig Fabric workspace GUID.
LakehouseId Det måste vara ett giltigt Fabric lakehouse-GUID.

Inkludera SessionTag eftersom det påverkar matchningen på serversidan för uppvärmda sessioner.

Matchning av sessioner

HC-läget garanterar inte att varje anslutning återanvänder en befintlig session. För varje sessionsinhämtningsbegäran skickar drivrutinen:

  • Värdet SessionTag.
  • Den effektiva Spark-konfigurationen, inklusive conf.* inställningar och EnvironmentId.

Fabric Livy-tjänsten utvärderar dessa värden och beslutar om kopplingen ska kopplas till en varm session eller skapas en ny. För att förbättra återanvändning av sessioner, använd konsekventa värden över anslutningar som är avsedda att dela serverhanterad Spark-kapacitet.

Inaktivera HC-läget

Du kan inaktivera hämtning av nya HC-sessioner utan att driftsätta om drivrutinen genom att ange HC-anslutningssträngen till false eller genom att ta bort HC-parametrarna:

hcEnabled=false;

Nödrullningar: För nödrullning, starta JVM med -Dcom.microsoft.fabric.jdbc.hc.disable=true. Denna JVM-omfattande switch tvingar fram klassiskt läge även när en reťazec pripojenia innehåller hcEnabled=true.

Förstå HC:s körtidsbeteende

  • Hämtning av HC-session blockeras tills sessionen är redo eller hcAcquireTimeoutSeconds går ut.
  • Att stänga en anslutning medan en inhämtning pågår avbryter inhämtningen och utlöser en rensning av HC-sessionen efter bästa förmåga.
  • Autentisering, frågekörning, avbrytning, förberedda frågor, resultathantering och FabricEnvironmentID fungerar via standardgränssnitten i JDBC i båda lägena.

Användningsexempel

Grundläggande anslutning

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

Anslutning för hög samtidighet

Följande exempel öppnar en JDBC-anslutning i HC-läge, kör en förfrågan och släpper automatiskt anslutningen:

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öra frågor

Enkel fråga

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

Fråga 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);
        }
    }
}

Fråga med gräns

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

Arbeta med resultatuppsättningar

Genomgång av resultatuppsättningar

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

Resultatuppsättningar kan endast läsas framåt och är skrivskyddade. Drivrutinen stöder inte metoder som first(), last(), och absolute().

Bearbeta stora resultatuppsättningar

Drivrutinen delar upp resultaten i sidor efter svarsstorlek. Konfigurera LivyStatementPageSize i JDBC-URL:en för att ange den begärda sidstorleken i byte. Metoden Statement.setFetchSize() styr inte hämtning eller minnesanvändning.

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
}

Använda förberedda satser

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

Batch-åtgärder

Drivrutinen stöder inte JDBC-transaktioner. Batchkörning är inte transaktionell och kan lyckas delvis. Ett senare misslyckande rullar inte tillbaka tidigare framgångsrika uttalanden.

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älj en anslutningsägare

Välj en komponent för att äga anslutningens livscykel. Placera inte en anslutningspool i en annan.

Användningsmodell Startpunkt Poolägare Stänga ett lånat Connection Nedstängd ägare
Direct DriverManager, LivyDriver eller LivyDataSource None Stänger faktiskt sin fristående Livy-anslutning och session. Applikationen stänger alla anslutningar. En direkt LivyDataSource har ingen separat sluten livscykel.
Externt HikariCP HikariDataSource stödd av en JDBC-URL eller LivyDataSource Endast HikariCP Återställer Hikari-proxykopplingen till HikariCP. Appen stänger sin kvarhållna HikariDataSource.
Explicit inbyggd resurspool LivyBuiltInPooledDataSource En LivyConnectionPool som skapas vid behov för varje konfigurerad datakällegenerering Avvecklar den logiska leasingen och återanvänder den fysiska sessionen först efter säker rensning. Applikationen stänger den kvarhållna inbyggda datakällan.
Standardpoolning SPI LivyConnectionPoolDataSource skapar PooledConnection objekt för en poolhanterare på mellannivå Poolchefen på mellannivån, inte fabriken Stänger det logiska handtaget och meddelar synkront chefen efter rensningen. Hanteraren anropar PooledConnection.close() för att avsluta varje fysisk anslutning.

ConnectionPoolEnabled är som standard false i både drivrutinskoden och de levererade egenskaperna. Det är inte en opt-in-switch för de nuvarande ingångspunkterna. Använd LivyBuiltInPooledDataSource när drivrutinen ska äga poolen, eller konfigurera en extern pool som HikariCP. De andra ingångspunkterna skapar direkta, icke-poolägande anslutningar.

Anslutningspoolning med HikariCP

HikariCP kan skapa kopplingar från antingen LivyDataSource eller JDBC:s URL via LivyDriver. Skapa en HikariCP-instans, återanvänd den under applikationens livslängd och använd endast en anslutningspool i båda konfigurationerna.

Maven-beroende

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

Använd LivyDataSource

LivyDataSource skapar oberoende fysiska kopplingar och äger ingen anslutningspool eller en separat nära livscykel. Lämna det direkt till HikariCP så att HikariCP är den enda poolägaren:

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

Exemplet möjliggör HC-läge i JDBC-URL:en. HikariCP hanterar klientanslutningar, medan HC-läget hanterar delade Spark-sessioner i Fabric. Ta bort hcEnabled och sessionTag om ansökan kräver klassiska sessioner.

Använd LivyDriver direkt

Konfigurera JDBC-URL:en och drivrutinsklassen så att HikariCP skapar fysiska anslutningar genom LivyDriver. Att uttryckligen ange drivrutinsklassen är inte nödvändigt när automatisk identifiering av JDBC-tjänstleverantörer är tillgänglig. Denna konfiguration instansierar inte LivyDataSource, så dess inbyggda pool används inte:

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

Använd följande vägledning när du konfigurerar poolen:

Miljö eller beteende Guidance
Ägarskap för pool LivyDataSource är endast för direktanslutning. När du levererar den till HikariCP äger HikariCP poolen. Använd LivyBuiltInPooledDataSource istället när föraren borde äga poolen.
Poolstorlek Börja med en liten pool och öka den först efter att ha mätt arbetsbelastningens samtidighet och kapacitetsanvändning. I klassiskt läge äger varje fysisk anslutning en Livy-session. I HC-läge kan anslutningar dela serverhanterad Spark-kapacitet.
connectionTimeout Styr hur länge en uppringare väntar på att låna en anslutning, men avbryter inte ett anslutningsförsök som redan pågår. För HC-URL:er, tillåt hcAcquireTimeoutSeconds; för klassiskt läge, tillåt LivySessionTimeoutSeconds, autentisering, HTTP-återförsök och validering. HikariCP uttrycker denna inställning i millisekunder.
initializationFailTimeout Ett negativt värde hoppar över startanslutningen och valideringsförsöket. Anslutningsfel uppstår sedan när applikationen först begär en anslutning. Använd ett positivt värde om applikationen måste verifiera anslutningen vid uppstart.
Anslutningsvalidering HikariCP använder Connection.isValid(). Dess effektiva varaktighet styrs av drivrutinens HTTP-timeout och återförsök/backoff-inställningar, inte HikariCP:s.validationTimeout Konfigurera inte en anslutningstestfråga eftersom den ersätter den lättare valideringskontrollen med en Spark-sats.

För den kompletta listan över HikariCP-konfigurationsalternativ, se:

Datatypsmappning

Drivrutinen mappar Spark SQL-datatyper till JDBC SQL-typer och Java-typer:

Spark SQL-typ JDBC SQL-typ Java-typ Noteringar
BOOLEAN BOOLEAN Boolean
BYTE TINYINT Byte
SHORT SMALLINT Short
INT INTEGER Integer
LONG BIGINT Long
FLOAT FLOAT Float
DOUBLE DOUBLE Double
DECIMAL DECIMAL BigDecimal Precision och skalning bevaras
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 Hämtad som JSON-text; metadatatyp garanterar inte fullständig java.sql.Array accessor-support
MAP JAVA_OBJECT String Hämtad som JSON-text
STRUCT STRUCT String Hämtad som JSON-text; metadatatyp garanterar inte fullständig java.sql.Struct accessor-support