文档下载建议反馈入口

  • 前提条件
  • 配置连接
  • 连接数据库
  • 配置示例
  • 参考信息

使用 JDBC 连接 KaiwuDB

Java 数据库连接(Java Database Connectivity,JDBC)是 Java 应用程序访问数据库的标准 API,通过提供统一的接口,允许 Java 应用程序与不同类型的数据库进行交互。

KaiwuDB JDBC 驱动程序是 KaiwuDB 官方提供的 Java 连接器,支持执行查询、插入、更新和删除等数据库操作。驱动程序在将 Java 数据类型发送到数据库之前,会将其转换为相应的 JDBC 类型。有关数据类型对比转换的详细信息,参见支持的数据类型。

KaiwuDB JDBC 基于 PgJDBC 扩展实现,符合 JDBC 4.0、JDBC 4.1 和 JDBC 4.2 规范。支持 PG 扩展协议‘M’类消息支持,支持列式批量数据传输及 Snappy/LZ4 压缩功能。支持扩展 pgwire prepare/bind 写入模式,新增私有 ‘j/k/l’ 消息,实现数据批量快速写入。Java 开发人员可以使用 KaiwuDB JDBC 驱动程序向 KaiwuDB 的服务进程发送消息,访问任何形式的表格数据,操作流程如下:

  1. 连接数据源并创建到数据库的连接。
  2. 创建查询或更新指令。
  3. 为数据库传递查询和更新指令。
  4. 处理数据库响应并返回的结果。

前提条件

配置连接

  1. 在 pom.xml 中添加依赖,将 KaiwuDB JDBC 引入到 Java 应用程序中。

    <dependency>
      <groupId>com.kaiwudb</groupId>
      <artifactId>kaiwudb-jdbc</artifactId>
      <version>3.3.0</version>
    </dependency>
    
  2. 如上述依赖无法正常加载使用,运行以下命令,将 KaiwuDB JDBC 驱动安装到本地 Maven 仓库中。

    mvn install:install-file "-Dfile=../kaiwudb-jdbc-3.3.0.jar" "-DgroupId=com.kaiwudb" "-DartifactId=kaiwudb-jdbc" "-Dversion=3.3.0" "-Dpackaging=jar"
    

连接数据库

连接方式

用户需要编写 Java 程序代码,连接数据库。Java 程序代码需要包含以下内容:

  • Driver:由数据库厂家提供,处理与数据库服务器的通信。对于 KaiwuDB,必须先加载 KaiwuDB 数据库驱动程序类,加载方式如下:

    Class.forName("com.kaiwudb.Driver");
    
  • 数据库连接接口:通过 DriverManager.getConnection() 方法与 KaiwuDB 数据库建立连接安全连接和非安全连接。KaiwuDB 支持的连接方式如下:

    • URL 标准连接

      Connection conn = DriverManager.getConnection(url):通过 url 参数指定连接数据库所需的所有信息,包括数据库地址、端口、名称、用户名和密码。有关支持的 URL 参数,参见 URL 参数。

    • 带用户名和密码的连接

      Connection conn = DriverManager.getConnection(url, user, password):通过 url 参数指定数据库地址、端口和名称。通过 user 和 password 参数指定用户名称和密码。

    • 带属性的连接

      Connection conn = DriverManager.getConnection(url, props):通过 url 参数指定数据库地址、端口和名称。通过 props 参数单独指定其它需要必要信息。有关支持的属性参数,参见 URL 参数和属性参数。

连接参数

URL 参数

下表列出驱动程序支持在连接 url 或 props 对象中指定的标准连接参数。

参数默认值说明
hostnamenullKaiwuDB 数据库的 IP 地址。
portnullKaiwuDB 数据库的连接端口。
dbnamenull需要访问的数据库名称。
usernull连接数据库的用户名。
passwordnull身份验证时使用的密码。

属性参数

除标准连接参数之外,驱动程序还支持许多附加属性,用于指定附加驱动行为。下表列出驱动程序支持在连接 url 或 props 对象中指定的其他参数。

