โปรแกรมควบคุม Microsoft JDBC สําหรับ Microsoft Fabric Data Engineering

JDBC (Java Database Connectivity) เป็นมาตรฐานที่นํามาใช้กันอย่างแพร่หลายซึ่งช่วยให้แอปพลิเคชันไคลเอ็นต์สามารถเชื่อมต่อและทํางานกับข้อมูลจากฐานข้อมูลและแพลตฟอร์มข้อมูลขนาดใหญ่ได้

Microsoft JDBC Driver for Fabric Data Engineering ช่วยให้คุณเชื่อมต่อ สืบค้น และจัดการงาน Spark ใน Fabric ด้วยความน่าเชื่อถือและความเรียบง่ายของมาตรฐาน JDBC ไดรเวอร์นี้สร้างขึ้นบน Fabric Livy APIs เพื่อมอบการเชื่อมต่อ Spark SQL ที่ปลอดภัยและยืดหยุ่นสําหรับแอปพลิเคชัน Java และเครื่องมือ BI ของคุณ การผสานรวมนี้ช่วยให้คุณสามารถส่งและรันโค้ด Spark ได้โดยตรงโดยไม่ต้องสร้างรายการกําหนดงาน Spark แยกต่างหากในสมุดบันทึก ไดรเวอร์นี้เข้ากันได้กับไคลเอ็นต์ JDBC ยอดนิยม เช่น DbVisualizer และ DBeaver รวมถึงเครื่องมือ BI ที่รองรับการเชื่อมต่อ JDBC รวมถึง Tableau

คุณสมบัติหลัก

  • JDBC 4.2 APIs: ใช้งาน JDBC 4.2 API สําหรับการเชื่อมต่อ Spark SQL โดยมีข้อจํากัดของ Spark และ Livy เช่น ไม่มีธุรกรรม JDBC และผลลัพธ์ที่ส่งไปข้างหน้าอย่างเดียวและอ่านอย่างเดียว
  • การรับรองความถูกต้องของ Microsoft Entra ID: โฟลว์การรับรองความถูกต้องหลายขั้นตอน รวมถึงการโต้ตอบ ข้อมูลประจําตัวไคลเอ็นต์ และการรับรองความถูกต้องตามใบรับรอง
  • เซสชันที่มีความพร้อมกันสูง: การแชร์เซสชัน Fabric แบบเลือกเข้าร่วมสําหรับงานที่ทํางานพร้อมกัน
  • การจัดพูลการเชื่อมต่อแบบชัดเจน: เลือก HikariCP ซึ่งเป็นตัวจัดการพูลมาตรฐาน หรือ LivyBuiltInPooledDataSource; จุดเข้าโดยตรงไม่เคยพูล
  • รองรับคําสั่ง Spark SQL แบบเนทีฟ: รันคําสั่ง Spark SQL โดยตรงโดยไม่ต้องแปล
  • รองรับประเภทข้อมูลที่ครอบคลุม: รองรับประเภทข้อมูล Spark SQL ทั้งหมดรวมถึงประเภทที่ซับซ้อน (ARRAY, MAP, STRUCT)
  • การดึงข้อมูลล่วงหน้าของชุดผลลัพธ์แบบอะซิงโครนัส: การโหลดข้อมูลพื้นหลังเพื่อประสิทธิภาพที่ดีขึ้น
  • รูปแบบเซอร์กิตเบรกเกอร์: ป้องกันความล้มเหลวแบบเรียงซ้อนด้วยการลองใหม่อัตโนมัติ
  • การเชื่อมต่อใหม่อัตโนมัติ: การกู้คืนเซสชันแบบโปร่งใสเมื่อการเชื่อมต่อล้มเหลว
  • ตรรกะการลองใหม่ขั้นสูง: ลองอีกครั้งด้วยการย้อนกลับแบบทวีคูณและการกู้คืนเซสชันเพื่อความยืดหยุ่นที่ดีขึ้น
  • การสนับสนุนพร็อกซี: การกําหนดค่าพร็อกซี HTTP และ SOCKS สําหรับสภาพแวดล้อมขององค์กร

ข้อกําหนดเบื้องต้น

ก่อนใช้ไดรเวอร์ Microsoft JDBC สําหรับ Fabric Data Engineering โปรดตรวจสอบให้แน่ใจว่าคุณมี:

  • Java Development Kit (JDK): Java 11, 17 และ 21 (แนะนํา Java 21)
  • การเข้าถึง Fabric: การเข้าถึงพื้นที่ทํางาน Fabric
  • Microsoft Entra ID credentials: ข้อมูลประจําตัวที่เหมาะสมสําหรับการรับรองความถูกต้อง
  • รหัสพื้นที่ทํางานและเลคเฮาส์: ตัวระบุ GUID สําหรับพื้นที่ทํางาน Fabric และเลคเฮาส์ของคุณ

ดาวน์โหลดและติดตั้ง

