Microsoft Fabric Veri Mühendisliği için Microsoft JDBC sürücüsü

JDBC (Java Veritabanı Bağlantısı), istemci uygulamalarının veritabanlarından ve büyük veri platformlarından verilere bağlanmasını ve verilerle çalışmasını sağlayan yaygın olarak benimsenen bir standarttır.

Microsoft JDBC Driver for Fabric Data Engineering, JDBC standardının güvenilirliği ve sadeliğiyle Fabric'te Spark iş yüklerini bağlamanıza, sorgulamanıza ve yönetmenize olanak tanır. Fabric'in Livy API'leri üzerine inşa edilen sürücü, Java uygulamalarınıza ve BI araçlarınıza güvenli ve esnek Spark SQL bağlantısı sağlar. Bu entegrasyon, ayrı bir notebook veya Spark iş tanımı öğeleri oluşturmadan doğrudan Spark kodunu gönderip çalıştırmanızı sağlar. Sürücü, DbVisualizer ve DBeaver gibi popüler JDBC istemcilerinin yanı sıra Tableau da dahil olmak üzere JDBC bağlantısını destekleyen BI araçlarıyla uyumludur.

Önemli Özellikler    

  • JDBC 4.2 Uyumlu: JDBC 4.2 belirtiminin tam uygulaması
  • Microsoft Entra Id Kimlik Doğrulaması: Etkileşimli, istemci kimlik bilgileri ve sertifika tabanlı kimlik doğrulaması dahil olmak üzere birden çok kimlik doğrulama akışı
  • HikariCP entegrasyonu: HikariCP'yi üretim uygulamaları için JDBC bağlantılarını yönetmek ve yeniden kullanmak için kullanın
  • Spark SQL Yerel Sorgu Desteği: Spark SQL deyimlerinin çeviri olmadan doğrudan yürütülmesi
  • Kapsamlı Veri Türü Desteği: Karmaşık türler (ARRAY, MAP, STRUCT) dahil olmak üzere tüm Spark SQL veri türleri için destek
  • Asenkron Sonuç Kümesi Ön Yükleme: Gelişmiş performans için arka plan verisi yükleme
  • Devre Kesici Düzeni: Otomatik yeniden deneme ile basamaklı hatalara karşı koruma
  • Otomatik Yeniden Bağlantı: Bağlantı hatalarında saydam oturum kurtarma
  • Gelişmiş Yeniden Deneme Mantığı: İyileştirilmiş dayanıklılık için üstel geri çekilme ve oturum kurtarma ile yeniden deneme
  • Proxy Desteği: Kurumsal ortamlar için HTTP ve SOCKS proxy yapılandırması

Önkoşullar

Microsoft JDBC Driver for Fabric Data Engineering'i kullanmadan önce, aşağıdaki özelliklere sahip olduğunuzdan emin olun:

  • Java Development Kit (JDK): Sürüm 11 veya üzeri (Java 21 önerilir)
  • Fabric Erişimi: Bir Fabric çalışma alanına erişim
  • Microsoft Entra ID kimlik bilgileri: Kimlik doğrulaması için uygun kimlik bilgileri
  • Çalışma Alanı ve Lakehouse Kimlikleri: Fabric çalışma alanınız ve lakehouse'unuz için GUID tanımlayıcıları

İndirme ve Yükleme

Microsoft JDBC Driver for Fabric Data Engineering sürüm 1.0.0, Java 11, 17 ve 21'i destekler. Java bağlantı desteğini sürekli geliştiriyoruz ve Microsoft JDBC sürücüsünün en son sürümüyle çalışmanızı öneririz.

  1. Yukarıdaki bağlantılardan zip veya tar dosyasını indirin.
  2. Sürücü JAR dosyalarına erişmek için indirilen dosyayı ayıklayın.
  3. JRE sürümünüzle eşleşen JAR dosyasını seçin:
    • Java 11 için: ms-sparksql-jdbc-1.0.1.jre11.jar
    • Java 17 için: ms-sparksql-jdbc-1.0.1.jre17.jar
    • Java 21 için: ms-sparksql-jdbc-1.0.1.jre21.jar
  4. Seçili JAR dosyasını uygulamanızın sınıf yolu içine ekleyin.
  5. JDBC istemcileri için JDBC sürücü sınıfını yapılandırın: com.microsoft.spark.livy.jdbc.LivyDriver