参数默认值说明
usernull连接数据库的用户名。
passwordnull身份验证时使用的密码。
sslnull使用 SSL 连接,服务器必须使用 SSL 进行编译。
sslmodenullSSL 模式,支持的取值包括 disable、allow、prefer、require、verify-ca 和 verify-full。有关 SSL 模式参数的详细信息,参见 SSL 模式参数。
sslcertnull客户端 TLS 或 TLCP 证书的存放位置。
sslkeynull客户端 pkcs#8 格式的 TLS 或 TLCP 密钥的存放位置。
sslrootcertnull用于验证服务器身份的 TLS 或 TLCP 根证书的存放位置。
sslsigncertnullTLCP 签名证书的存放位置。
sslsignkeynullTLCP 签名私钥的存放位置。
ssl_max_protocol_versionnullTLCP 协议的版本号。
ApplicationNameKaiwuDB JDBC Driver应用名称。
tcpKeepAlivefalse开启或禁用 TCP 保持连接功能。
loginTimeout0指定等待建立数据库连接的时间(单位:秒)。
connectTimeout10用于 Socket 连接操作的超时值(单位:秒)。取值为 0 时,表示禁用。
socketTimeout0用于 Socket 读操作的超时值(单位:秒)。取值为 0 时,表示禁用。
cancelSignalTimeout10发送 cancel 命令的超时时间(单位:秒)。
readOnlyfalse配置连接模式为只读模式。
preferQueryModeextended指定执行对数据库的查询时使用的模式。支持的取值包括:simple、extended、extendedForPrepared 和 extendedCacheEverything。
注意:使用 PreparedStatement 对象中的 setXXX()方法函数,如:setBytes(int i, byte[] value) 时,preferQueryMode 应使用默认值 extended,不能设置为 simple 模式。

SSL 模式参数

安全模式下,JDBC 支持多种连接认证。通过 sslmode 连接参数,用户可以进一步控制 SSL 连接。

参数窃听保护MITM 保护说明是否支持
disable否否不使用加密连接。是
allow可能否从非加密连接开始,然后尝试加密连接。是
prefer可能否(默认选项)从加密连接开始,回退到非加密连接。是
require是否确保已加密连接。是
verify-ca是取决于 CA 的政策确保已加密连接,并且客户端信任服务器证书。是
verify-full是是确保已加密连接,客户端信任服务器证书,并且服务器主机名与服务器证书列出的主机名匹配。否

连接示例

非安全连接

  • URL 连接

    以下示例使用 url 参数连接数据库。

    public Connection getConnection() throws Exception{
      Class.forName("com.kaiwudb.Driver");
      Connection conn = DriverManager.getConnection("jdbc:kaiwudb://127.0.0.1:26257/defaultdb?user=kwdbuser&password=123");
      return conn;
    }
    
  • 带属性的连接

    以下示例使用用户名和密码属性参数连接数据库。

    public Connection getConnection() throws Exception{
      Class.forName("com.kaiwudb.Driver");
      String jdbcUrl= "jdbc:kaiwudb://127.0.0.1:26257/defaultdb";
      Properties props = newProperties();
      props.setProperty("user", "kwdbuser");
      props.setProperty("password", "123");
      Connection conn = DriverManager.getConnection(jdbcUrl, props);
      return conn;
    }
    

TLS 安全连接

以下示例使用 url 参数连接数据库。

public Connection getConnection() throws Exception{
  Class.forName("com.kaiwudb.Driver");
  Connection conn = DriverManager.getConnection("jdbc:kaiwudb://127.0.0.1:26257/defaultdb?user=kwdbuser&password=123&sslmode=verify-ca&sslcert=../certs/client.kwdbuser.crt&sslkey=../certs/client.kwdbuser.pk8&sslrootcert=../certs/ca.crt");
  return conn;
}

