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

news2024/11/23 1:44:44

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

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 驱动。以下是修改后的代码: 

// ... 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 协议进行通信,不需要本地库支持。

// ... 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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

037集——JoinEntities连接多段线polyline和圆弧arc(CAD—C#二次开发入门)

如图&#xff1a;最终效果 polyline连接&#xff1a; 代码如下&#xff1a; public void joinentities() {Curve pLine Z.db.SelectEntities<Curve>().First().Clone() as Curve;pLine.ChangeEntityColor(1);Curve pLine1 Z.db.SelectEntities<Curve>().First()…

【划分型 DP-约束划分个数】【hard】【阿里笔试】力扣1278. 分割回文串 III

给你一个由小写字母组成的字符串 s&#xff0c;和一个整数 k。 请你按下面的要求分割字符串&#xff1a; 首先&#xff0c;你可以将 s 中的部分字符修改为其他的小写英文字母。 接着&#xff0c;你需要把 s 分割成 k 个非空且不相交的子串&#xff0c;并且每个子串都是回文串…

如何使用 Vivado 从源码构建 Infinite-ISP FPGA 项目

如约介绍源码构建 Infinite-ISP 项目&#xff0c;其实大家等的是源码&#xff0c;所以中间过程简洁略过&#xff0c;可以直接翻到文末获取链接。 开源ISP&#xff08;Infinite-ISP&#xff09;介绍 构建工程 第一步&#xff0c;从文末或者下面链接获取源码 https://github.com/…

JDK、MAVEN与IDEA的安装与配置

1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境&#xff0c;使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载&#xff1a; MAVEN下载传送…

八股(6)——MySQL(概念相关)

八股&#xff08;6&#xff09;——MySQL&#xff08;概念相关&#xff09; 4.2 MySQLMySQL 基础关系型数据库介绍ACIDMySQL 介绍 MySQL 基础架构MySQL 存储引擎MySQL 存储引擎架构了解吗&#xff1f;MySQL 支持哪些存储引擎&#xff1f;默认使用哪个&#xff1f; MySQL索引什么…

CTF--php伪协议结合Base64绕过

Base64绕过 在ctf中&#xff0c;base64是比较常见的编码方式&#xff0c;在做题的时候发现自己对于base64的编码和解码规则不是很了解&#xff0c;并且恰好碰到了类似的题目&#xff0c;在翻阅了大佬的文章后记录一下&#xff0c;对于base64编码的学习和一个工具 base64编码是…

可视化建模与UML《活动图实验报告》

你当像鸟飞往你的山。 一、实验目的&#xff1a; 1、熟悉活动图的基本功能和使用方法。 2、掌握使用建模工具软件绘制协作图的方法 二、实验环境&#xff1a; window7 | 10 | 11 EA15 三、实验内容&#xff1a; <1>绘制学生选课系统中添加课程(Add Course)用例的活动图…

Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系

参考spring-cloud-alibaba github wiki说明&#xff1a;版本说明 下面截取说明&#xff1a; 2022.x 分支 2021.x 分支 2.2.x 分支 组件版本关系

基于Java Springboot大学校园旧物捐赠网站

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

基于Java Springboot未央商城管理系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xf…

小米路由器用外网域名访问管理界面

本文在Redmi AX3000 (RA81)设置&#xff0c;其他型号路由器的管理界面端口可能各不相同。 开始之前需要保证路由器SSH功能正常&#xff0c;如果没有SSH可以参考这里。 1. 给WAN口开放80端口 可以通过下载mixbox的firewall插件或者其他防火墙插件开放端口。 2. 把域名解析到路…

ant-design-vue中table组件多列排序

antD中table组件多列排序 使用前注意实现效果图实现的功能点及相关代码1. 默认按某几个字段排序2. 点击排序按钮可同时对多个字段进行排序3. 点击重置按钮可恢复默认排序状态。 功能实现完整的关键代码 使用前注意 先要确认你使用的antD版本是否支持多列排序&#xff0c;我这里…

Linux开发工具:Vim 与 gcc,打造高效编程的魔法双剑

文章目录 一、初识Vim模式 二、vim基本操作2.1基础操作2.2命令模式/正常模式2.2.1光标定位2.2.2复制粘贴、删除2.2.3撤销2.2.4替换字符2.2.5替换模式 2.3底行模式2.3.1退出vim和**保存文件**2.3.2定位文本字符串2.3.3命令2.3.4实现分屏2.3.5替换指定字符串 2.4补充指令2.4.1视图…

算法.图论-习题全集(Updating)

文章目录 本节设置的意义并查集篇并查集简介以及常见技巧并查集板子(洛谷)情侣牵手问题相似的字符串组岛屿数量(并查集做法)省份数量移除最多的同行或同列石头最大的人工岛找出知晓秘密的所有专家 建图及其拓扑排序篇链式前向星建图板子课程表 本节设置的意义 主要就是为了复习…

云原生之k8s服务管理

文章目录 服务管理Service服务原理ClusterIP服务 对外发布应用服务类型NodePort服务Ingress安装配置Ingress规则 Dashboard概述 认证和授权ServiceAccount用户概述创建ServiceAccount 权限管理角色与授权 服务管理 Service 服务原理 容器化带来的问题 自动调度&#xff1a;…

Atomic原子操作类详解

Atomic原子操作类介绍 在并发编程中很容易出现并发安全的问题&#xff0c;有一个很简单的例子就是多线程更新变量i1,比如多个线程执行i操作&#xff0c;就有可能获取不到正确的值&#xff0c;而这个问题&#xff0c;最常用的方法是通过Synchronized进行控制来达到线程安全的目…

随手记: vue监听路由

随手记&#xff1a;没空记详细 newVal,oldVal 可以查看到最新路由和上一条路由详细 watch: {$route: {handler(newVal,oldVal) {console.log(newVal, oldVal)if(oldVal.path /organization/serviceManagement/list) {if(this.cacheId ! newVal.query.id) {this.cacheId newV…

AndroidStudio与开发板调试时连接失败或APP闪退的解决方案,涉及SELINUX及获取Root权限

现象 用AndroidStudio打开工程代码,点击运行后,报错: 解决方案 具体原因是尝试运行 su(通常用于获取超级用户权限)时失败了,提示 “Permission denied” 通过 CONFIG_SECURITY_SELINUX 变量控制 SElinux 开启或关闭 在vim /rk3568_android_sdk/device/rockchip/rk…

深度学习之One Stage目标检测算法2

我们将对单次目标检测器&#xff08;包括SSD系列和YOLO系列等算法&#xff09;进行综述。我们将分析FPN以理解多尺度特征图如何提高准确率&#xff0c;特别是小目标的检测&#xff0c;其在单次检测器中的检测效果通常很差。然后我们将分析Focal loss和RetinaNet&#xff0c;看看…

Flutter通过 Coap发送组播

Flutter发送组播的流程 1.初始化 CoAP 客户端 需要初始化 CoAP 客户端并将其连接到组播地址和端口。您可以使用 CoAP 库提供的类来创建和配置客户端 final client CoapClient(Uri.parse(coap://224.0.1.1:5683), // 组播地址和端口 ); 2.创建 CoAP 请求 创建一个 CoAP 请…