You need to enable JavaScript to run this app.
导航
MySQL JDBC Driver
最近更新时间:2025.06.12 10:11:08首次发布时间:2024.08.01 20:24:06
我的收藏
有用
有用
无用
无用

您可以通过开源的 MySQL JDBC 驱动程序连接到 ByteHouse 云数仓版。

使用限制

数据库用户功能为 Beta 功能,如需使用数据库用户连接,请联系提交工单或联系 ByteHouse 团队获取白名单权限。

前提条件
  1. MySQL JDBC Driver 版本: 8.3.0 及以上版本;
  2. OpenJDK 版本: 8 及以上版本;
  3. 拥有 ByteHouse 账号。

安装 Maven 依赖
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.3.0</version>
</dependency>

基本用法

连接信息

通过 MySQL JDBC Driver 连接 ByteHouse 的字符串信息如下,其中 {HOST}{USER}、需要的验证密钥 {API_KEY}{PASSWORD} 信息请参考获取 ByteHouse 连接信息获取,{Port} 默认值为 3306。

jdbc:mysql://{HOST}:{Port}/{DATABASE_NAME}

参数

使用 IAM 用户连接

使用数据库用户连接

host

配置为 ByteHouse 的网络域名,您可以在 ByteHouse 控制台的 租户管理>基本信息>网络信息 中查看对应信息。详情请参见步骤二:配置网络信息

配置为 ByteHouse 的网络域名,您可以在 ByteHouse 控制台的 租户管理>基本信息>网络信息 中查看对应信息。详情请参见步骤二:配置网络信息

port

配置为固定值 3306。

配置为固定值 3306。

user & password

  • user:固定配置为 bytehouse
  • password:为 ByteHouse 的 <API_Key>,您可以在 ByteHouse 控制台的 租户管理>连接信息 中获取API Key。详情请参见获取 API Key
  • user 配置为 {accountID_or_accountName}::{username}[::{envID}],详情请参见步骤三:获取 ByteHouse 连接串信息
    • {accountID_or_accountName} :指火山引擎用户账号 ID 或名称,可登录 ByteHouse 控制台,单击右上角个人中心查看并复制账号 ID 或名称。
    • {username} :指登录 ByteHouse 数据库的用户名。登录 ByteHouse 数据库账号用户名。可在 ByteHouse 控制台>权限管理>用户>查看数据库用户名
    • envID:可选,指数据库所在的环境名称。如果使用 default 环境,可不配置,如需使用其他环境,需指定环境名称。您可登录 ByteHouse 控制台,在租户管理>基本信息>**当前环境 **中获取。
  • password:可联系管理员获取数据库账号的密码。如果密码丢失或遗忘,可通联系管理员重置密码,详情请参考重置密码

database

配置为连接 ByteHouse 的数据库名称。

配置为连接 ByteHouse 的数据库名称。

数据插入与查询

使用 IAM 用户

您可以参考下面的代码示例来进行数据插入与查询,注意替换连接信息,详见上文连接信息

import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.sql.*;

public class TestMySQLConnection {

    private Connection connection;

    @BeforeClass
    private void beforeClass() throws SQLException, ClassNotFoundException {

        String host = "{HOST}";
        int port = 3306;
        String user = "bytehouse";
        String password = "{API_KEY}";//API_key密钥
        String database = "{DATABASE_NAME}"; //数据库名称

        String url = String.format("jdbc:mysql://%s:%d/%s", host, port, database);

        Class.forName(com.mysql.cj.jdbc.Driver.class.getName());
        connection = DriverManager.getConnection(url, user, password);
    }


    @AfterClass
    public void tearDown() throws SQLException {
        // 关闭数据库连接
        if (connection != null) {
            connection.close();
        }
    }