TLCP 安全连接

  • URL 连接

    以下示例使用 url 参数连接数据库。

    public void testConnection() {
        Connection connection = null;
        try {
            Class.forName("com.kaiwudb.Driver");
            String url = "jdbc:kaiwudb://127.0.0.1:26257/defaultdb?user=test&password=Password@123#&sslmode=verify-ca&sslcert=/certs/client_enc.root.crt&sslkey=/certs/client_enc.root.key&sslsigncert=/certs/client_sign.root.crt&sslsignkey=/certs/client_sign.root.key&sslrootcert=/certs/tlcp_ca.crt&ssl_max_protocol_version=TLCPv1.1";
            connection = DriverManager.getConnection(url);
            System.out.println("create connection success.");
        } catch (ClassNotFoundException | SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (null != connection) {
                    connection.close();
                    System.out.println("close connection success.");
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }
    
  • 带属性的连接

    以下示例使用 TLCP 属性参数连接数据库。

    public void testTlcpConnection() {
        Connection connection = null;
        try {
            // 加载升级后的KaiwuDB驱动
            Class.forName("com.kaiwudb.Driver");
            // set ssl properties
            Properties props = new Properties();
            String certsPath = "/home/inspur/kwdb/certs-tlcp/";
            props.setProperty("sslmode", "verify-ca");
            props.setProperty("ssl_max_protocol_version", "TLCPv1.1");
            props.setProperty("sslrootcert", (certsPath + "tlcp_ca.crt"));
            props.setProperty("sslcert", (certsPath + "client_enc.root.crt"));
            props.setProperty("sslkey", (certsPath + "client_enc.root.key"));
            props.setProperty("sslsigncert", (certsPath + "client_sign.root.crt"));
            props.setProperty("sslsignkey", (certsPath + "client_sign.root.key"));
            
            String url = "jdbc:kaiwudb://127.0.0.1:26257/defaultdb?user=root";
            connection = DriverManager.getConnection(url, props);
            System.out.println("Create connection success.");
            if (null == connection) {
            System.out.println("JDBC connection not exist.");
            } else {
            SQLUtil.executeSql(connection);
            }
        } catch (ClassNotFoundException | SQLException ex) {
            System.out.println("exception: " + ex.getMessage());
        } finally {
            try {
                if (null != connection) {
                    connection.close();
                    System.out.println("Close connection success.");
                }
            } catch (Exception ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
    

配置示例

本节通过一些简单的示例展示如何使用 Java 应用程序进行数据库的 SQL 操作。如需了解更多 SQL 语句的使用,参见 SQL 参考。

说明

由于不同数据引擎对 JDBC 不同接口的支持有差异,在连接不同引擎后,部分接口的使用存在一些限制:

  • 时序引擎不支持事务,在 autoCommit 参数设置为 false 时,不允许执行 INSERT 语句。
  • 时序引擎不支持设置保存点、游标以及批量更新操作等功能。
  • 关系和时序引擎均不支持用户创建、使用 SQLXML 对象。
  • 关系和时序引擎均不支持用户设置可保持性级别参数(Holdability)。
  • 关系和时序引擎均不支持存储过程功能。
  • 关系和时序引擎均不支持执行 EXPORT 和 IMPORT 语句。

创建、使用、删除数据库

说明

  • 如果未使用 use <db_name> 参数指定数据库,后续对表的操作都需要使用数据库名称作为前缀,例如 ts_db.t1。
  • 目前,时序数据库名称不支持中文字符。
// 获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:kaiwudb://127.0.0.1:26257/defaultdb?user=kwdbuser&password=123");

// 创建statement
Statement stmt = conn.createStatement();

// 创建时序数据库
stmt.executeUpdate("create ts database ts_db");

// 使用数据库
stmt.executeUpdate("use ts_db");

// 删除数据库
stmt.executeUpdate("drop database ts_db cascade");

创建、删除表

说明

  • 在创建时序表时,第一列的数据类型必须为 timestamp 或 timestamptz 且不可为空值。
  • 每张时序表需要设置至少一个主标签,且主标签必须为非空标签。
  • 时序表名、列名和标签名暂不支持中文字符。
// 创建statement
Statement stmt = conn.createStatement();

// 创建时序表
stmt.executeUpdate("CREATE TABLE sensor_data (k_timestamp TIMESTAMPTZ NOT NULL, temperature FLOAT8 NOT NULL, humidity FLOAT8) TAGS (sensor_id INT4 NOT NULL, sensor_type INT4 NOT NULL) PRIMARY TAGS(sensor_id)");

// 删除时序表
stmt.executeUpdate("drop table ts_table");

写入数据

// 创建statement
Statement stmt = conn.createStatement();

// 按照指定的列顺序插入数据
int rows1 = stmt.executeUpdate("insert into sensor_data (k_timestamp, temperature, humidity, sensor_id, sensor_type) values ('2023-07-20 16:12:12.123', 23.34, 55.20, 1,1)");
System.out.println("specify column name insert " + rows1 + " rows data.");

// 按照默认的列顺序插入数据
int rows2 = stmt.executeUpdate("insert into sensor_data values ('2023-07-20 16:12:12.123', 23.34, 55.20, 1,1)");
System.out.println("not specify column name insert " + rows2 + " rows data.");

查询数据

说明

KaiwuDB 支持使用下标或字段名获取数据。使用下标获取数据时,返回内容从 1 开始。建议使用字段名称获取数据。

// 创建statement
Statement stmt = conn.createStatement();

// 查询数据
ResultSet resultSet = stmt.executeQuery("select k_timestamp as ts, temperature, humidity from sensor_data");

Timestamp ts = null;
float temperature = 0;
float humidity = 0;

while(resultSet.next()){
  ts = resultSet.getTimestamp(1);
  temperature = resultSet.getFloat(2);
  humidity = resultSet.getFloat(3);
  System.out.printf("%s, %s, %s\n", ts, temperature, humidity);
}

扩展查询协议验证

说明

KaiwuDB 支持通过SQL会话变量动态控制扩展协议开关,但需同时满足以下条件。

  • KaiwuDB 数据库服务端版本需支持 pg_extend_compress 会话参数配置,版本不低于 3.2.0。
  • JDBC驱动版本不低于3.2.0。

启用PG扩展协议压缩功能,通过会话变量 pg_extend_compress 控制:

SET pg_extend_compress = off --关闭扩展协议(默认,走标准PG协议)
SET pg_extend_compress = lz4_compress --启用LZ4压缩的扩展协议
SET pg_extend_compress = snappy_compress --启用Snappy压缩的扩展协议
public void testPgExtendProtocol() {
    Connection connection = null;
    try {
        Class.forName("com.kaiwudb.Driver");
        String url = "jdbc :kaiwudb://127.0.0.1:26257/tsdb?user=test&password=Password@2024";
        connection = DriverManager.getConnection(url);  
        Statement stmt = connection.createStatement();
        String querySql = "SELECT device, avg(value) as avg_value FROM tsdb.meters"
        + "WHERE device = 'dev1' GROUP BY device LIMIT 50000";

        // 场景1:默认关闭,走标准PG协议
        System.out.println("=== Standard PG Protocol (off) ===");
        try (ResultSet rs = stmt.executeQuery(querySql)) {
            processResultSet(rs);
        }
 
       // 场景2:启用LZ4压缩扩展协议
       System.out.println("=== Extended Protocol (LZ4) ===");
       stmt.execute("SET pg_extend_compress = lz4_compress");
       try (ResultSet rs = stmt.executeQuery(querySql)) {
           processResultSet(rs);
        }

       // 场景3:切换Snappy压缩扩展协议
       System.out.println("=== Extended Protocol (Snappy) ===");
       stmt.execute("SET pg_extend_compress = snappy_compress");
       try (ResultSet rs = stmt.executeQuery(querySql)) {
           processResultSet(rs);
        }

        // 场景4:关闭扩展协议,回归标准PG协议
        System.out.println("=== Back to Standard PG Protocol ===");
        stmt.execute("SET pg_extend_compress = off");
        try (ResultSet rs = stmt.executeQuery(querySql)) {
            processResultSet(rs);
        }
    } catch (ClassNotFoundException | SQLException ex) {
        System.err.println("Exception:" + ex.getMessage());
    }
}

private void processResultSet(Resultset rs) throws SQLException{
    ResultSetMetaData metaData = rs.getMetaData();
    int columncount = metaData.getcolumncount();
    int rowCount = 0;
    while (rs.next()) {
        rowCount++;
        // 逐行处理结果
    }
    System.out.println("Processed " + rowCount + "rows," + columnCount +" columns");
}

Prepare-extend 写入扩展模式

prepare-extend 写入模式是 KaiwuDB 自定义的时序表批量直插协议,使用该模式需要满足以下条件:

  • KaiwuDB数据库服务端版本需支持 prepare_extend 写入模式,KaiwuDB 版本不低于 3.3.0。
  • JDBC 驱动版本不低于3.3.0。
  • 会话开启 tsinsert_direct,否则 ‘j’ 消息被服务端拒绝(错误码 08P01 )。
  • prepare-extend 写入模式仅支持时序表。支持单表名、库表.表名、库名.public.表名。

消息类型

prepare-extend 写入模式的三条扩展消息:

消息类型标识方向作用
ParseExj客户端→服务端按表名准备时序表直插语句(无SQL文本)
ParameterDescriptionExk服务端→客户端返回时序表列元数据(OID/标签下标/主标签下标/存储长度)
BindExl客户端→服务端按主标签分组批量Payload写入,绑定即执行

调用流程

调用 prepareTsStatement(tableName)
   │
   ├─ 前置校验:连接未关闭、tableName 非空、格式合法
   ├─ 客户端表名解析
   ├─ 服务端 'j' 消息校验:会话 tsinsert_direct 开启、时序表、public schema
   │    └─ 任一不满足 → 服务端 08P01 → 客户端原样上抛 → 结束
   ├─ 成功 → 'k' 返回列元数据 → 构建 KWTSPreparedStatement
   │
调用 executeBatch()
   ├─ 按主标签值分组 → 每组编码 Payload V2 → 'l' 消息(绑定即执行)
   ├─ 服务端校验 Payload 帧/行数 → 回填头部 → 写入
   ├─ 'C' 返回总插入行数 → 批次清空
调用 close()
   └─ Close('C'语句) → 释放服务端准备语句

接口明细

接口说明
setTimePrecision(columnIndex, precision)precision ∈ {3,6,9},默认3(毫秒);
1起始列下标,含时间列;
仅 TIMESTAMP/TIMESTAMPTZ 列可设置,非时间列抛异常;
须在 executeBatch 前调用
getMaxBindExBytes()获取/设置单条'l'消息大小上限(默认 512MB,须为正数)
setMaxBindExBytes(int)单条 'l' 消息大小上限,默认512MB;
须为正数,超限时报错
addBatch()将当前 setter 行缓冲为一新行;时间列与全部主标签列必须已设置且主标签非NULL,其余数据列未设置默认 NULL(部分列插入,NOT NULL 列由服务端约束报错)
addBatch(Object[] ptagValues, Object[] ordinaryTagValues, Object[] dataValues)按主标签值数组+普通标签值数组+数据列值数组直接追加一行;普通标签允许 NULL,可为 null 或空数组
getTsParameterDescription()返回服务端'k'消息下发的列元数据(列OID、tagIndex、主标签列下标、存储长度)
getTsRowCount()返回当前已缓冲未发送的行数
executeBatch整批行一次提交完成写入,返回单元素数组,元素值 = 服务端实际写入的总行数;数组求和即实际写入行数;executeBatch() 在总行数超 int 范围时提示改用 executeLargeBatch()

批量直插示例

public void testPrepareExtend() {
    Class.forName("com.kaiwudb.Driver");
    String url = "jdbc :kaiwudb://127.0.0.1:26257/tsdb?user=test&password=Password@2024";
    try (Connection connection = DriverManager.getConnection(url);  Statement stmt = conn.createStatement() ) {
        // 删除表
        stmt.execute("drop table if exists tsdb.ts_tb cascade");
        // 建表:时间列 + 数据列 + 标签列,主标签 (t1, t2)
        stmt.execute("create table tsdb.ts_tb (ts timestamptz not null, c1 int8, c2 varchar(32)) tags (t1 int not null, t2 varchar not null) primary tags (t1, t2)");

        try (KWTSPreparedStatement ps = ((KwConnection) conn).prepareTsStatement("tsdb.ts_tb")) {
            for (int i = 0; i < 10000; i++) {
                ps.setTimestamp(1, new Timestamp(System.currentTimeMillis() + i * 1000L));
                ps.setLong(2, i);
                ps.setString(3, "v" + i);
                ps.setInt(4, i % 2);
                ps.setString(5, "host" + (i % 100));
                ps.addBatch();
            }
                int[] rows = ps.executeBatch();
                System.out.println("inserted: " + rows[0]);
        } catch (SQLException ex) {
            System.err.println("Exception: " + ex.getMessage());
        }
    }
} 

说明

  • 支持的 setter :setObject 、 setBoolean 、 setByte 、 setShort 、 setInt 、 setLong 、 setFloat 、 setDouble 、 setBigDecimal 、 setString 、 setBytes 、 setDate 、 setTime 、 setTimestamp 、 setNull;
  • 不支持的 setter (抛 SQLException):setAsciiStream 、 setBinaryStream 、 setCharacterStream 、 setBlob 、 setClob 、 setArray 、 setSQLXML 、 setNString 等流式与大对象接口;
  • 不支持的标准执行方法(抛 SQLException):execute 、 executeQuery 、 executeUpdate 、 executeLargeUpdate 、 executeWithFlags 、 addBatch(String)。

异常场景

场景异常表现
会话未开启 tsinsert_direct 时调用 prepareTsStatement服务端返回协议违规,客户端原样抛出 SQLException;连接与标准协议不受影响,后续调用独立尝试
表名为单表名且连接串未指定数据库(无法补全)客户端抛异常,提示使用 db.table 或 db.schema.table,发送前拒绝,不触发服务端
表名非法:含空段(tsdb..ts_tb)或段数超过3(a.b.c.d)客户端抛异常,发送前拒绝,不触发服务端
schema 非 public(db.my_schema.ts_tb)客户端抛异常,提示仅支持 public schema,发送前拒绝
目标表非时序表服务端返回协议违规,客户端原样上抛,连接不受影响
addBatch() 时时间列未设置客户端抛异常,发送前拒绝;其余数据列未设置默认 NULL(NOT NULL 列由服务端非空约束报错)
setTimePrecision 作用于非 TIMESTAMP/TIMESTAMPTZ 列客户端抛异常,发送前拒绝;仅时间类型列可设置精度,避免配置错位被静默吞掉

参考信息

支持的数据类型

下表列出 Java 数据类型和 JDBC 数据类型的对比转换关系。

SQLJDBC关系引擎支持时序引擎支持
BITjava.lang.String是否
BOOLjava.lang.Boolean是是
SMALLINTjava.lang.Integer是是
INTEGERjava.lang.Integer是是
BIGINTjava.lang.Long是是
REALjava.lang.Float是是
DOUBLEjava.lang.Double是是
DECIMALjava.math.BigDecimal是否
DATEjava.sql.Date是否
TIMEjava.sql.Time是否
TIMESTAMPjava.sql.Timestamp是是
CHARjava.lang.String是是
VARCHARjava.lang.String是是
NCHARjava.lang.String是是
NVARCHARjava.lang.String是是
BYTESbyte[] ([B])是否
VARBYTESbyte[] ([B])是是
BLOBbyte[] ([B])是否
CLOBjava.lang.String是否
JSONcom.kaiwudb.util.KWobject是否
GEOMETRYjava.lang.String否是
ARRAYjava.sql.Array是否

异常处理

驱动程序和数据库都可能出现 SQLException 异常。出现 SQLException 异常时,异常对象将被传递到 catch 子句。用户可通过 catch 子句获取错误的消息和错误码等信息。SQLException 接口方法如下表所示:

方法描述
getErrorCode()获取与异常关联的错误码,返回为 INT 类型值。
getMessage()- 获取 JDBC 驱动程序的错误信息,该错误由驱动程序处理。
- 获取数据库错误的错误码和错误信息。
getSQLState()获取 XOPEN SQLstate 字符串。对于 JDBC 驱动程序错误,此方法不返回任何有用信息。对于数据库错误,将返回五位数的 XOPEN SQLstate 代码。此方法可以返回 Null。
getNextException()获取异常链中的下一个 Exception 对象。
printStackTrace()打印当前异常或可调用异常,并将其回溯到标准错误流。
printStackTrace(PrintStream s)将可丢弃对象及其回溯,打印到指定的打印流。
printStackTrace(PrintWriter w)打印一次性文件,并将其回溯到指定的打印编写器。

利用 SQLException 对象提供的信息,用户可以捕获异常并继续运行程序。以下是 try .... catch ... finally 代码块的一般格式:

**try** {
   // Your risky code goes between these curly braces.
} **catch**(SQLException e) {
   // Your exception handling code goes between these curly braces.
   // similar to the exception clause in a SQL block.
} **finally** {
   // Your must-always-be-executed code goes between these curly braces.
   // Like closing database connection.
}

错误码

KaiwuDB JDBC 连接器的错误码分为两种:

故障诊断与排查

更多详细信息,参见 KaiwuDB JDBC 故障排查。