Hızlı Başlangıç Örneği

Bu örnek, Microsoft JDBC Driver for Fabric Data Engineering kullanılarak Fabric'e nasıl bağlanıp bir sorgu yürütüleceğini gösterir. Bu kodu çalıştırmadan önce önkoşulları tamamladığınızdan ve sürücüyü yüklediğinizden emin olun.

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;" +  // Azure CLI based authentication
                     "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();
        }
    }
}

Bağlantı Dizesi Biçimi

Temel Bağlantı Dizesi

Microsoft JDBC Driver for Fabric Data Engineering aşağıdaki bağlantı dizesi formatını kullanır:

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

Bağlantı Dizesi Bileşenleri

Bileşen Description Example
Protokol JDBC URL protokolü tanımlayıcısı jdbc:fabricspark://
Ana Bilgisayar Adı Fabric endpoint hostname api.fabric.microsoft.com
Port İsteğe bağlı bağlantı noktası numarası (varsayılan: 443) :443
Parametreler Noktalı virgülle ayrılmış anahtar=değer çiftleri FabricWorkspaceID=<guid>

Örnek Bağlantı Dizeleri

Temel Bağlantı (Etkileşimli Tarayıcı Tabanlı Kimlik Doğrulaması)

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

Spark Kaynak Yapılandırması ile

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

Spark Oturumu Özellikleri ile

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

Authentication

Microsoft JDBC Driver for Fabric Data Engineering, Microsoft Entra ID (eski adıyla Azure Active Directory) üzerinden birden fazla kimlik doğrulama yöntemini destekler. Kimlik doğrulaması, bağlantı dizesindeki AuthFlow parametresi kullanılarak yapılandırılır.

Kimlik Doğrulama Akışları

Kimlik Doğrulama Akışı Kimlik Doğrulama Yöntemi Kullanım Örneği
1 Etkileşimli Tarayıcı OAuth 2.0 kullanarak etkileşimli kullanıcı kimlik doğrulaması
2 Azure Komut Satırı Arayüzü (Azure CLI) Azure CLI kullanarak geliştirme
3 İstemci Gizli Kimlik Bilgileri (Hizmet Prensibi) Otomatik/hizmet-hizmet kimlik doğrulaması
4 İstemci Sertifikası Kimlik Bilgileri Sertifika tabanlı hizmet sorumlusu kimlik doğrulaması
5 Erişim Belirteci Önceden alınan taşıyıcı erişim belirteci

Etkileşimli Tarayıcı Kimlik Doğrulaması

İçin en iyisi: Geliştirme ve etkileşimli uygulamalar

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

Connection conn = DriverManager.getConnection(url);

Parametreler:

  • AuthFlow=1: Etkileşimli tarayıcı kimlik doğrulamayı belirtir
  • AuthTenantID (isteğe bağlı): Microsoft Entra kiracı kimliği
  • AuthClientID (isteğe bağlı): Uygulama (istemci) kimliği

Davranış:

  • Kullanıcı kimlik doğrulaması için bir tarayıcı penceresi açar
  • Kimlik bilgileri süresi dolana kadar sonraki bağlantılar için önbelleğe alınır
  • Tek kullanıcılı uygulamalar için uygundur

İstemci Kimlik Bilgileri veya Hizmet Sorumlusu Kimlik Doğrulaması

En uygun: Otomatik hizmetler ve arka plan işleri

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