    @Test
    public void testShowDatabases() {
        String sql = "show databases;";
        try {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);
            System.out.println(toCSV(resultSet));
            statement.close();
        } catch (SQLException e) {
            Assert.fail(String.format("Failed to execute: %s:%s", sql, e.getMessage()));
        }
    }

    private String toCSV(ResultSet resultSet) throws SQLException {
        StringBuilder builder = new StringBuilder();

        // 获取列名
        for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) {
            builder.append(resultSet.getMetaData().getColumnLabel(i));
            if (i < resultSet.getMetaData().getColumnCount()) {
                builder.append(",");
            } else {
                builder.append('\n');
            }
        }

        // 获取数据
        int columnCount = resultSet.getMetaData().getColumnCount();
        while (resultSet.next()) {
            for (int colIndex = 1; colIndex <= columnCount; colIndex++) {
                Object result = resultSet.getObject(colIndex);
                if (null == result) {
                    builder.append("\\N");
                } else {
                    builder.append(resultSet.getString(colIndex));
                }
                if (colIndex < resultSet.getMetaData().getColumnCount()) {
                    builder.append(",");
                }
            }
            builder.append('\n');
        }
        return builder.toString();
    }
}

使用数据库用户

您可以参考下面的代码示例来进行数据插入与查询,注意替换连接信息,详见上文连接信息

import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.sql.*;

public class TestMySQLConnection {

    private Connection connection;

    @BeforeClass
    private void beforeClass() throws SQLException, ClassNotFoundException {

        String host = "{HOST}";
        int port = 3306;
        String user = "{accountID_or_accountName}::{username}[::{envID}] ";
        String password = "{PASSWORD}";//数据库账号密钥
        String database = "{DATABASE_NAME}"; //数据库名称

        String url = String.format("jdbc:mysql://%s:%d/%s", host, port, database);

        Class.forName(com.mysql.cj.jdbc.Driver.class.getName());
        connection = DriverManager.getConnection(url, user, password);
    }


    @AfterClass
    public void tearDown() throws SQLException {
        // 关闭数据库连接
        if (connection != null) {
            connection.close();
        }
    }

    @Test
    public void testShowDatabases() {
        String sql = "show databases;";
        try {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);
            System.out.println(toCSV(resultSet));
            statement.close();
        } catch (SQLException e) {
            Assert.fail(String.format("Failed to execute: %s:%s", sql, e.getMessage()));
        }
    }

    private String toCSV(ResultSet resultSet) throws SQLException {
        StringBuilder builder = new StringBuilder();

        // 获取列名
        for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) {
            builder.append(resultSet.getMetaData().getColumnLabel(i));
            if (i < resultSet.getMetaData().getColumnCount()) {
                builder.append(",");
            } else {
                builder.append('\n');
            }
        }

        // 获取数据
        int columnCount = resultSet.getMetaData().getColumnCount();
        while (resultSet.next()) {
            for (int colIndex = 1; colIndex <= columnCount; colIndex++) {
                Object result = resultSet.getObject(colIndex);
                if (null == result) {
                    builder.append("\\N");
                } else {
                    builder.append(resultSet.getString(colIndex));
                }
                if (colIndex < resultSet.getMetaData().getColumnCount()) {
                    builder.append(",");
                }
            }
            builder.append('\n');
        }
        return builder.toString();
    }
}

常见问题

异常描述

解决方案

DB::Exception: No local available worker group for vw-xxxx

请在 计算组 页面,确认 默认计算组的 状态是否在 正在运行的状态

com.mysql.cj.exceptions.CJException: unknown error: Code: UNAUTHENTICATED

请确认配置的usernamepassword是否配置正确

DB::Exception: Database xxx.yyy doesn't exist

请确认连接串里数据库名称是否配置正确

Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

请在连接URL后面增加一个参数 enabledTLSProtocols=TLSv1.2,TLSv1.3
举例如下:
String url = String.format("jdbc:mysql://%s:%d/%s?enabledTLSProtocols=TLSv1.2,TLSv1.3", host, port, database);