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

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

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

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

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

Microsoft JDBC Driver for Fabric Data Engineering เวอร์ชัน 1.0.0 รองรับ Java 11, 17 และ 21 เรากําลังปรับปรุงการสนับสนุนการเชื่อมต่อ Java อย่างต่อเนื่อง และขอแนะนําให้คุณทํางานกับโปรแกรมควบคุม Microsoft JDBC เวอร์ชันล่าสุด

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

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

ตัวอย่างนี้แสดงวิธีเชื่อมต่อกับ Fabric และรันคําสั่งโดยใช้ไดรเวอร์ Microsoft JDBC สําหรับ Fabric Data Engineering ก่อนเรียกใช้รหัสนี้ ตรวจสอบให้แน่ใจว่าคุณได้ทําตามข้อกําหนดเบื้องต้นและติดตั้งไดรเวอร์แล้ว

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

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

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

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

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

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

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

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

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

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

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

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

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

พฤติกรรม:

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

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

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

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.pfx;" +
             "AuthCertificatePassword=<certificate-password>;" +
             "AuthTenantID=<tenant-id>;" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

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

  • AuthFlow=4: ระบุการรับรองความถูกต้องตามใบรับรอง
  • AuthClientID: รหัสแอปพลิเคชัน (ไคลเอ็นต์)
  • AuthCertificatePath: เส้นทางไปยังไฟล์ใบรับรอง PFX/PKCS12
  • 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);

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

โปรแกรมควบคุมจะแคชโทเค็นการรับรองความถูกต้องโดยอัตโนมัติเพื่อปรับปรุงประสิทธิภาพ:

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

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

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

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

พารามิเตอร์ ประเภท คำอธิบาย ตัวอย่าง
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

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

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

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

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

ตัวอย่าง:

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

คุณสมบัติเซสชัน 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 50 การเชื่อมต่อสูงสุดต่อเส้นทาง
HttpConnectionTimeoutInSeconds Integer 30 หมดเวลาการเชื่อมต่อ
HttpSocketTimeoutInSeconds Integer 60 หมดเวลาอ่านซ็อกเก็ต
HttpReadTimeoutInSeconds Integer 60 หมดเวลาอ่าน HTTP
HttpConnectionRequestTimeoutSeconds Integer 30 หมดเวลาคําขอการเชื่อมต่อจากพูล
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 สตริง INFO ระดับการบันทึก: TRACE, DEBUG, INFO, WARN, ERROR

ตัวอย่าง:

LogLevel=DEBUG

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

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

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


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

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

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

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

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

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

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

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
}

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

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

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

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

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

การพึ่งพา Maven

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

กําหนดค่า HikariCP ด้วย URL JDBC

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

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

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

การตั้งค่าหรือพฤติกรรม คําแนะนํา
connectionTimeout ควบคุมระยะเวลาที่ผู้โทรรอเพื่อยืมการเชื่อมต่อ แต่ไม่ยกเลิกความพยายามเชื่อมต่อที่กําลังดําเนินการอยู่ ตั้งค่าให้สูงกว่า LivySessionTimeoutSeconds เพื่อให้มีเวลาสําหรับการตรวจสอบสิทธิ์ การสร้างเซสชัน การรีไทร์ HTTP และการตรวจสอบครั้งแรก
การตรวจสอบการเชื่อมต่อ 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 VARCHAR String จัดลําดับเป็น JSON
MAP VARCHAR String จัดลําดับเป็น JSON
STRUCT VARCHAR String จัดลําดับเป็น JSON