Microsoft JDBC Driver for Fabric Data Engineering เวอร์ชัน 2.0.1 รองรับ Java 11, 17 และ 21 ใช้เวอร์ชันล่าสุดที่มีอยู่

  1. ดาวน์โหลดไฟล์ zip หรือ tar จากลิงก์ด้านบน
  2. แตกไฟล์ที่ดาวน์โหลดเพื่อเข้าถึงไฟล์ JAR ของไดรเวอร์
  3. เลือกไฟล์ JAR ที่ตรงกับเวอร์ชัน JRE ของคุณ:
    • สําหรับ Java 11: ms-sparksql-jdbc-2.0.1.jre11.jar
    • สําหรับ Java 17: ms-sparksql-jdbc-2.0.1.jre17.jar
    • สําหรับ Java 21: ms-sparksql-jdbc-2.0.1.jre21.jar
  4. เพิ่มไฟล์ JAR ที่เลือกลงในคลาสพาธของแอปพลิเคชัน
  5. สําหรับไคลเอ็นต์ JDBC ให้กําหนดค่าคลาสไดรเวอร์ JDBC: com.microsoft.spark.livy.jdbc.LivyDriver

ตัวอย่างการเริ่มต้นอย่างรวดเร็ว

ตัวอย่างนี้แสดงวิธีเชื่อมต่อกับ Fabric และดําเนินการคําสั่งโดยใช้ไดรเวอร์ Microsoft JDBC สําหรับ Fabric Data Engineering ก่อนรันโค้ดนี้ ให้แน่ใจว่าคุณได้ทําข้อกําหนดเบื้องต้นครบถ้วนและติดตั้งไดรเวอร์แล้ว โดยการใช้ AuthFlow=2, ไดรเวอร์จะใช้ DefaultAzureCredential. หากต้องการใช้ Azure CLI เป็นแหล่งข้อมูลรับรอง ให้ติดตั้ง Azure CLI และรัน 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();
        }
    }
}

รูปแบบสตริงการเชื่อมต่อ

สตริงการเชื่อมต่อพื้นฐาน

Microsoft JDBC Driver for Fabric Data Engineering ใช้รูปแบบ สายอักขระการเชื่อมต่อ ดังนี้:

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

ส่วนประกอบสตริงการเชื่อมต่อ

ส่วนประกอบ คำอธิบาย ตัวอย่าง
พิธีสาร ตัวระบุโปรโตคอล URL ของ JDBC jdbc:fabricspark://
ชื่อโฮสต์ ชื่อโฮสต์ปลายทาง Fabric api.fabric.microsoft.com
ท่า หมายเลขพอร์ตเสริม (ค่าเริ่มต้น: 443) :443
พารามิเตอร์ คีย์ที่คั่นด้วยอัฒภาค = คู่ค่า FabricWorkspaceID=<guid>

ตัวอย่างสตริงการเชื่อมต่อ

การเชื่อมต่อพื้นฐาน (การรับรองความถูกต้องตามเบราว์เซอร์แบบโต้ตอบ)

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

ด้วยการกําหนดค่าทรัพยากร Spark

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

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

ด้วยโหมดการทํางานพร้อมกันสูง

โหมด High-concurrency (HC) มีให้สําหรับการเชื่อมต่อ Microsoft Fabric ในไดรเวอร์เวอร์ชัน 1.1.0 ขึ้นไป เพิ่ม hcEnabled=true เพื่อรับเซสชัน HC แทนเซสชัน Livy แบบคลาสสิก:

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

คุณสามารถระบุภาระงานด้วยแท็กเซสชันและเลือกสภาพแวดล้อม Fabric ได้ตามต้องการ:

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

โหมด HC คือโหมดเลือกเข้าร่วม ถ้า hcEnabled ถูกละเว้นหรือตั้งเป็น false, ไดรเวอร์จะใช้เส้นทางเซสชัน Livy แบบคลาสสิก

ดูส่วน High-Concurrency (HC) Mode สําหรับคําแนะนําการตั้งค่าอย่างละเอียด


การรับรองความถูกต้อง

Microsoft JDBC Driver for Fabric Data Engineering รองรับวิธีการตรวจสอบสิทธิ์หลายแบบผ่าน Microsoft Entra IDL (เดิมชื่อ Azure Active Directory) การรับรองความถูกต้องถูกกําหนดค่าโดยใช้ AuthFlow พารามิเตอร์ในสตริงการเชื่อมต่อ

โฟลว์การรับรองความถูกต้อง

ออธโฟลว์ วิธีการรับรองความถูกต้อง ใช้กรณี
1 เบราว์เซอร์แบบโต้ตอบ การตรวจสอบสิทธิ์ผู้ใช้แบบอินเทอร์แอคทีฟโดยใช้ OAuth 2.0
2 เชนข้อมูลรับรอง Azure เริ่มต้น การพัฒนาและการตรวจสอบสิทธิ์แอปพลิเคชันที่จัดการ;Azure CLI สามารถเป็นแหล่งข้อมูลรับรองเดียวกันได้
3 ข้อมูลประจําตัวข้อมูลลับของไคลเอ็นต์ (บริการหลัก) การรับรองความถูกต้องอัตโนมัติ/บริการต่อบริการ
4 หนังสือรับรองใบรับรองลูกค้า การรับรองความถูกต้องของบริการหลักตามใบรับรอง
5 โทเค็นการเข้าถึง โทเค็นการเข้าถึงผู้ถือที่ได้มาล่วงหน้า