Gerekli Parametreler:

  • AuthFlow=3: İstemci kimlik bilgileri ile kimlik doğrulaması yapılmasını belirtir
  • AuthClientID: Microsoft Entra Id'den uygulama (istemci) kimliği
  • AuthClientSecret: Microsoft Entra ID'den istemci sırrı
  • AuthTenantID: Microsoft Entra kiracı kimliği

En İyi Yöntemler:

  • Gizli dizileri güvenli bir şekilde depolama (Azure Key Vault, ortam değişkenleri)
  • Mümkün olduğunda yönetilen kimlikleri kullanma
  • Gizli anahtarları düzenli olarak döndürün

Certificate-Based Kimlik Doğrulaması

En iyisi: Sertifika tabanlı kimlik doğrulaması gerektiren kurumsal uygulamalar

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=4;" +  
             "AuthClientID=<client-id>;" +
             "AuthCertificatePath=/path/to/certificate.pfx;" +
             "AuthCertificatePassword=<certificate-password>;" +
             "AuthTenantID=<tenant-id>;" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Gerekli Parametreler:

  • AuthFlow=4: Sertifika tabanlı kimlik doğrulamayı belirtir
  • AuthClientID: Uygulama (istemci) kimliği
  • AuthCertificatePath: PFX/PKCS12 sertifika dosyasının yolu
  • AuthCertificatePassword: Sertifika parolası
  • AuthTenantID: Microsoft Entra kiracı kimliği

Erişim Belirteci Kimlik Doğrulaması

En iyisi: Özel kimlik doğrulama senaryoları

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

Kimlik Doğrulaması Önbellekleme

Sürücü, performansı geliştirmek için kimlik doğrulama belirteçlerini otomatik olarak önbelleğe alır:

// Enable/disable caching (enabled by default)
String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=2;" +
             "AuthEnableCaching=true;" +  // Enable token caching
             "AuthCacheTTLMS=3600000";    // Cache TTL: 1 hour

Connection conn = DriverManager.getConnection(url);

Yapılandırma Parametreleri

Gerekli Parametreler

Bu parametreler her bağlantı dizesinde bulunmalıdır:

Parametre Türü Description Example
FabricWorkspaceID UUID Doku çalışma alanı tanımlayıcısı <workspace-id>
FabricLakehouseID UUID Fabric göl evi tanımlayıcısı <lakehouse-id>
AuthFlow Integer Kimlik doğrulama akışı türü (1-5) 2

İsteğe Bağlı Parametreler

API Sürüm Yapılandırması

Parametre Türü Varsayılan Description
FabricVersion String v1 Fabric API sürümü
LivyApiVersion String 2023-12-01 Livy API sürümü

Ortam Yapılandırması

Parametre Türü Varsayılan Description
FabricEnvironmentID UUID Hiç kimse Spark oturumu için bir ortam öğesine başvurmak amacıyla doku ortamı tanımlayıcısı.

Spark Yapılandırması

Oturum Kaynağı Yapılandırması

Spark oturum kaynaklarını en iyi performans için yapılandırın:

Parametre Türü Varsayılan Description Example
DriverCores Integer Spark varsayılanı Sürücü için CPU çekirdeği sayısı 4
DriverMemory String Spark varsayılanı Sürücü için bellek ayırma 4g
ExecutorCores Integer Spark varsayılanı Yürütücü başına CPU çekirdeği sayısı 4
ExecutorMemory String Spark varsayılanı Yürütücü başına bellek ayırma 8g
NumExecutors Integer Spark varsayılanı Yürütücü sayısı 2

Example:

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

Özel Spark Oturumu Özellikleri

Öneki spark. olan tüm parametreler Spark oturumuna otomatik olarak uygulanır:

Örnek Spark Yapılandırmaları:

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

Yerel Yürütme Altyapısı (NEE):

spark.nee.enabled=true

Tam Örnek:

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 istemci bağlantı ayarları

Sürücünün HTTP taşıma bağlantılarını en iyi ağ performansı için yapılandırın. Bu ayarlar JDBC bağlantı havuzunu yapılandırmaz veya yönetmez:

