tdengine学习笔记实战-jdbc连接tdengine数据库

先上代码,里面有两种获取连接的方式,一个单例,一个连接池

java 复制代码
package com.tdengine.utils;

import com.alibaba.druid.pool.DruidDataSource;

import java.sql.*;
import java.util.Properties;


public class TDConnectUtils {
    // 单例对象
    private static volatile Connection instance = null;

    //连接池的方法
    private static DruidDataSource dataSource;
    static {
        String jdbcUrl = "jdbc:TAOS-RS://192.168.81.31:6041/log";

        dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.taosdata.jdbc.rs.RestfulDriver");
        dataSource.setUrl(jdbcUrl);
        dataSource.setUsername("root");
        dataSource.setPassword("taosdata");
        // pool configurations
        dataSource.setInitialSize(10);// 初始连接数
        dataSource.setMinIdle(10);// 最小空闲连接数
        dataSource.setMaxActive(10);// 最大连接数
        dataSource.setMaxWait(30000);// 获取连接的最大等待时间,单位为毫秒
        dataSource.setTimeBetweenConnectErrorMillis(10000); // 连接错误重试间隔时间,单位为毫秒
        dataSource.setValidationQuery("SELECT 1"); // 验证连接是否有效的SQL语句
        dataSource.setTestOnBorrow(true); // 借出连接时验证
        dataSource.setTestOnReturn(false); // 归还连接时验证
        dataSource.setTestWhileIdle(true); // 空闲时验证
        dataSource.setPoolPreparedStatements(true); // 是否开启PSCache
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(20); // 每个连接中PSCache的最大值
    }

    // 私有构造函数
    private TDConnectUtils() {
        // 防止外部实例化
    }

    /*    单例*/
    public static Connection getInstance() {
        if (instance == null) {
            synchronized (TDConnectUtils.class) {
                if (instance == null) {
                    try {
                        Class.forName("com.taosdata.jdbc.TSDBDriver");

                        // 使用 REST 连接方式,不需要本地库
                        String jdbcUrl = "jdbc:TAOS-RS://192.168.81.31:6041?user=root&password=taosdata";

                        Properties connProps = new Properties();
                        connProps.setProperty("charset", "UTF-8");
                        connProps.setProperty("locale", "en_US.UTF-8");
                        connProps.setProperty("timezone", "UTC-8");

                        instance = DriverManager.getConnection(jdbcUrl, connProps);
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw new RuntimeException("Failed to connect to TDengine", e);
                    }
                }
            }
        }
        return instance;
    }

    /**
     * 获取数据库连接
     *
     * @return Connection 对象
     * @throws SQLException 如果获取连接失败
     */
    public static Connection getConnections() throws SQLException {
        return dataSource.getConnection();
    }


    public static void main(String[] args) throws SQLException {
        // 测试获取连接
        Connection conn = TDConnectUtils.getConnections();
        PreparedStatement ps = conn.prepareStatement("show tables");
        ResultSet resultSet = ps.executeQuery();
        while (resultSet.next()) {
            System.out.println(resultSet.getString("table_name"));
        }


    }


}

遇到的问题:报错解决方法

1,Failed to connect to jdbc:TAOS-WS://192.168.81.31:6041?user=root&password=taosdata, ErrCode: 0, ErrMessage: No suitable driver found for jdbc:TAOS-WS://192.168.81.31:6041?user=root&password=taosdata

java.sql.SQLException: No suitable driver found for jdbc:TAOS-WS://192.168.81.31:6041?

Failed to connect to jdbc:TAOS-WS://192.168.81.31:6041?user=root&password=taosdata, ErrCode: 0, ErrMessage: No suitable driver found for jdbc:TAOS-WS://192.168.81.31:6041?user=root&password=taosdata

java.sql.SQLException: No suitable driver found for jdbc:TAOS-WS://192.168.81.31:6041?user=root&password=taosdata

at java.sql.DriverManager.getConnection(DriverManager.java:689)

at java.sql.DriverManager.getConnection(DriverManager.java:208)

at com.zla.tdengine.utils.TDConnect.getInstance(TDConnect.java:34)

at com.zla.tdengine.utils.TDConnect.main(TDConnect.java:53)

首先确保已经在项目中添加了 TDengine JDBC 驱动依赖。如果使用 Maven,需要在 pom.xml 中添加:

复制代码
<dependency>
    <groupId>com.taosdata.jdbc</groupId>
    <artifactId>taos-jdbcdriver</artifactId>
    <version>3.3.3</version>
</dependency>

在代码中需要显式加载 JDBC 驱动。以下是修改后的代码:

java 复制代码
// ... existing code ...

    public static Connection getInstance() {
        if (instance == null) {
            synchronized (TDConnect.class) {
                if (instance == null) {
                    try {
                        // 添加这行来加载驱动
                        Class.forName("com.taosdata.jdbc.TSDBDriver");
                        
                        // 连接信息
                        String jdbcUrl = "jdbc:TAOS-WS://192.168.81.31:6041?user=root&password=taosdata";
                        Properties connProps = new Properties();
                        connProps.setProperty("enableAutoReconnect", "true");
                        connProps.setProperty("charset", "UTF-8");
                        connProps.setProperty("timezone", "UTC-8");

                        // 获取连接
                        instance = DriverManager.getConnection(jdbcUrl, connProps);
                        System.out.println("Connected to " + jdbcUrl + " successfully.");
                    } catch (SQLException ex) {
                        System.out.printf("Failed to connect to %s, %sErrMessage: %s%n",
                                jdbcUrl,
                                ex instanceof SQLException ? "ErrCode: " + ex.getErrorCode() + ", " : "",
                                ex.getMessage());
                        ex.printStackTrace();
                        throw new RuntimeException(ex);
                    } catch (ClassNotFoundException e) {
                        // 添加新的异常处理
                        System.out.println("TDengine JDBC driver not found!");
                        e.printStackTrace();
                        throw new RuntimeException(e);
                    }
                }
            }
        }
        return instance;
    }