การรับรองความถูกต้องของเบราว์เซอร์แบบโต้ตอบ

ดีที่สุดสําหรับ: การพัฒนาและแอปพลิเคชันแบบโต้ตอบ

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

Connection conn = DriverManager.getConnection(url);

พารามิเตอร์:

  • AuthFlow=1: ระบุการรับรองความถูกต้องของเบราว์เซอร์แบบโต้ตอบ

พฤติกรรม:

  • เปิดหน้าต่างเบราว์เซอร์สําหรับการตรวจสอบผู้ใช้
  • แคชข้อมูลรับรองสําหรับการเชื่อมต่อถัดไปจนกว่าจะหมดอายุ
  • เหมาะสําหรับการใช้งานแบบผู้ใช้คนเดียว

ข้อมูลประจําตัวไคลเอ็นต์หรือการรับรองความถูกต้องของบริการหลัก

ดีที่สุดสําหรับ: บริการอัตโนมัติและงานเบื้องหลัง

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

พารามิเตอร์ที่จําเป็น:

  • AuthFlow=3: ระบุการรับรองความถูกต้องของข้อมูลประจําตัวไคลเอ็นต์
  • AuthClientID: รหัสแอปพลิเคชัน (ไคลเอ็นต์) จาก Microsoft Entra ID
  • AuthClientSecret: ข้อมูลลับของไคลเอ็นต์จาก Microsoft Entra ID
  • AuthTenantID: รหัสผู้เช่า Microsoft Entra

แนวทางปฏิบัติที่ดีที่สุด:

  • จัดเก็บข้อมูลลับอย่างปลอดภัย (Azure Key Vault, ตัวแปรสภาพแวดล้อม)
  • ใช้ข้อมูลประจําตัวที่มีการจัดการเมื่อเป็นไปได้
  • หมุนเวียนความลับอย่างสม่ําเสมอ

การรับรองความถูกต้องของ Certificate-Based

ดีที่สุดสําหรับ: แอปพลิเคชันระดับองค์กรที่ต้องการการรับรองความถูกต้องตามใบรับรอง

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

พารามิเตอร์ที่จําเป็น:

  • AuthFlow=4: ระบุการรับรองความถูกต้องตามใบรับรอง
  • AuthClientID: รหัสแอปพลิเคชัน (ไคลเอ็นต์)
  • AuthCertificatePath: เส้นทางไปยังไฟล์ใบรับรอง PEM
  • AuthCertificatePassword: รหัสผ่านใบรับรอง
  • AuthTenantID: รหัสผู้เช่า Microsoft Entra

การรับรองความถูกต้องของโทเค็นการเข้าถึง

ดีที่สุดสําหรับ: สถานการณ์การรับรองความถูกต้องแบบกําหนดเอง

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

การแคชการตรวจสอบสิทธิ์

ไดรเวอร์จะแคชโทเค็นการตรวจสอบสิทธิ์และรีเฟรชตามวันหมดอายุของโทเค็น คุณสมบัติที่ parsed AuthEnableCaching และ AuthCacheTTLMS properties ไม่ได้ควบคุมพฤติกรรมนี้ในเวอร์ชัน 2.0.0

พารามิเตอร์การกําหนดค่า

พารามิเตอร์ที่จำเป็น

พารามิเตอร์เหล่านี้ต้องมีอยู่ในทุกสตริงการเชื่อมต่อ:

พารามิเตอร์ ประเภท คำอธิบาย ตัวอย่าง
FabricWorkspaceID ยูอี ตัวระบุพื้นที่ทํางานของ Fabric <workspace-id>
FabricLakehouseID ยูอี รหัสบ้านพักริมทะเลสาบ Fabric <lakehouse-id>
AuthFlow Integer ชนิดโฟลว์การรับรองความถูกต้อง (1-5) 2

พารามิเตอร์เผื่อเลือก

การกําหนดค่าเวอร์ชัน API

พารามิเตอร์ ประเภท ค่าเริ่มต้น คำอธิบาย
FabricVersion สตริง v1 เวอร์ชัน Fabric API
LivyApiVersion สตริง 2023-12-01 เวอร์ชัน Livy API

การกําหนดค่าสภาพแวดล้อม

พารามิเตอร์ ประเภท ค่าเริ่มต้น คำอธิบาย
FabricEnvironmentID ยูอี ไม่มีใคร ตัวระบุสภาพแวดล้อม Fabric สําหรับการอ้างอิงรายการสภาพแวดล้อมสําหรับเซสชัน Spark

การกําหนดค่าเซสชันแบบ high concurrency

ตั้งค่า hcEnabled=true ให้ใช้โหมด HC คุณสมบัติ HC ที่เหลือจะถูกใช้เฉพาะเมื่อเปิดใช้งานโหมด HC เท่านั้น

