You need to enable JavaScript to run this app.
导航
ClickHouse JDBC Driver
最近更新时间:2025.01.27 15:03:18首次发布时间:2023.11.01 11:10:13

您可以通过开源的 ClickHouse JDBC 驱动程序连接到 ByteHouse 云数仓版,连接后进行库表操作、数据写入查询等。本文为您介绍ClickHouse JDBC驱动连接ByteHouse 云数仓版的主要操作流程和操作要点。

准备工作

下载驱动

驱动

已验证版本/注意事项

ClickHouse JDBC基础驱动

0.4.2,驱动下载链接

Java

已验证版本:OpenJDK 11

安装驱动

  • Maven

    <!-- https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc -->
    <dependency>
        <groupId>com.clickhouse</groupId>
        <artifactId>clickhouse-jdbc</artifactId>
        <version>0.4.2</version>
    </dependency>
    
  • Gradle

    // https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc
    implementation 'com.clickhouse:clickhouse-jdbc:0.4.2'
    

连接ByteHouse
  1. 驱动安装后,进入以下class:com. click house.jd bc.click House Driver

  2. 配置ByteHouse连接参数。

    1. 在URL中指定ByteHouse的连接参数。

      jdbc:clickhouse://tenant-{TENANT_ID}-{REGION}-public.bytehouse.volces.com:8123/{DATABASE}?user=bytehouse&password={API_KEY}&ssl=true&compress=0
      
    2. 在properties中设置ByteHouse连接参数。

      String url = jdbc:clickhouse://tenant-{TENANT_ID}-{REGION}-public.bytehouse.volces.com:8123/{DATABASE};
      
      Properties properties = new Properties();
      properties.setProperty("user", bytehouse);
      properties.setProperty("password", {API_KEY});
      properties.setProperty("ssl", "true");
      properties.setProperty("compress", "0");
      return new ClickHouseDriver().connect(url, properties);
      

      参数

      配置说明

      url参数

      {TENANT_ID}

      火山引擎主账号UID。

      {REGION}

      ByteHouse的地域。

      {DATABASE}

      ByteHouse数据库名称。

      Properties参数

      user & password

      登录ByteHouse数据库的用户名和密码。

      • user:固定为 bytehouse
      • password:为<API_Key>,配置为ByteHouse的租户管理>连接信息中获取的API Key。

      ssl

      开启安全协议SSL。

      注意

      ByteHouse 需要加密认证,从而保护数据安全,因此您需打开SSL。

  3. (可选)配置连接ByteHouse后使用的计算组。
    如果您有多个计算组,希望后续查询ByteHouse数据时使用指定计算组,或者希望设置其他指定参数,您可以在custom_http_params中进行设置。

    properties.setProperty("custom_http_params", "virtual_warehouse=vw-{AccountID}-{VW_Name}");
    

结果验证

创建库表

执行基本的SQL查询:

Statement statement = connection.createStatement();

// Create database
statement.execute("CREATE DATABASE IF NOT EXISTS test_db");

// Create table
statement.execute("CREATE TABLE test_db.test_table (id Int32) "
    + "ENGINE = CnchMergeTree() ORDER BY tuple()");

// Insert data
statement.execute("INSERT INTO test_db.test_table VALUES (1), (2), (3)");

批量写入数据

使用PreparedStatement进行参数化查询/批量数据写入

PreparedStatement preparedStatement = connection.prepareStatement(
    "INSERT INTO test_db.test_table VALUES (?)");
preparedStatement.setInt(1, 4);
preparedStatement.addBatch();
preparedStatement.executeBatch();

查询写入结果

检索和处理查询结果:

ResultSet resultSet = statement.executeQuery("SELECT * FROM test_db.test_table");
while (resultSet.next()) {
    int value = resultSet.getInt(1);
    // Process the data
}

完整示例

这是一个展示核心功能的完整示例:

package com.bytedance.bytehouse;

import com.clickhouse.jdbc.ClickHouseDriver;
import java.sql.*;
import java.util.Properties;

public class ClickHouseExample {
    public static void main(String[] args) {
        String jdbcUrl = "jdbc:clickhouse://tenant-{TENANT_ID}-{REGION}-public.bytehouse.volces.com:8123/{DATABASE}";
        Properties properties = new Properties();
        properties.setProperty("user", bytehouse);
        properties.setProperty("password", {API_KEY});
        properties.setProperty("ssl", "true");
        properties.setProperty("compress", "0");
        properties.setProperty("custom_http_params", "virtual_warehouse=vw-{AccountID}-{VW_Name}");

        try (Connection connection = new ClickHouseDriver().connect(jdbcUrl, properties);
             Statement statement = connection.createStatement()) {

            // Create database and table
            statement.execute("CREATE DATABASE IF NOT EXISTS test_db");
            statement.execute("CREATE TABLE test_db.test_table (id Int32) "
                    + "ENGINE = CnchMergeTree() ORDER BY tuple()");

            // Insert data using simple statement
            statement.execute("INSERT INTO test_db.test_table VALUES (1), (2), (3)");

            // Insert data using prepared statement
            try (PreparedStatement preparedStatement =
                         connection.prepareStatement("INSERT INTO test_db.test_table VALUES (?)")) {
                preparedStatement.setInt(1, 4);
                preparedStatement.addBatch();
                preparedStatement.executeBatch();
            }

            // Query and process results
            try (ResultSet resultSet =
                         statement.executeQuery("SELECT * FROM test_db.test_table")) {
                while (resultSet.next()) {
                    System.out.println("Value: " + resultSet.getInt(1));
                }
            }
        } catch (SQLException e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}