// ... existing code ...

按照上述修改后还是报该错误,继续排查

JDBC 驱动

taos-jdbcdriver 实现了 JDBC 标准的 Driver 接口,提供了 3 个实现类。

  • WebSocket 连接使用驱动类 com.taosdata.jdbc.ws.WebSocketDriver
  • 原生连接使用驱动类 com.taosdata.jdbc.TSDBDriver
  • REST 连接使用驱动类 com.taosdata.jdbc.rs.RestfulDriver

首先确认使用的是否是正确的 JDBC URL 格式。

WebSocket 连接

使用 JDBC WebSocket 连接,不需要依赖客户端驱动。与 JDBC 原生连接相比,仅需要:

  1. driverClass 指定为"com.taosdata.jdbc.ws.WebSocketDriver";
  2. jdbcUrl 以"jdbc:TAOS-WS://"开头;
  3. 使用 6041 作为连接端口。

原生连接
jdbc:TAOS://taosdemo.com:6030/power?user=root&password=taosdata,使用了 JDBC 原生连接的 TSDBDriver,建立了到 hostname 为 taosdemo.com,端口为 6030(TDengine 的默认端口),数据库名为 power 的连接。这个 URL 中指定用户名(user)为 root,密码(password)为 taosdata。

注意:使用 JDBC 原生连接,taos-jdbcdriver 需要依赖客户端驱动(Linux 下是 libtaos.so;Windows 下是 taos.dll;macOS 下是 libtaos.dylib)

REST 连接

使用 JDBC REST 连接,不需要依赖客户端驱动。与 JDBC 原生连接相比,仅需要:

  1. driverClass 指定为"com.taosdata.jdbc.rs.RestfulDriver";
  2. jdbcUrl 以"jdbc:TAOS-RS://"开头;
  3. 使用 6041 作为连接端口。

方案一:改为使用rest的方式连接,因为:

  • 不需要安装客户端
  • 不需要配置本地库
  • 跨平台兼容性更好
  • 部署更简单

如果你选择rest方式,只需要将 JDBC URL 改为使用 TAOS-RS 协议即可。这种方式使用 HTTP 协议进行通信,不需要本地库支持。

java 复制代码
// ... existing code ...
    public static Connection getInstance() {
        if (instance == null) {
            synchronized (TDConnect.class) {
                if (instance == null) {
                    try {
                        Class.forName("com.taosdata.jdbc.TSDBDriver");
                        
                        // 使用 REST 连接方式,不需要本地库
                        String jdbcUrl = "jdbc:TAOS-RS://192.168.81.31:6041?user=root&password=taosdata";
                        
                        Properties connProps = new Properties();
                        connProps.setProperty("charset", "UTF-8");
                        connProps.setProperty("locale", "en_US.UTF-8");
                        connProps.setProperty("timezone", "UTC-8");
                        
                        instance = DriverManager.getConnection(jdbcUrl, connProps);
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw new RuntimeException("Failed to connect to TDengine", e);
                    }
                }
            }
        }
        return instance;
    }
// ... existing code ...

方案二:

如果必须使用本地连接方式,需要:

  1. 安装 TDengine 客户端
  • Windows: 下载并安装 TDengine 客户端程序
  • Linux: 使用包管理器安装 TDengine 客户端

2、设置环境变量:

Windows:

SET PATH=%PATH%;C:\TDengine\driver

  • Linux:

export LD_LIBRARY_PATH=/usr/local/taos/driver:$LD_LIBRARY_PATH

3、或者在代码中设置库路径:

// 在连接数据库之前添加

System.setProperty("java.library.path", "C:\\TDengine\\driver"); // Windows

// 或

System.setProperty("java.library.path", "/usr/local/taos/driver"); // Linux

相关推荐
cwtlw27 分钟前
Vue学习记录07
前端·vue.js·学习
虾球xz36 分钟前
游戏引擎学习第19天
学习·游戏引擎
lcintj1 小时前
【WPF】Prism学习(八)
学习·wpf·prism
非概念1 小时前
STM32学习笔记----RTC的功能及其使用
笔记·stm32·嵌入式硬件·学习
朔北之忘 Clancy1 小时前
2022 年 9 月青少年软编等考 C 语言二级真题解析
c语言·开发语言·c++·学习·算法·青少年编程·题解
SofterICer2 小时前
SM-DP 与 SM-SR 之间的连接建立 (ES3) 笔记
网络·笔记
测绘工程师2 小时前
【高等数学&学习记录】导数概念
学习·高等数学
xnuscd2 小时前
Git常用操作学习
git·学习
cwtlw2 小时前
java学习记录10
java·开发语言·学习
THRUSTER111112 小时前
Java学习笔记--可变参数,递归
java·开发语言·笔记·学习·算法·编辑器