พารามิเตอร์ ประเภท ค่าเริ่มต้น คำอธิบาย
hcEnabled แบบบูลีน false ใช้เซสชัน Fabric ที่มีความพร้อมกันสูง
sessionTag สตริง ไม่มีใคร แท็กเซสชันฝั่งเซิร์ฟเวอร์เป็นทางเลือก ใช้ตัวอักษร ตัวเลข ขีดล่าง หรือขีดกลางตั้งแต่ 1 ถึง 64 ตัว
hcAcquireTimeoutSeconds Integer 300 เวลาสูงสุดในการรอให้เซสชัน HC พร้อม ค่าที่ใช้ได้มีตั้งแต่ 120 ถึง 3,600 วินาที
hcAcquirePollingIntervalMs Integer 1000 ช่วงเวลาระหว่างการตรวจสอบสถานะเซสชัน HC ค่าที่ยอมรับได้อยู่ระหว่าง 50 ถึง 30,000 มิลลิวินาที และจะถูกจํากัดไว้ที่ 100 ถึง 5,000 มิลลิวินาทีขณะใช้งาน

ตัวอย่าง:

hcEnabled=true;sessionTag=interactive_reporting;hcAcquireTimeoutSeconds=600;hcAcquirePollingIntervalMs=2000;FabricEnvironmentID=<environment-id>
  • FabricEnvironmentID ใช้ได้กับทั้งเซสชัน HC และแบบคลาสสิก
  • EnvironmentID ยังได้รับการยอมรับเป็นนามแฝงข้ามไดรเวอร์ด้วย ชื่อคุณสมบัติจะไม่แยกแยะตัวพิมพ์เล็ก-ใหญ่

Important

ใช้ sessionTag เฉพาะกับฉลากปฏิบัติการที่ไม่ไวต่อความไวเท่านั้น อย่าใส่ความลับ โทเค็นการเข้าถึง ข้อมูลส่วนบุคคล รหัสลูกค้า หรือข้อความค้นหา

ดูส่วน High-Concurrency (HC) Mode สําหรับคําแนะนําการตั้งค่าอย่างละเอียด

การกําหนดค่า Spark

การกําหนดค่าทรัพยากรเซสชัน

กําหนดค่าทรัพยากรเซสชัน Spark เพื่อประสิทธิภาพสูงสุด:

พารามิเตอร์ ประเภท ค่าเริ่มต้น คำอธิบาย ตัวอย่าง
DriverCores Integer ค่าเริ่มต้นของ Spark จํานวนคอร์ CPU สําหรับไดรเวอร์ 4
DriverMemory สตริง ค่าเริ่มต้นของ Spark การจัดสรรหน่วยความจําสําหรับไดรเวอร์ 4g
ExecutorCores Integer ค่าเริ่มต้นของ Spark จํานวนคอร์ CPU ต่อตัวดําเนินการ 4
ExecutorMemory สตริง ค่าเริ่มต้นของ Spark การจัดสรรหน่วยความจําต่อตัวดําเนินการ 8g
NumExecutors Integer ค่าเริ่มต้นของ Spark จํานวนผู้ดําเนินการ 2
SessionName สตริง สร้างอัตโนมัติ ชื่อเซสชันที่กําหนดเอง MySparkSession

ตัวอย่าง:

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

คุณสมบัติเซสชัน Spark แบบกําหนดเอง

พารามิเตอร์ใดๆ ที่มีคํานํา spark. หน้าจะถูกนําไปใช้กับเซสชัน Spark โดยอัตโนมัติ:

ตัวอย่างการกําหนดค่า Spark:

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

เอ็นจิ้นการดําเนินการดั้งเดิม (NEE):

spark.nee.enabled=true

ตัวอย่างที่สมบูรณ์:

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

กําหนดค่าการเชื่อมต่อ HTTP transport ของไดรเวอร์เพื่อประสิทธิภาพเครือข่ายที่ดีที่สุด การตั้งค่าเหล่านี้ไม่ได้กําหนดค่าหรือจัดการ JDBC connection pooling:

พารามิเตอร์ ประเภท ค่าเริ่มต้น คำอธิบาย
HttpMaxTotalConnections Integer 100 การเชื่อมต่อ HTTP ทั้งหมดสูงสุด
HttpMaxConnectionsPerRoute Integer 20 การเชื่อมต่อสูงสุดต่อเส้นทาง
HttpConnectionTimeoutInSeconds Integer 30 หมดเวลาการเชื่อมต่อ
HttpSocketTimeoutInSeconds Integer 60 หมดเวลาอ่านซ็อกเก็ต
HttpReadTimeoutInSeconds Integer 60 หมดเวลาอ่าน HTTP
HttpConnectionRequestTimeoutSeconds Integer 10 หมดเวลาคําขอการเชื่อมต่อจากพูล
HttpEnableKeepAlive แบบบูลีน จริง เปิดใช้งาน HTTP keep-alive
HttpKeepAliveTimeoutSeconds Integer 60 หมดเวลาการมีชีวิตอยู่
HttpFollowRedirects แบบบูลีน จริง ติดตามการเปลี่ยนเส้นทาง HTTP
HttpUseAsyncIO แบบบูลีน จริง ใช้ HTTP I/O แบบอะซิงโครนัส

