使用 JDBC 查询
Lakehouse JDBC 驱动由轻量 artifact
clickzetta-jdbc
clickzetta-jdbc
提供,完整 SDK
clickzetta-java
clickzetta-java
也包含同一 JDBC 模块。你可以通过标准 JDBC API 执行查询、DML、DDL,也可以在需要时获取最近一次执行的 Lakehouse 作业 ID。
概述
JDBC 适合 Java 应用查询 Lakehouse、集成连接池或执行低频小批量写入。如果要持续高频写入事件流,优先使用 实时写入数据;如果要批量导入大量历史数据,优先使用 批量写入数据(Bulkload)。
安装
<dependency>
<groupId>com.clickzetta</groupId>
<artifactId>clickzetta-jdbc</artifactId>
<version>${clickzetta-jdbc.version}</version>
</dependency>
只使用
DriverManager
DriverManager
、连接池或 ORM 时推荐该依赖。如果还需要
ClickZettaClient
ClickZettaClient
、Realtime 或 Bulkload,使用包含 JDBC 模块的
clickzetta-java
clickzetta-java
,不要同时引入两个 artifact。
驱动类名:
com.clickzetta.client.jdbc.ClickZettaDriver
JDBC URL
JDBC URL 格式如下:
jdbc:clickzetta://<instance_name>.<region_id>.api.clickzetta.com/<workspace_name>?<connection_params>
常用参数:
| 参数 | 说明 |
|---|
username
username | 登录用户名;也可以通过 DriverManager.getConnection(url, username, password)
DriverManager.getConnection(url, username, password) 传入 |
password
password | 登录密码;也可以通过 DriverManager.getConnection(url, username, password)
DriverManager.getConnection(url, username, password) 传入 |
schema
schema | 默认 SCHEMA |
virtualCluster
virtualCluster | 默认计算集群 |
use_http=true
use_http=true | 使用 HTTP 协议;通常仅在 Private Link 等特殊网络场景使用 |
use_oss_internal_endpoint=true
use_oss_internal_endpoint=true | 阿里云场景下查询结果下载优先使用 OSS 内网 Endpoint |
示例:
jdbc:clickzetta://demo.cn-shanghai-alicloud.api.clickzetta.com/quick_start?schema=public&virtualCluster=default_ap
创建连接
通过 DriverManager 创建
import java.sql.Connection;
import java.sql.DriverManager;
public class JdbcConnectionDemo {
public static void main(String[] args) throws Exception {
String jdbcUrl = args[0];
String username = args[1];
String password = args[2];
Class.forName("com.clickzetta.client.jdbc.ClickZettaDriver");
try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password)) {
System.out.println("Connected to Lakehouse.");
}
}
}
通过 ClickZettaClient 创建
此方式仅适用于完整 SDK
clickzetta-java
clickzetta-java
;轻量的
clickzetta-jdbc
clickzetta-jdbc
不提供
ClickZettaClient
ClickZettaClient
。
import com.clickzetta.client.ClickZettaClient;
import java.sql.Connection;
public class ClientJdbcConnectionDemo {
public static void main(String[] args) throws Exception {
ClickZettaClient client = ClickZettaClient.newBuilder()
.url(args[0])
.username(args[1])
.password(args[2])
.build();
try (Connection connection = client.getJdbcConnection()) {
System.out.println("Connected to Lakehouse.");
} finally {
client.close();
}
}
}
查询数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class QueryDemo {
public static void main(String[] args) throws Exception {
String jdbcUrl = args[0];
String username = args[1];
String password = args[2];
try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT 1 AS id, 'lakehouse' AS name")) {
if (resultSet.next()) {
System.out.println("id=" + resultSet.getInt("id")
+ " name=" + resultSet.getString("name"));
}
}
}
}
执行 DML
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class InsertDemo {
public static void main(String[] args) throws Exception {
String jdbcUrl = args[0];
String username = args[1];
String password = args[2];
String sql = "INSERT INTO public.doc_java_sdk_events (event_id, user_id) VALUES (?, ?)";
try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setString(1, "event_001");
statement.setInt(2, 10001);
statement.execute();
}
}
}
⚠️ 注意:Lakehouse JDBC 不支持通过
executeUpdate()
executeUpdate()
获取受影响行数。执行 DML 时使用
execute()
execute()
,再通过查询目标表或作业状态确认执行结果。
⚠️ 注意:JDBC DML 更适合低频、小批量写入。高频事件写入使用
RealtimeStream
RealtimeStream
,大批量历史数据导入使用 Bulkload。
获取作业 ID
JDBC 驱动提供
CZStatement
CZStatement
扩展类。每次执行 SQL 后,可以通过
getJobId()
getJobId()
获取最近一次提交的作业 ID。
import com.clickzetta.client.jdbc.core.CZStatement;
import java.sql.Connection;
import java.sql.DriverManager;
public class JobIdDemo {
public static void main(String[] args) throws Exception {
String jdbcUrl = args[0];
String username = args[1];
String password = args[2];
try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
CZStatement statement = (CZStatement) connection.createStatement()) {
statement.execute("SELECT 1");
String jobId = statement.getJobId();
System.out.println("jobId=" + jobId);
}
}
}
⚠️ 注意:
getJobId()
getJobId()
只能返回当前
CZStatement
CZStatement
最近一次执行 SQL 的作业 ID。需要追踪多条 SQL 时,建议每次执行后立即读取并保存。
相关文档