Parametre Türü Varsayılan Description
HttpMaxTotalConnections Integer 100 Toplam HTTP bağlantısı sayısı üst sınırı
HttpMaxConnectionsPerRoute Integer 50 Yol başına en fazla bağlantı sayısı
HttpConnectionTimeoutInSeconds Integer 30 Bağlantı zaman aşımı
HttpSocketTimeoutInSeconds Integer 60 Socket okuma zaman aşımı
HttpReadTimeoutInSeconds Integer 60 HTTP okuma zaman aşımı
HttpConnectionRequestTimeoutSeconds Integer 30 Havuzdan bağlantı isteği zaman aşımı hatası
HttpEnableKeepAlive Boolean true HTTP etkin tutma özelliğini etkinleştirme
HttpKeepAliveTimeoutSeconds Integer 60 Bağlantıyı açık tutma zaman aşımı
HttpFollowRedirects Boolean true HTTP yeniden yönlendirmelerini takip et
HttpUseAsyncIO Boolean false Asenkron HTTP G/Ç kullanımı

Example:

HttpMaxTotalConnections=200;HttpMaxConnectionsPerRoute=100;HttpConnectionTimeoutInSeconds=60

Ara Sunucu Yapılandırması

Kurumsal ortamlar için HTTP ve SOCKS proxy ayarlarını yapılandırın:

Parametre Türü Varsayılan Description
UseProxy Boolean false Ara sunucuyu etkinleştirme
ProxyTransport String http Ara sunucu aktarım türü (http/tcp)
ProxyHost String Hiç kimse Proxy ana bilgisayar adı
ProxyPort Integer Hiç kimse Proxy bağlantı noktası
ProxyAuthEnabled Boolean false Proxy kimlik doğrulamasını etkinleştirme
ProxyUsername String Hiç kimse Proxy kimlik doğrulaması kullanıcı adı
ProxyPassword String Hiç kimse Proxy kimlik doğrulama parolası
ProxyAuthScheme String basic Kimlik doğrulama düzeni (temel/özet/ntlm)
ProxySocksVersion Integer 5 SOCKS sürümü (4/5)

HTTP Proxy Örneği:

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

SOCKS Proxy Örneği:

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

Günlük Kaydı Yapılandırması

Parametre Türü Varsayılan Description
LogLevel String INFO Günlük düzeyi: İZLEME, HATA AYıKLAMA, BİlGİ, UYARI, HATA

Example:

LogLevel=DEBUG

Varsayılan Günlük Konumu:

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

Özel Günlük Yapılandırması: Sınıf yolunuzda log4j2.xml veya logback.xml adlı özel bir dosya kullanın.


Kullanım Örnekleri

Temel Bağlantı

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

Sorgu Çalıştırma

Basit Sorgu

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

Filtreli Sorgu