ตัวอย่าง:

HttpMaxTotalConnections=200;HttpMaxConnectionsPerRoute=100;HttpConnectionTimeoutInSeconds=60

การกําหนดค่าพร็อกซี

กําหนดการตั้งค่าพร็อกซี HTTP และ SOCKS สําหรับสภาพแวดล้อมขององค์กร:

พารามิเตอร์ ประเภท ค่าเริ่มต้น คำอธิบาย
UseProxy แบบบูลีน เท็จ เปิดใช้พร็อกซี
ProxyTransport สตริง http ประเภทการส่งพร็อกซี (http/tcp)
ProxyHost สตริง ไม่มีใคร ชื่อโฮสต์พร็อกซี
ProxyPort Integer ไม่มีใคร พอร์ตพร็อกซี
ProxyAuthEnabled แบบบูลีน เท็จ เปิดใช้งานการรับรองความถูกต้องของพร็อกซี
ProxyUsername สตริง ไม่มีใคร ชื่อผู้ใช้การรับรองความถูกต้องของพร็อกซี
ProxyPassword สตริง ไม่มีใคร รหัสผ่านการรับรองความถูกต้องของพร็อกซี
ProxyAuthScheme สตริง basic รูปแบบการรับรองความถูกต้อง (พื้นฐาน/สรุป/ntlm)
ProxySocksVersion Integer 5 รุ่น SOCKS (4/5)

ตัวอย่างพร็อกซี HTTP:

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

ตัวอย่างพร็อกซี SOCKS:

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

การกําหนดค่าการบันทึก

พารามิเตอร์ ประเภท ค่าเริ่มต้น คำอธิบาย
LogLevel สตริง WARN ระดับการบันทึก: TRACE, DEBUG, INFO, WARN, ERROR

ตัวอย่าง:

LogLevel=DEBUG

ตําแหน่งบันทึกเริ่มต้น:

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

การกําหนดค่าบันทึกที่กําหนดเอง: ใช้แบบกําหนดเอง log4j2.xml หรือ logback.xml ไฟล์ในเส้นทางชั้นเรียนของคุณ

โหมดการทํางานพร้อมกันสูง (HC)

โหมด High-concurrency (HC) ถูกออกแบบมาสําหรับแอปพลิเคชัน JDBC ที่เปิดการเชื่อมต่อหลายจุดไปยังพื้นที่ทํางาน Fabric เดียวกันและบ้านพักริมทะเลสาบเดียวกัน แทนที่จะจัดสรรเซสชัน Spark แบบคลาสสิกแยกสําหรับแต่ละการเชื่อมต่อ Fabric จะให้บริการการเชื่อมต่อเหล่านั้นด้วยความจุ Spark ที่แชร์และจัดการโดยเซิร์ฟเวอร์

โหมด HC สามารถลดเวลาการเริ่มต้นการเชื่อมต่อ หลีกเลี่ยงการจัดสรรเซสชัน Spark ซ้ํา ๆ และใช้ความจุที่มีอยู่ได้อย่างมีประสิทธิภาพมากขึ้นสําหรับงานที่ทํางานพร้อมกัน การเชื่อมต่อ JDBC แต่ละตัวยังคงดําเนินการคําสั่งผ่านบริบทที่กําหนดไว้ในเซสชัน HC

โหมด HC เป็นโหมด opt-in และเสริมกับการจัดกลุ่มการเชื่อมต่อ JDBC โหมด HC จัดการเซสชัน Fabric Spark บนเซิร์ฟเวอร์ ขณะที่ JDBC connection pooling จัดการการเชื่อมต่อในแอปพลิเคชันไคลเอนต์ หากคุณไม่เปิดใช้งานโหมด HC ไดรเวอร์จะสร้างเซสชัน Livy แบบคลาสสิก

เลือกได้ระหว่างโหมด HC และโหมดคลาสสิก

ใช้โหมด HC เมื่อ:

  • บริการแอปพลิเคชันจัดการคําขอที่รัน Spark SQL ผ่านการเชื่อมต่อ JDBC หลายตัวพร้อมกัน
  • เครื่องมือ BI หรือเครื่องมือรายงานจะเปิดการเชื่อมต่อหลายจุดไปยังพื้นที่ทํางานและบ้านริมทะเลสาบเดียวกัน
  • งาน ETL แบบขนานหรืองานที่ตั้งเวลาจะสร้างการเชื่อมต่อ JDBC แบบ burst
  • การเชื่อมต่อใช้การตั้งค่า Spark ที่รองรับและสามารถแชร์ความจุ Spark ที่จัดการโดยเซิร์ฟเวอร์ได้
  • การลดเวลาการเริ่มต้นเชื่อมต่อและการจัดเตรียมเซสชัน Spark ซ้ํา ๆ เป็นสิ่งสําคัญ

