หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
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 เวอร์ชันล่าสุด
- ดาวน์โหลดไดรเวอร์ Microsoft JDBC สําหรับ Fabric Data Engineering (zip)
- ดาวน์โหลดไดรเวอร์ Microsoft JDBC สําหรับ Fabric Data Engineering (tar)
- ดาวน์โหลดไฟล์ zip หรือ tar จากลิงก์ด้านบน
- แตกไฟล์ที่ดาวน์โหลดเพื่อเข้าถึงไฟล์ JAR ของไดรเวอร์
- เลือกไฟล์ 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
- สําหรับ Java 11:
- เพิ่มไฟล์ JAR ที่เลือกลงในคลาสพาธของแอปพลิเคชัน
- สําหรับไคลเอ็นต์ 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 |