Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.
- Ladda ner Microsoft JDBC Driver för Fabric Data Engineering (zip)
- Ladda ner Microsoft JDBC Driver för Fabric Data Engineering (tar)
- Ladda ned zip- eller tar-filen från länkarna ovan.
- Extrahera den nedladdade filen för att få åtkomst till drivrutins-JAR-filerna.
- 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
- För Java 11:
- Lägg till den valda JAR-filen i programmets klassökväg.
- 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>
-
FabricEnvironmentIDgäller både HC- och klassiska sessioner -
EnvironmentIDaccepteras 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 ochEnvironmentId.
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
hcAcquireTimeoutSecondsgå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
FabricEnvironmentIDfungerar 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 |