ใช้โหมดคลาสสิกเมื่อ:

  • แอปพลิเคชันของคุณใช้การเชื่อมต่อ JDBC ที่มีอายุการใช้งานยาวนานเพียงหนึ่งหรือไม่กี่รายการเท่านั้น
  • แต่ละการเชื่อมต่อต้องการเซสชัน Spark เฉพาะสําหรับภาระงานที่เข้มงวดหรือการแยกทรัพยากร
  • การเชื่อมต่อต้องการการตั้งค่า Spark หรือสภาพแวดล้อม Fabric ที่แตกต่างกันอย่างมาก
  • จุดสิ้นสุด Fabric Livy สําหรับพื้นที่ทํางานเป้าหมายและ lakehouse ไม่รองรับโหมด HC

เปิดใช้งานโหมดการทํางานพร้อมกันสูง

โหมด HC คือโหมดเลือกเข้าร่วม หากคุณละเว้น hcEnabled หรือตั้งค่าเป็น false ไดรเวอร์จะใช้เส้นทางเซสชัน Livy แบบคลาสสิก ตั้งค่า hcEnabled เป็น true เพื่อรับเซสชัน HC:

hcEnabled=true;

พารามิเตอร์ที่จําเป็นในโหมด HC

การเปิดใช้งาน HC ต้องใช้ตัวระบุที่ถูกต้องดังต่อไปนี้:

พารามิเตอร์ บันทึกย่อ
WorkspaceId ต้องเป็น GUID พื้นที่ทํางาน Fabric ที่ถูกต้อง
LakehouseId ต้องมี GUID ของ Fabric lakehouse ที่ถูกต้อง

รวม SessionTag เพราะมีผลต่อการจับคู่ฝั่งเซิร์ฟเวอร์สําหรับเซสชันที่ร้อน

การจับคู่เซสชัน

โหมด HC ไม่ได้รับประกันว่าทุกการเชื่อมต่อจะกลับมาใช้เซสชันเดิมซ้ํา สําหรับแต่ละคําขอการเก็บเซสชัน ไดรเวอร์จะส่ง:

  • คุณค่าSessionTag
  • การกําหนดค่าประกายไฟที่มีประสิทธิภาพ รวมถึงconf.*การตั้งค่าและEnvironmentId

บริการ Fabric Livy จะประเมินค่าเหล่านี้และตัดสินใจว่าจะเชื่อมต่อกับเซสชันอุ่นหรือสร้างเซสชันใหม่ เพื่อปรับปรุงการนําเซสชันกลับมาใช้ใหม่ ให้ใช้ค่าที่สอดคล้องกันระหว่างการเชื่อมต่อที่มีวัตถุประสงค์เพื่อแบ่งปันความจุ Spark ที่จัดการโดยเซิร์ฟเวอร์

ปิดโหมด HC

คุณสามารถปิดใช้งานการได้มาซึ่งเซสชัน HC ใหม่โดยไม่ต้องปรับใช้ไดรเวอร์ใหม่ โดยตั้งค่า HC สายอักขระการเชื่อมต่อ เป็น false หรือโดยการลบพารามิเตอร์ HC:

hcEnabled=false;

การย้อนกลับฉุกเฉิน:สําหรับการย้อนกลับฉุกเฉิน ให้เริ่ม JVM ด้วย -Dcom.microsoft.fabric.jdbc.hc.disable=true. สวิตช์ JVM นี้บังคับให้ใช้โหมดคลาสสิกแม้ในขณะที่ สายอักขระการเชื่อมต่อ มี hcEnabled=true.

เข้าใจพฤติกรรมรันไทม์ของ HC

  • การบล็อกการเก็บเซสชัน HC จนกว่าเซสชันจะพร้อมหรือ hcAcquireTimeoutSeconds หมดอายุ
  • การปิดการเชื่อมต่อขณะที่กําลังจัดซื้อจะขัดจังหวะการจัดซื้อและกระตุ้นการทําความสะอาดเซสชัน HC ด้วยความพยายามดีที่สุด
  • การตรวจสอบสิทธิ์ การดําเนินการคําสั่ง การยกเลิก คําสั่งที่เตรียมไว้ การจัดการผลลัพธ์ และ FabricEnvironmentID การทํางานผ่านอินเทอร์เฟซมาตรฐานของ JDBC ในทั้งสองโหมด

ตัวอย่างการใช้งาน

การเชื่อมต่อพื้นฐาน

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

การเชื่อมต่อโหมดการทํางานพร้อมกันสูง

ตัวอย่างต่อไปนี้เปิดการเชื่อมต่อ JDBC ในโหมด HC รันคําสั่งค้นหา และปล่อยการเชื่อมต่อโดยอัตโนมัติ:

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

การดําเนินการสืบค้น

แบบสอบถามอย่างง่าย

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

คิวรีที่มีตัวกรอง

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

คิวรีที่มีขีดจํากัด

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