public void executeQueryWithFilter(Connection conn) throws SQLException {
    String sql = "SELECT * FROM sales WHERE amount > 1000 ORDER BY amount DESC";
    
    try (Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {
        
        while (rs.next()) {
            int id = rs.getInt("id");
            double amount = rs.getDouble("amount");
            Date date = rs.getDate("sale_date");
            
            System.out.printf("ID: %d, Amount: %.2f, Date: %s%n", 
                            id, amount, date);
        }
    }
}

Sınıra Sahip Sorgu

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

Sonuç Kümeleriyle Çalışma

public void navigateResultSet(Connection conn) throws SQLException {
    String sql = "SELECT id, name, amount FROM orders";
    
    try (Statement stmt = conn.createStatement(
            ResultSet.TYPE_SCROLL_INSENSITIVE,
            ResultSet.CONCUR_READ_ONLY);
         ResultSet rs = stmt.executeQuery(sql)) {
        
        // Move to first row
        if (rs.first()) {
            System.out.println("First row: " + rs.getString("name"));
        }
        
        // Move to last row
        if (rs.last()) {
            System.out.println("Last row: " + rs.getString("name"));
            System.out.println("Total rows: " + rs.getRow());
        }
        
        // Move to specific row
        if (rs.absolute(5)) {
            System.out.println("Row 5: " + rs.getString("name"));
        }
    }
}

Büyük Sonuç Kümelerini İşleme

public void processLargeResultSet(Connection conn) throws SQLException {
    String sql = "SELECT * FROM large_table";
    
    try (Statement stmt = conn.createStatement()) {
        // Set fetch size for efficient memory usage
        stmt.setFetchSize(1000);
        
        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
}

Hazırlanmış Deyimleri Kullanma

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

Toplu İşlemler

public void executeBatchInsert(Connection conn) throws SQLException {
    String sql = "INSERT INTO logs (timestamp, level, message) VALUES (?, ?, ?)";
    
    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        conn.setAutoCommit(false);  // Disable auto-commit for batch
        
        // 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();
            
            // Execute batch every 100 statements
            if (i % 100 == 0) {
                pstmt.executeBatch();
                pstmt.clearBatch();
            }
        }
        
        // Execute remaining statements
        pstmt.executeBatch();
        conn.commit();
        
        System.out.println("Batch insert completed successfully");
    } catch (SQLException e) {
        conn.rollback();
        throw e;
    } finally {
        conn.setAutoCommit(true);
    }
}

HikariCP ile bağlantı havuzu

HikariCP'yi JDBC URL'si ile yapılandırın ki bağlantı üzerinden LivyDriverbağlantı kurulsun. Bir HikariCP örneği oluşturun ve uygulama ömrü boyunca tekrar kullanın.

Maven bağımlılığı

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

JDBC URL'si ile HikariCP'yi yapılandırın

JDBC URL ve sürücü sınıfını HikariCP'nin fiziksel bağlantılar oluşturmasını sağlayacak LivyDriverşekilde yapılandırın. JDBC servis sağlayıcısı otomatik keşif mevcut olduğunda sürücü sınıfının açıkça ayarlanması isteğe bağlıdır:

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
                     "LivySessionTimeoutSeconds=600";  // Poll up to 10 minutes for session 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"));
            }
        }
    }
}

Havuzu yapılandırırken aşağıdaki rehberliği kullanın:

Ortam veya davranış Guidance
connectionTimeout Arayan kişinin bağlantı ödünç almak için ne kadar beklediğini kontrol eder, ancak devam eden bir bağlantı girişimini iptal etmez. Kimlik doğrulama, oturum oluşturma, HTTP denemeleri ve ilk doğrulama için zaman tanımak için daha LivySessionTimeoutSeconds yüksek bir süre ayarlayın.
Bağlantı doğrulaması HikariCP .Connection.isValid() Etkili süresi, sürücünün HTTP zaman aşımına ve tekrar deneme/geri alma ayarlarıyla kontrol edilir, HikariCP'nin validationTimeoutayarları ile değil. Bağlantı testi sorgusunu yapılandırmayın çünkü daha hafif doğrulama kontrolünü Spark ifadesi ile değiştirir.

HikariCP yapılandırma seçeneklerinin tam listesi için bakınız:

Veri Türü Eşleme

Sürücü Spark SQL veri türlerini JDBC SQL türleri ve Java türleriyle eşler:

Spark SQL Türü JDBC SQL Türü Java Türü Notes
BOOLEAN BOOLEAN Boolean
BYTE TINYINT Byte
SHORT SMALLINT Short
INT INTEGER Integer
LONG BIGINT Long
FLOAT FLOAT Float
DOUBLE DOUBLE Double
DECIMAL DECIMAL BigDecimal Hassaslık ve ölçek korunur
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 VARCHAR String JSON olarak seri hale getirilmiş
MAP VARCHAR String JSON olarak seri hale getirilmiş
STRUCT VARCHAR String JSON olarak seri hale getirilmiş