Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
JDBC (Java Database Connectivity) is een veelgebruikte standaard waarmee clienttoepassingen verbinding kunnen maken met en kunnen werken met gegevens uit databases en big data-platforms.
De Microsoft JDBC Driver for Fabric Data Engineering stelt je in staat om Spark-workloads in Fabric te verbinden, te bevragen en te beheren met de betrouwbaarheid en eenvoud van de JDBC-standaard. Gebouwd op Fabric's Livy-API's biedt de driver veilige en flexibele Spark SQL-connectiviteit naar je Java-applicaties en BI-tools. Deze integratie stelt je in staat om Spark-code direct in te dienen en uit te voeren zonder aparte notebook- of Spark-taakdefinitie-items te hoeven maken. Het stuurprogramma is compatibel met populaire JDBC-clients, zoals DbVisualizer en DBeaver, evenals BI-hulpprogramma's die ondersteuning bieden voor JDBC-connectiviteit, waaronder Tableau.
Belangrijke functies
- JDBC 4.2 API's: Implementeert JDBC 4.2 API's voor Spark SQL-connectiviteit, met Spark- en Livy-beperkingen zoals geen JDBC-transacties en alleen vooruitgestuurde, alleen-lezen resultaatsets
- Microsoft Entra ID-verificatie: meerdere verificatiestromen, waaronder interactieve, clientreferenties en verificatie op basis van certificaten
- Sessies met hoge mate van gelijktijdigheid: Optioneel delen van Fabric-sessies voor gelijktijdige werkbelastingen
-
Expliciete verbindingspooling: Kies HikariCP, een standaard poolmanager, of
LivyBuiltInPooledDataSource; directe toegangspunten poolen nooit - Spark SQL native query-ondersteuning: Directe uitvoering van Spark SQL-instructies zonder vertaling
- Uitgebreide ondersteuning voor gegevenstypen: ondersteuning voor alle Spark SQL-gegevenstypen, waaronder complexe typen (ARRAY, MAP, STRUCT)
- Asynchrone resultatenset prefetching: achtergrondgegevens laden voor verbeterde prestaties
- Circuit Breaker-patroon: beveiliging tegen cascaderende fouten met automatische pogingen
- Automatisch opnieuw verbinding maken: Transparant sessieherstel bij verbindingsfouten
- Geavanceerde logica voor opnieuw proberen: Opnieuw proberen met exponentieel uitstel en sessieherstel voor verbeterde tolerantie
- Proxyondersteuning: HTTP- en SOCKS-proxyconfiguratie voor bedrijfsomgevingen
Vereiste voorwaarden
Voordat je de Microsoft JDBC Driver for Fabric Data Engineering gebruikt, zorg ervoor dat je:
- Java Development Kit (JDK): Java 11, 17 en 21 (Java 21 aanbevolen)
- Fabric Access: Toegang tot een Fabric werkruimte
- Microsoft Entra ID referenties: juiste referenties voor verificatie
- Werkruimte- en Lakehouse-id's: GUID-id's voor uw Fabric-werkruimte en Lakehouse
Downloaden en installeren
Microsoft JDBC Driver for Fabric Data Engineering versie 2.0.1 ondersteunt Java 11, 17 en 21. Gebruik de nieuwste beschikbare versie.
- Download Microsoft JDBC Driver for Fabric Data Engineering (zip)
- Download Microsoft JDBC Driver for Fabric Data Engineering (tar)
- Download het zip- of tar-bestand via de bovenstaande koppelingen.
- Pak het gedownloade bestand uit om toegang te krijgen tot de JAR-bestanden van het stuurprogramma.
- Selecteer het JAR-bestand dat overeenkomt met uw JRE-versie:
- Voor Java 11:
ms-sparksql-jdbc-2.0.1.jre11.jar - Voor Java 17:
ms-sparksql-jdbc-2.0.1.jre17.jar - Voor Java 21:
ms-sparksql-jdbc-2.0.1.jre21.jar
- Voor Java 11:
- Voeg het geselecteerde JAR-bestand toe aan het klassepad van uw toepassing.
- Voor JDBC-clients configureert u de JDBC-stuurprogrammaklasse:
com.microsoft.spark.livy.jdbc.LivyDriver
Snelstartvoorbeeld
Dit voorbeeld laat zien hoe je verbinding maakt met Fabric en een query uitvoert met behulp van de Microsoft JDBC Driver for Fabric Data Engineering. Voordat je deze code uitvoert, zorg ervoor dat je aan de vereisten voldoet en de driver installeert. Door AuthFlow=2 te gebruiken, gebruikt het stuurprogramma DefaultAzureCredential. Om Azure CLI als bron voor de aanmeldingsgegevens te gebruiken, installeer je Azure CLI en voer az login uit.
import java.sql.*;
public class QuickStartExample {
public static void main(String[] args) {
// Connection string with required parameters
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=2;" + // DefaultAzureCredential; Azure CLI can be one source
"LogLevel=INFO";
try (Connection conn = DriverManager.getConnection(url)) {
// Execute a simple query
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Hello from Fabric!' as message")) {
if (rs.next()) {
System.out.println(rs.getString("message"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Formaat van verbindingsstring
Basisverbindingsreeks
De Microsoft JDBC Driver for Fabric Data Engineering gebruikt het volgende verbindingsreeks-formaat:
jdbc:fabricspark://<hostname>[:<port>][;<parameter1>=<value1>;<parameter2>=<value2>;...]
Componenten van de connection string
| Onderdeel | Description | Example |
|---|---|---|
| Protocol | JDBC URL-protocolidentificatie | jdbc:fabricspark:// |
| Hostnaam | Hostnaam van het Fabric-eindpunt | api.fabric.microsoft.com |
| port | Optioneel poortnummer (standaard: 443) | :443 |
| Parameters | Door puntkomma's gescheiden sleutel=waarde paren | FabricWorkspaceID=<guid> |
Voorbeeld van verbindingsreeksen
Basisverbinding (verificatie op basis van interactieve browser)
jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=1
Met Spark-resourceconfiguratie
jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;DriverCores=4;DriverMemory=4g;ExecutorCores=4;ExecutorMemory=8g;NumExecutors=2;AuthFlow=2
Met eigenschappen van Spark-sessie
jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;spark.sql.adaptive.enabled=true;spark.sql.shuffle.partitions=200;AuthFlow=2
Met modus voor hoge gelijktijdigheid
High-concurrency (HC) modus is beschikbaar voor Microsoft Fabric-verbindingen vanaf driverversie 1.1.0 en later. Voeg hcEnabled=true toe om een HC-sessie te verkrijgen in plaats van een klassieke Livy-sessie:
jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=2;hcEnabled=true
Je kunt optioneel de werklast identificeren met een sessietag en een Fabric-omgeving selecteren:
jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=2;hcEnabled=true;sessionTag=orders_etl;FabricEnvironmentID=<environment-id>
HC-modus moet worden ingeschakeld. Als hcEnabled wordt weggelaten of ingesteld op false, gebruikt de driver het klassieke Livius-sessiepad.
Zie de sectie High-Concurrency (HC) Mode voor volledige configuratierichtlijnen.
Authenticatie
De Microsoft JDBC Driver for Fabric Data Engineering ondersteunt meerdere authenticatiemethoden via Microsoft Entra ID (voorheen Azure Active Directory). Verificatie wordt geconfigureerd met behulp van de AuthFlow parameter in de verbindingsreeks.
Verificatiestromen
| AuthFlow | Verificatiemethode | Gebruikssituatie |
|---|---|---|
| 1 | Interactieve browser | Interactieve gebruikersverificatie met OAuth 2.0 |
| 2 | Standaard Azure-referentiegegevensketen | Ontwikkeling en beheerde applicatieauthenticatie; Azure CLI kan één bron van credentials zijn |
| 3 | Referenties voor clientgeheim (service-principal) | Geautomatiseerde/service-naar-service-authenticatie |
| 4 | Referentie voor clientcertificaat | Authenticatie van een service-principal op basis van certificaat |
| 5 | Toegangstoken | Vooraf verkregen bearer-toegangstoken |
Interactieve browserverificatie
Geschikt voor: Ontwikkeling en interactieve toepassingen
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=1;" +
"LogLevel=INFO";
Connection conn = DriverManager.getConnection(url);
Parameters:
-
AuthFlow=1: Specificeert interactieve browserverificatie
Gedrag:
- Hiermee opent u een browservenster voor gebruikersverificatie
- Cachet inloggegevens voor volgende verbindingen totdat ze verlopen
- Geschikt voor toepassingen met één gebruiker
Client- of Servicegebruikerauthenticatie
Geschikt voor: Geautomatiseerde services en achtergrondtaken
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=3;" +
"AuthClientID=<client-id>;" +
"AuthClientSecret=<client-secret>;" +
"AuthTenantID=<tenant-id>;" +
"LogLevel=INFO";
Connection conn = DriverManager.getConnection(url);
Vereiste parameters:
-
AuthFlow=3: Hiermee specificeert u client-credentials-authenticatie -
AuthClientID: Toepassings-ID (client) van Microsoft Entra ID -
AuthClientSecret: Clientgeheim van Microsoft Entra-id -
AuthTenantID: Microsoft Entra-tenant-id
Best practices:
- Geheimen veilig opslaan (Azure Key Vault, omgevingsvariabelen)
- Beheerde identiteiten gebruiken indien mogelijk
- Geheimen regelmatig roteren
Certificate-Based Authenticatie
Geschikt voor: Bedrijfstoepassingen waarvoor verificatie op basis van certificaten is vereist
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=4;" +
"AuthClientID=<client-id>;" +
"AuthCertificatePath=/path/to/certificate.pem;" +
"AuthCertificatePassword=<certificate-password>;" +
"AuthTenantID=<tenant-id>;" +
"LogLevel=INFO";
Connection conn = DriverManager.getConnection(url);
Vereiste parameters:
-
AuthFlow=4: Hiermee geeft u verificatie op basis van certificaten op -
AuthClientID: Applicatie-ID (client) -
AuthCertificatePath: Pad naar een PEM-certificaatbestand -
AuthCertificatePassword: Certificaatwachtwoord -
AuthTenantID: Microsoft Entra-tenant-id
Verificatie van toegangstokens
Geschikt voor: Scenario's voor aangepaste verificatie
// Acquire token through custom mechanism
String accessToken = acquireTokenFromCustomSource();
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=5;" + // Access token authentication
"AuthAccessToken=" + accessToken + ";" +
"LogLevel=INFO";
Connection conn = DriverManager.getConnection(url);
Verificatiecache
De driver cachet authenticatietokens en ververst deze op basis van de vervaldatum van de token. De parsed AuthEnableCaching en AuthCacheTTLMS eigenschappen sturen dit gedrag niet in versie 2.0.0.
Configuratieparameters
Vereiste parameters
Deze parameters moeten aanwezig zijn in elke verbindingsreeks:
| Kenmerk | Typologie | Description | Example |
|---|---|---|---|
FabricWorkspaceID |
UUID (universeel unieke identificator) | Fabric-werkruimte-id | <workspace-id> |
FabricLakehouseID |
UUID (universeel unieke identificator) | Fabric-lakehouse-id | <lakehouse-id> |
AuthFlow |
Integer | Verificatiestroomtype (1-5) | 2 |
Optionele parameters
API-versieconfiguratie
| Kenmerk | Typologie | Verstek | Description |
|---|---|---|---|
FabricVersion |
Snaar / Touwtje | v1 |
Fabric API-versie |
LivyApiVersion |
Snaar / Touwtje | 2023-12-01 |
Livy-API-versie |
Omgevingsconfiguratie
| Kenmerk | Typologie | Verstek | Description |
|---|---|---|---|
FabricEnvironmentID |
UUID (universeel unieke identificator) | Geen | Fabric-omgeving-ID voor het refereren aan een item binnen de omgeving voor een Spark-sessie |
Configuratie van sessies met hoge gelijktijdigheid
Ingesteld hcEnabled=true op HC-modus. De overige HC-eigenschappen worden alleen gebruikt wanneer HC-modus is ingeschakeld.
| Kenmerk | Typologie | Verstek | Description |
|---|---|---|---|
hcEnabled |
Booleaan | false |
Gebruikt een Fabric-sessie met hoge gelijktijdigheid. |
sessionTag |
Snaar / Touwtje | Geen | Optionele sessietag aan serverzijde. Gebruik 1 tot en met 64 letters, cijfers, onderstreepjes of koppeltekens. |
hcAcquireTimeoutSeconds |
Integer | 300 |
Maximale wachttijd tot de HC-sessie klaar is. Geldige waarden variëren van 120 tot en met 3.600 seconden. |
hcAcquirePollingIntervalMs |
Integer | 1000 |
Interval tussen statuscontroles van HC-sessies. Geaccepteerde waarden variëren van 50 tot 30.000 milliseconden en worden tijdens de uitvoering vastgezet op 100 tot 5.000 milliseconden. |
Example:
hcEnabled=true;sessionTag=interactive_reporting;hcAcquireTimeoutSeconds=600;hcAcquirePollingIntervalMs=2000;FabricEnvironmentID=<environment-id>
-
FabricEnvironmentIDgeldt voor zowel HC- als klassieke sessies -
EnvironmentIDwordt ook geaccepteerd als alias voor meerdere stuurprogramma's. Eigenschapsnamen zijn hoofdletterongevoelig.
Important
sessionTag Gebruik alleen voor niet-gevoelige operationele labels. Voeg geen geheimen, toegangstokens, persoonlijke gegevens, klantidentificaties of querytekst toe.
Zie de sectie High-Concurrency (HC) Mode voor volledige configuratierichtlijnen.
Spark-configuratie
Configuratie van sessieresource
Spark-sessiebronnen configureren voor optimale prestaties:
| Kenmerk | Typologie | Verstek | Description | Example |
|---|---|---|---|---|
DriverCores |
Integer | Spark-standaardwaarde | Aantal CPU-kernen voor stuurprogramma | 4 |
DriverMemory |
Snaar / Touwtje | Spark-standaardwaarde | Geheugentoewijzing voor stuurprogramma | 4g |
ExecutorCores |
Integer | Spark-standaardwaarde | Aantal CPU-kernen per uitvoerder | 4 |
ExecutorMemory |
Snaar / Touwtje | Spark-standaardwaarde | Geheugentoewijzing per uitvoerder | 8g |
NumExecutors |
Integer | Spark-standaardwaarde | Aantal uitvoerders | 2 |
SessionName |
Snaar / Touwtje | Automatisch gegenereerd | Aangepaste sessienaam | MySparkSession |
Example:
DriverCores=4;DriverMemory=4g;ExecutorCores=4;ExecutorMemory=8g;NumExecutors=2; SessionName=MySparkSession
Eigenschappen van aangepaste Spark-sessie
Elke parameter met het voorvoegsel spark. wordt automatisch toegepast op de Spark-sessie:
Voorbeeld van Spark-configuraties:
spark.sql.adaptive.enabled=true
spark.sql.adaptive.coalescePartitions.enabled=true
spark.sql.shuffle.partitions=200
spark.sql.autoBroadcastJoinThreshold=10485760
spark.dynamicAllocation.enabled=true
spark.dynamicAllocation.minExecutors=1
spark.dynamicAllocation.maxExecutors=10
spark.executor.memoryOverhead=1g
Systeemeigen uitvoeringsengine (NEE):
spark.nee.enabled=true
Volledig voorbeeld:
jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<guid>;FabricLakehouseID=<guid>;DriverMemory=4g;ExecutorMemory=8g;NumExecutors=2;spark.sql.adaptive.enabled=true;spark.nee.enabled=true;AuthFlow=2
HTTP-clientverbindingsinstellingen
Configureer de HTTP-transportverbindingen van de driver voor optimale netwerkprestaties. Deze instellingen configureren of beheren de JDBC-verbindingspooling niet:
| Kenmerk | Typologie | Verstek | Description |
|---|---|---|---|
HttpMaxTotalConnections |
Integer | 100 | Maximumaantal HTTP-verbindingen |
HttpMaxConnectionsPerRoute |
Integer | 20 | Maximum aantal verbindingen per route |
HttpConnectionTimeoutInSeconds |
Integer | 30 | Verbindingstijd is verlopen |
HttpSocketTimeoutInSeconds |
Integer | 60 | Time-out voor socketleesbewerking |
HttpReadTimeoutInSeconds |
Integer | 60 | Time-out voor HTTP-leesbewerking |
HttpConnectionRequestTimeoutSeconds |
Integer | 10 | Time-out van verbindingsaanvraag vanuit pool |
HttpEnableKeepAlive |
Booleaan | true | HTTP-keep-alive inschakelen |
HttpKeepAliveTimeoutSeconds |
Integer | 60 | Keep-alive time-out |
HttpFollowRedirects |
Booleaan | true | HTTP-omleidingen volgen |
HttpUseAsyncIO |
Booleaan | true | Asynchrone HTTP I/O gebruiken |
Example:
HttpMaxTotalConnections=200;HttpMaxConnectionsPerRoute=100;HttpConnectionTimeoutInSeconds=60
Proxyconfiguratie
HTTP- en SOCKS-proxyinstellingen configureren voor bedrijfsomgevingen:
| Kenmerk | Typologie | Verstek | Description |
|---|---|---|---|
UseProxy |
Booleaan | false | Proxy inschakelen |
ProxyTransport |
Snaar / Touwtje | http |
Proxy-transporttype (http/tcp) |
ProxyHost |
Snaar / Touwtje | Geen | Proxyhostnaam |
ProxyPort |
Integer | Geen | Proxypoort |
ProxyAuthEnabled |
Booleaan | false | Proxyverificatie inschakelen |
ProxyUsername |
Snaar / Touwtje | Geen | Gebruikersnaam voor proxyverificatie |
ProxyPassword |
Snaar / Touwtje | Geen | Wachtwoord voor proxyverificatie |
ProxyAuthScheme |
Snaar / Touwtje | basic |
Authenticatieschema (basic/digest/ntlm) |
ProxySocksVersion |
Integer | 5 | SOCKS-versie (4/5) |
Voorbeeld van HTTP-proxy:
UseProxy=true;ProxyTransport=http;ProxyHost=proxy.company.com;ProxyPort=8080;ProxyAuthEnabled=true;ProxyUsername=user;ProxyPassword=pass
Voorbeeld van SOCKS-proxy:
UseProxy=true;ProxyTransport=tcp;ProxyHost=socks.company.com;ProxyPort=1080;ProxySocksVersion=5
Configuratie van logboekregistratie
| Kenmerk | Typologie | Verstek | Description |
|---|---|---|---|
LogLevel |
Snaar / Touwtje | WARN |
Niveau van logboekregistratie: TRACE, DEBUG, INFO, WAARSCHUWING, FOUT |
Example:
LogLevel=DEBUG
Standaardlocatie van logboek:
${user.home}/.microsoft/livy-jdbc-driver/logs/driver.log
Aangepaste logboekconfiguratie: Gebruik een aangepast log4j2.xml bestand of logback.xml bestand in uw klaspad.
Modus voor hoge gelijktijdigheid (HC)
High-concurrency (HC) modus is ontworpen voor JDBC-applicaties die meerdere verbindingen openen naar dezelfde Fabric-werkruimte en lakehouse. In plaats van voor elke verbinding een aparte klassieke Spark-sessie te provisioneren, bedient Fabric die verbindingen met gedeelde, serverbeheerde Spark-capaciteit.
HC-modus kan de opstarttijd van de verbinding verkorten, herhaalde Spark-sessieprovisioning vermijden en beschikbare capaciteit efficiënter benutten voor gelijktijdige workloads. Elke JDBC-verbinding blijft statements uitvoeren via zijn toegewezen context binnen de HC-sessie.
HC-modus is opt-in en vult JDBC verbindingspooling aan. HC-modus beheert Fabric Spark-sessies op de server, terwijl JDBC-verbindingspooling de verbindingen in de clientapplicatie beheert. Als je HC-modus niet inschakelt, maakt de driver een klassieke Livy-sessie aan.
Kies tussen HC en classic mode
Gebruik HC-modus wanneer:
- Een applicatieservice verwerkt gelijktijdige verzoeken die Spark SQL via meerdere JDBC-verbindingen uitvoeren.
- Een BI- of rapportagetool opent meerdere verbindingen naar dezelfde werkruimte en lakehouse.
- Parallelle ETL-taken of geplande taken veroorzaken pieken in het aantal JDBC-verbindingen.
- Verbindingen gebruiken compatibele Spark-configuraties en kunnen serverbeheerde Spark-capaciteit delen.
- Het verkorten van de opstarttijd van de verbinding en het herhaald provisioneren van Spark-sessies is belangrijk.
Gebruik de klassieke modus wanneer:
- Je applicatie gebruikt slechts één of een paar langlopende JDBC-verbindingen.
- Elke verbinding vereist een speciale Spark-sessie voor strikte werklast- of resource-isolatie.
- Verbindingen vereisen aanzienlijk verschillende Spark-configuraties of Fabric-omgevingen.
- Het Fabric Livy-eindpunt voor de doelwerkruimte en het lakehouse biedt geen ondersteuning voor HC-modus.
Schakel de modus voor hoge gelijktijdigheid in
HC-modus moet worden ingeschakeld. Als je het weglaat hcEnabled of op false zet, gebruikt de driver het klassieke Livy-sessiepad. Zet hcEnabled op true om een HC-sessie te verkrijgen:
hcEnabled=true;
Vereiste parameters in HC-modus
HC-activatie vereist de volgende geldige identificaties:
| Kenmerk | Opmerkingen |
|---|---|
WorkspaceId |
Moet een geldige Fabric workspace GUID zijn. |
LakehouseId |
Moet een geldige Fabric lakehouse GUID zijn. |
Neem het op SessionTag omdat het server-side matching voor warme sessies beïnvloedt.
Sessiekoppeling
HC-modus garandeert niet dat elke verbinding een bestaande sessie hergebruikt. Voor elk sessie-acquisitieverzoek stuurt de driver het volgende:
- De
SessionTag-waarde. - De effectieve Spark-configuratie, inclusief
conf.*instellingen enEnvironmentId.
De Fabric Livy-dienst beoordeelt deze waarden en beslist of de verbinding aan een warme sessie wordt gekoppeld of een nieuwe sessie wordt aangemaakt. Om het hergebruik van sessies te verbeteren, gebruik consistente waarden over verbindingen die bedoeld zijn om serverbeheerde Spark-capaciteit te delen.
Schakel HC-modus uit
Je kunt nieuwe HC-sessieverwervingen uitschakelen zonder de driver opnieuw uit te rollen door de HC-verbindingsreeks op false te zetten of door de HC-parameters te verwijderen:
hcEnabled=false;
Noodterugrollen: Voor noodterugrol start je de JVM met -Dcom.microsoft.fabric.jdbc.hc.disable=true. Deze JVM-brede schakelaar dwingt de klassieke modus af, zelfs wanneer een verbindingsreeks hcEnabled=true bevat.
Begrijp het uitvoerende gedrag van HC
- Het verkrijgen van de HC-sessie wordt geblokkeerd totdat de sessie gereed is of
hcAcquireTimeoutSecondsverloopt. - Het sluiten van een verbinding terwijl de acquisitie bezig is onderbreekt de acquisitie en activeert een best-effort-opruiming van de HC-sessie.
- Authenticatie, uitvoering van query's, annuleren, prepared statements, resultaatafhandeling en
FabricEnvironmentIDverlopen in beide modi via de standaard JDBC-interfaces.
Gebruiksvoorbeelden
Basisverbinding
import java.sql.*;
public class BasicConnectionExample {
public static void main(String[] args) {
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=2";
try (Connection conn = DriverManager.getConnection(url)) {
System.out.println("Connected successfully!");
System.out.println("Database: " + conn.getMetaData().getDatabaseProductName());
System.out.println("Driver: " + conn.getMetaData().getDriverName());
System.out.println("Driver Version: " + conn.getMetaData().getDriverVersion());
} catch (SQLException e) {
System.err.println("Connection failed: " + e.getMessage());
e.printStackTrace();
}
}
}
Verbinding in modus voor hoge gelijktijdigheid
Het volgende voorbeeld opent een JDBC-verbinding in HC-modus, voert een query uit en verzicht automatisch op de verbinding:
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=2;" +
"hcEnabled=true;" +
"sessionTag=dashboard_queries;" +
"FabricEnvironmentID=<environment-id>";
try (Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT current_timestamp()")) {
while (rs.next()) {
System.out.println(rs.getTimestamp(1));
}
}
Queries uitvoeren
Eenvoudige query
public void executeSimpleQuery(Connection conn) throws SQLException {
String sql = "SELECT current_timestamp() as now";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
if (rs.next()) {
Timestamp now = rs.getTimestamp("now");
System.out.println("Current timestamp: " + now);
}
}
}
Query met filter
public void executeQueryWithFilter(Connection conn) throws SQLException {
String sql = "SELECT * FROM sales WHERE amount > 1000 ORDER BY amount DESC";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
int id = rs.getInt("id");
double amount = rs.getDouble("amount");
Date date = rs.getDate("sale_date");
System.out.printf("ID: %d, Amount: %.2f, Date: %s%n",
id, amount, date);
}
}
}
Query met limiet
public void executeQueryWithLimit(Connection conn) throws SQLException {
String sql = "SELECT * FROM customers LIMIT 10";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
// Print column names
for (int i = 1; i <= columnCount; i++) {
System.out.print(metaData.getColumnName(i) + "\t");
}
System.out.println();
// Print rows
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
System.out.print(rs.getString(i) + "\t");
}
System.out.println();
}
}
}
Werken met resultatensets
Resultsets doorlopen
public void navigateResultSet(Connection conn) throws SQLException {
String sql = "SELECT id, name, amount FROM orders";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
System.out.printf(
"Order %d: %s, %.2f%n",
rs.getInt("id"),
rs.getString("name"),
rs.getDouble("amount"));
}
}
}
Resultsets zijn alleen voorwaarts en schrijfbeveiligd. De driver ondersteunt geen methoden zoals first(), last(), en absolute().
Grote resultatensets verwerken
De driver pagineert resultaten op basis van de responsgrootte. Configureer LivyStatementPageSize in de JDBC-URL om de gevraagde paginagrootte in bytes in te stellen. De Statement.setFetchSize() methode regelt het ophalen of geheugengebruik niet.
jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=2;LivyStatementPageSize=1048576
public void processLargeResultSet(Connection conn) throws SQLException {
String sql = "SELECT * FROM large_table";
try (Statement stmt = conn.createStatement()) {
try (ResultSet rs = stmt.executeQuery(sql)) {
int rowCount = 0;
while (rs.next()) {
// Process row
processRow(rs);
rowCount++;
if (rowCount % 10000 == 0) {
System.out.println("Processed " + rowCount + " rows");
}
}
System.out.println("Total rows processed: " + rowCount);
}
}
}
private void processRow(ResultSet rs) throws SQLException {
// Process individual row
}
Voorbereide instructies gebruiken
public void usePreparedStatement(Connection conn) throws SQLException {
String sql = "SELECT * FROM products WHERE category = ? AND price > ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
// Set parameters
pstmt.setString(1, "Electronics");
pstmt.setDouble(2, 100.0);
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
String name = rs.getString("name");
double price = rs.getDouble("price");
System.out.printf("Product: %s, Price: $%.2f%n", name, price);
}
}
}
}
Batchverwerkingen
De driver ondersteunt geen JDBC-transacties. Batchuitvoering is niet-transactioneel en kan gedeeltelijk slagen. Een latere mislukking draait eerdere succesvolle verklaringen niet terug.
public void executeBatchInsert(Connection conn) throws SQLException {
String sql = "INSERT INTO logs (timestamp, level, message) VALUES (?, ?, ?)";
int pendingStatements = 0;
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
// Add multiple statements to batch
for (int i = 0; i < 1000; i++) {
pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
pstmt.setString(2, "INFO");
pstmt.setString(3, "Log message " + i);
pstmt.addBatch();
pendingStatements++;
// Execute batch every 100 statements
if ((i + 1) % 100 == 0) {
pstmt.executeBatch();
pstmt.clearBatch();
pendingStatements = 0;
}
}
if (pendingStatements > 0) {
pstmt.executeBatch();
}
System.out.println("Batch insert completed successfully");
}
}
Kies een verbindingseigenaar
Kies één onderdeel om de verbindingslevenscyclus te bezitten. Plaats niet de ene verbindingspool in een andere.
| Gebruiksmodel | Ingangspunt | Zwembadeigenaar | Een geleend Connection sluiten |
Eigenaar van de afsluiting |
|---|---|---|---|---|
| Onmiddellijk |
DriverManager, of LivyDriverLivyDataSource |
Geen | Sluit fysiek de afzonderlijke Livy-verbinding en sessie. | De applicatie sluit elke verbinding. Een directe LivyDataSource heeft geen aparte gesloten levenscyclus. |
| Externe HikariCP |
HikariDataSource ondersteund door een JDBC-URL of LivyDataSource |
Alleen HikariCP | Geeft de Hikari-proxyverbinding terug aan HikariCP. | De applicatie sluit zijn behoudene HikariDataSource. |
| Expliciet ingebouwd zwembad | LivyBuiltInPooledDataSource |
Eén LivyConnectionPool die alleen wordt aangemaakt wanneer nodig voor elke geconfigureerde databron-generatie |
Stopt het logische huurcontract en gebruikt de fysieke sessie pas opnieuw na een veilige schoonmaak. | De applicatie sluit zijn behouden ingebouwde databron. |
| Standaard pooling-SPI |
LivyConnectionPoolDataSource maakt objecten aan PooledConnection voor een poolmanager in het middenniveau |
De poolmanager van het middenniveau, niet de fabriek | Sluit de logische handle en waarschuwt de manager synchroon na het opruimen. | De manager belt PooledConnection.close() om elke fysieke verbinding te vernietigen. |
ConnectionPoolEnabled is standaard ingesteld op false in zowel de drivercode als de meegeleverde eigenschappen. Het is geen inschakeloptie voor de huidige toegangspunten. Gebruik LivyBuiltInPooledDataSource wanneer de driver eigenaar moet zijn van de pool, of configureer een externe pool zoals HikariCP. De andere toegangspunten creëren directe, niet-pool-eigenaar verbindingen.
Verbindingspooling met HikariCP
HikariCP kan verbindingen maken vanuit zowel LivyDataSource als de JDBC-URL, via LivyDriver. Maak één HikariCP-instantie aan, hergebruik deze voor de applicatielevensduur en gebruik slechts één verbindingspool in elke configuratie.
Maven-afhankelijkheid
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
Gebruik LivyDataSource
LivyDataSource Maakt onafhankelijke fysieke verbindingen en bezit geen verbindingspool of een aparte hechte levenscyclus. Geef het rechtstreeks aan HikariCP zodat HikariCP de enige zwembadeigenaar is:
import com.microsoft.spark.livy.jdbc.LivyDataSource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public final class ConnectionPoolExample implements AutoCloseable {
private final HikariDataSource hikariDataSource;
public ConnectionPoolExample(String url) {
LivyDataSource configuredDataSource = new LivyDataSource();
configuredDataSource.setUrl(url);
HikariConfig config = new HikariConfig();
config.setDataSource(configuredDataSource);
config.setMaximumPoolSize(2);
config.setMinimumIdle(0);
config.setConnectionTimeout(900000); // Wait up to 15 minutes for a connection
config.setInitializationFailTimeout(-1); // Connect on demand
config.setIdleTimeout(600000); // 10 minutes
config.setMaxLifetime(1800000); // 30 minutes
config.setPoolName("FabricSparkPool");
hikariDataSource = new HikariDataSource(config);
}
public Connection getConnection() throws SQLException {
return hikariDataSource.getConnection();
}
@Override
public void close() {
hikariDataSource.close();
}
public static void main(String[] args) throws SQLException {
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=AZURE_CLI;" +
"hcEnabled=true;" +
"sessionTag=pooled_app;" +
"hcAcquireTimeoutSeconds=600";
try (ConnectionPoolExample pool = new ConnectionPoolExample(url);
Connection conn = pool.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Pooled connection!' as message")) {
if (rs.next()) {
System.out.println(rs.getString("message"));
}
}
}
}
Het voorbeeld schakelt HC-modus in de JDBC-URL in. HikariCP beheert client-side verbindingen, terwijl HC-modus gedeelde Spark-sessies in Fabric beheert. Verwijder hcEnabled en sessionTag als de applicatie klassieke sessies vereist.
Gebruik direct LivyDriver
Configureer de JDBC-URL en driverklasse zodat HikariCP fysieke verbindingen maakt via LivyDriver. Het expliciet opgeven van de driverklasse is optioneel wanneer automatische detectie van de JDBC-serviceprovider beschikbaar is. Deze configuratie instantieert LivyDataSourceniet , dus de ingebouwde pool is niet betrokken:
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public final class DriverConnectionPoolExample {
public static HikariDataSource createPool(String url) {
HikariConfig config = new HikariConfig();
config.setDriverClassName("com.microsoft.spark.livy.jdbc.LivyDriver");
config.setJdbcUrl(url);
// Keep pool sizes small: each classic-mode physical connection owns a Livy session.
config.setMaximumPoolSize(2);
config.setMinimumIdle(0);
config.setConnectionTimeout(900000); // Wait up to 15 minutes to borrow a connection
config.setInitializationFailTimeout(-1); // Skip startup validation; connect on demand
config.setIdleTimeout(600000); // 10 minutes
config.setMaxLifetime(1800000); // 30 minutes
config.setPoolName("FabricSparkDriverPool");
return new HikariDataSource(config);
}
public static void main(String[] args) throws SQLException {
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=AZURE_CLI;" + // Uses the DefaultAzureCredential chain
"hcEnabled=true;" +
"sessionTag=pooled_app;" +
"hcAcquireTimeoutSeconds=600"; // Poll up to 10 minutes for HC readiness
// Reuse this pool for the application lifetime; main closes it at process exit.
try (HikariDataSource pool = createPool(url);
Connection conn = pool.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Pooled LivyDriver connection!' as message")) {
if (rs.next()) {
System.out.println(rs.getString("message"));
}
}
}
}
Gebruik de volgende richtlijnen bij het configureren van de pool:
| Instelling of gedrag | Guidance |
|---|---|
| Eigendom van het zwembad |
LivyDataSource is alleen rechtstreeks. Wanneer je het levert aan HikariCP, is HikariCP eigenaar van het zwembad. Gebruik LivyBuiltInPooledDataSource in plaats daarvan wanneer de chauffeur eigenaar zou moeten zijn van de pool. |
| Poolgrootte | Begin met een kleine pool en vergroot deze pas nadat je de gelijktijdigheid van de werklast en het capaciteitsgebruik hebt gemeten. In de klassieke modus heeft elke fysieke verbinding een Livy-sessie. In HC-modus kunnen verbindingen serverbeheerde Spark-capaciteit delen. |
connectionTimeout |
Bepaalt hoe lang een beller wacht om een verbinding te lenen, maar annuleert een verbindingspoging die al bezig is niet. Voor HC-URL's, ondersteun hcAcquireTimeoutSeconds; ondersteun voor de klassieke modus LivySessionTimeoutSeconds, authenticatie, HTTP-herhalingen en validatie. HikariCP drukt deze instelling uit in milliseconden. |
initializationFailTimeout |
Een negatieve waarde slaat de opstartverbinding en validatiepoging over. Connectiviteitsstoringen komen dan naar voren wanneer de applicatie voor het eerst een verbinding aanvraagt. Gebruik een positieve waarde als de applicatie de connectiviteit tijdens het opstarten moet verifiëren. |
| Verificatie van de verbinding | HikariCP gebruikt Connection.isValid(). De effectieve duur wordt bepaald door de HTTP-timeout en retry/backoff-instellingen van de driver, niet door die validationTimeoutvan HikariCP. Configureer geen verbindingstestquery, want die vervangt de lichtere validatiecheck door een Spark-instructie. |
Voor de volledige lijst van HikariCP-configuratieopties, zie:
Gegevenstypemapping
Het stuurprogramma wijst Spark SQL-gegevenstypen toe aan JDBC SQL-typen en Java-typen:
| Spark SQL-type | JDBC SQL-type | Java type | Opmerkingen |
|---|---|---|---|
BOOLEAN |
BOOLEAN |
Boolean |
|
BYTE |
TINYINT |
Byte |
|
SHORT |
SMALLINT |
Short |
|
INT |
INTEGER |
Integer |
|
LONG |
BIGINT |
Long |
|
FLOAT |
FLOAT |
Float |
|
DOUBLE |
DOUBLE |
Double |
|
DECIMAL |
DECIMAL |
BigDecimal |
Precisie en schaal behouden |
STRING |
VARCHAR |
String |
|
VARCHAR(n) |
VARCHAR |
String |
|
CHAR(n) |
CHAR |
String |
|
BINARY |
BINARY |
byte[] |
|
DATE |
DATE |
java.sql.Date |
|
TIMESTAMP |
TIMESTAMP |
java.sql.Timestamp |
|
ARRAY |
ARRAY |
String |
Opgehaald als JSON-tekst; metadatatype garandeert geen volledige java.sql.Array accessor-ondersteuning |
MAP |
JAVA_OBJECT |
String |
Geraadpleegd als JSON-tekst |
STRUCT |
STRUCT |
String |
Opgehaald als JSON-tekst; metadatatype garandeert geen volledige java.sql.Struct accessor-ondersteuning |