การทํางานกับชุดผลลัพธ์

ชุดผลลัพธ์การเดินผ่าน

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

ชุดผลลัพธ์เป็นแบบส่งไปข้างหน้าและอ่านอย่างเดียว ไดรเวอร์ไม่รองรับเมธอดเช่น first(), , last()และ absolute().

การประมวลผลชุดผลลัพธ์ขนาดใหญ่

ไดรเวอร์จะแบ่งหน้าผลลัพธ์ตามขนาดคําตอบ กําหนดค่า LivyStatementPageSize ใน URL ของ JDBC เพื่อกําหนดขนาดหน้าที่ร้องขอเป็นไบต์ Statement.setFetchSize()วิธีนี้ไม่ได้ควบคุมการดึงข้อมูลหรือการใช้หน่วยความจํา

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
}

การใช้ข้อความที่เตรียมไว้

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

การดําเนินการแบทช์

ไดรเวอร์ไม่รองรับธุรกรรม JDBC การประมวลผลแบบแบตช์เป็นแบบไม่ทําธุรกรรมและสามารถประสบความสําเร็จบางส่วนได้ ความล้มเหลวที่เกิดขึ้นในภายหลังจะไม่ย้อนกลับคําสั่งที่ประสบความสําเร็จก่อนหน้า

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

เลือกเจ้าของการเชื่อมต่อ

เลือกส่วนประกอบหนึ่งเพื่อเป็นเจ้าของวงจรชีวิตการเชื่อมต่อ อย่าวางพูลการเชื่อมต่อหนึ่งไว้ในอีกพูลหนึ่ง

รูปแบบการใช้งาน จุดเข้าใช้งาน เจ้าของสระว่ายน้ํา การปิดบัญชีเงินกู้ Connection เจ้าของการปิดกิจการ
โดยตรง DriverManager, LivyDriver หรือ LivyDataSource ไม่มีใคร ปิดการเชื่อมต่อและเซสชันอิสระของลิวี่ทางกายภาพ แอปพลิเคชันจะปิดการเชื่อมต่อทุกครั้ง เรือตรง LivyDataSource ไม่มีวงจรชีวิตแบบปิดแยกต่างหาก
HikariCP ภายนอก HikariDataSource รองรับด้วย URL JDBC หรือ LivyDataSource เฉพาะ HikariCP ส่งคืนการเชื่อมต่อพร็อกซี Hikari ไปยัง HikariCP การสมัครจะปิดการ HikariDataSourceเก็บรักษาไว้ .
พูลในตัวแบบชัดเจน LivyBuiltInPooledDataSource หนึ่งแบบที่สร้างขึ้น LivyConnectionPool อย่างขี้เกียจสําหรับแต่ละการสร้างแหล่งข้อมูลที่กําหนดค่าไว้ ยกเลิกสัญญาเช่าแบบตรรกะและนําเซสชันจริงกลับมาใช้ใหม่หลังจากทําความสะอาดอย่างปลอดภัยแล้ว แอปพลิเคชันจะปิดแหล่งข้อมูลที่เก็บไว้ในตัว
SPI แบบพูลมาตรฐาน LivyConnectionPoolDataSource สร้าง PooledConnection วัตถุสําหรับผู้จัดการพูลระดับกลาง ผู้จัดการสระว่ายน้ําระดับกลาง ไม่ใช่โรงงาน ปิดแฮนด์เดิลเชิงตรรกะและแจ้งผู้จัดการแบบซิงโครนัสหลังจากทําความสะอาด ผู้จัดการจะโทร PooledConnection.close() มาเพื่อทําลายการเชื่อมต่อทางกายภาพแต่ละครั้ง

ConnectionPoolEnabled ค่าเริ่มต้นเป็น false ทั้งในโค้ดไดรเวอร์และคุณสมบัติที่จัดส่ง มันไม่ใช่สวิตช์ที่เลือกเข้าร่วมได้สําหรับจุดเริ่มต้นปัจจุบัน ใช้ LivyBuiltInPooledDataSource เมื่อไดรเวอร์ควรเป็นเจ้าของพูล หรือกําหนดค่าพูลภายนอก เช่น HikariCP จุดเข้าอื่น ๆ จะสร้างการเชื่อมต่อโดยตรงที่ไม่ได้เป็นเจ้าของพูล

การเชื่อมต่อพูลกับ HikariCP

HikariCP สามารถสร้างการเชื่อมต่อจาก URL JDBC LivyDataSource ได้ทั้งสองทางผ่าน LivyDriver. สร้างอินสแตนซ์ HikariCP หนึ่งตัว ใช้ซ้ําตลอดอายุการใช้งานของแอปพลิเคชัน และใช้เพียง connection pool เดียวในแต่ละการตั้งค่า

การพึ่งพา Maven

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

ใช้ LivyDataSource

LivyDataSource สร้างการเชื่อมต่อทางกายภาพที่เป็นอิสระและไม่ได้เป็นเจ้าของพูลการเชื่อมต่อหรือวงจรชีวิตปิดแยกต่างหาก ส่งข้อมูลนี้ไปยัง HikariCP โดยตรงเพื่อให้ HikariCP เป็นเจ้าของพูลเพียงรายเดียว:

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

ตัวอย่างเปิดใช้งานโหมด HC ใน URL ของ JDBC HikariCP จัดการการเชื่อมต่อฝั่งไคลเอนต์ ขณะที่โหมด HC จัดการเซสชัน Spark ที่แชร์ใน Fabric ลบ hcEnabled และ sessionTag หากแอปพลิเคชันต้องการเซสชันแบบคลาสสิก

ใช้ LivyDriver โดยตรง

กําหนดค่า URL และคลาสไดรเวอร์ของ JDBC เพื่อให้ HikariCP สร้างการเชื่อมต่อทางกายภาพผ่าน LivyDriver. การตั้งค่าคลาสไดรเวอร์อย่างชัดเจนเป็นทางเลือกเมื่อมีการค้นหาอัตโนมัติจากผู้ให้บริการ JDBC การกําหนดค่านี้จะไม่สร้าง LivyDataSourceininstance ดังนั้นพูลในตัวจึงไม่เกี่ยวข้อง:

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

ใช้คําแนะนําต่อไปนี้เมื่อคุณกําหนดค่าพูล:

การตั้งค่าหรือพฤติกรรม คําแนะนํา
การเป็นเจ้าของสระว่ายน้ํา LivyDataSource เป็นแบบตรงเท่านั้น เมื่อคุณส่งข้อมูลให้ HikariCP HikariCP จะเป็นเจ้าของพูล ใช้ LivyBuiltInPooledDataSource แทนเมื่อคนขับควรเป็นเจ้าของสระว่ายน้ํา
ขนาดสระว่ายน้ํา เริ่มต้นด้วยพูลขนาดเล็กและเพิ่มจํานวนหลังจากวัดความพร้อมกันของงานและการใช้ความจุ ในโหมดคลาสสิก การเชื่อมต่อทางกายภาพแต่ละตัวจะมีเซสชัน Livy ในโหมด HC การเชื่อมต่อสามารถแชร์ความจุ Spark ที่จัดการโดยเซิร์ฟเวอร์ได้
connectionTimeout ควบคุมระยะเวลาที่ผู้โทรรอเพื่อยืมการเชื่อมต่อ แต่ไม่ยกเลิกความพยายามเชื่อมต่อที่กําลังดําเนินการอยู่ สําหรับ URL HC ให้อนุญาต hcAcquireTimeoutSeconds; สําหรับโหมดคลาสสิก อนุญาตให้ LivySessionTimeoutSeconds, การตรวจสอบสิทธิ์, การรีลอง HTTP และการตรวจสอบความถูกต้อง HikariCP แสดงการตั้งค่านี้เป็นมิลลิวินาที
initializationFailTimeout ค่าลบจะข้ามการเชื่อมต่อเริ่มต้นและความพยายามตรวจสอบ ความล้มเหลวในการเชื่อมต่อจะปรากฏขึ้นเมื่อแอปพลิเคชันร้องขอการเชื่อมต่อครั้งแรก ใช้ค่าบวกหากแอปพลิเคชันต้องตรวจสอบการเชื่อมต่อระหว่างการเริ่มต้น
การตรวจสอบการเชื่อมต่อ HikariCP ใช้ Connection.isValid(). ระยะเวลาที่ใช้จริงจะถูกควบคุมโดยการตั้งค่า timeout และ retry/backoff ของ HTTP ของไดรเวอร์ ไม่ใช่ของ HikariCP validationTimeout อย่ากําหนดค่าคําสั่งทดสอบการเชื่อมต่อเพราะมันจะแทนที่การตรวจสอบความถูกต้องที่เบากว่าด้วยคําสั่ง Spark

สําหรับรายการตัวเลือกการกําหนดค่า HikariCP ทั้งหมด โปรดดูที่:

การแม็ปชนิดข้อมูล

ไดรเวอร์แมปประเภทข้อมูล Spark SQL กับประเภท JDBC SQL และประเภท Java:

ประเภท Spark SQL ประเภท JDBC SQL ประเภท Java บันทึกย่อ
BOOLEAN BOOLEAN Boolean
BYTE TINYINT Byte
SHORT SMALLINT Short
INT INTEGER Integer
LONG BIGINT Long
FLOAT FLOAT Float
DOUBLE DOUBLE Double
DECIMAL DECIMAL BigDecimal ความแม่นยําและขนาดที่เก็บรักษาไว้
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 ดึงมาเป็นข้อความ JSON;ประเภทข้อมูลเมตาไม่รับประกันการรองรับการเข้าถึงอย่างสมบูรณ์java.sql.Array
MAP JAVA_OBJECT String ดึงข้อมูลเป็นข้อความ JSON
STRUCT STRUCT String ดึงมาเป็นข้อความ JSON;ประเภทข้อมูลเมตาไม่รับประกันการรองรับการเข้าถึงอย่างสมบูรณ์java.sql.Struct