tdengine学习笔记实战-jdbc连接tdengine数据库
先上代码,里面有两种获取连接的方式,一个单例,一个连接池
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 configurationsdataSource.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); // 是否开启PSCachedataSource.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 原生连接相比,仅需要:
- driverClass 指定为“com.taosdata.jdbc.ws.WebSocketDriver”;
- jdbcUrl 以“jdbc:TAOS-WS://”开头;
- 使用 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 原生连接相比,仅需要:
- driverClass 指定为“com.taosdata.jdbc.rs.RestfulDriver”;
- jdbcUrl 以“jdbc:TAOS-RS://”开头;
- 使用 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
相关文章:
tdengine学习笔记实战-jdbc连接tdengine数据库
先上代码,里面有两种获取连接的方式,一个单例,一个连接池 package com.tdengine.utils;import com.alibaba.druid.pool.DruidDataSource;import java.sql.*; import java.util.Properties;public class TDConnectUtils {// 单例对象private …...
vue3项目执行npm install下载依赖报错问题排查方法
1、检查当前node与npm的版本 nodejs 和 npm 的版本是有适配的,具体可以看官网:nodejs 和 npm 的版本是有适配的 若是版本不兼容,修改node或者npm的版本即可,建议使用nvm版本管理工具,切换方便; 2、清除缓…...
【vue】项目迭代部署后 自动清除浏览器缓存
前言: vue项目打包部署上线后,因浏览器缓存问题,导致用户访问的依旧是上个迭代批次的旧资源,需要用户手动清除缓存才能更新至最新版本,影响用户体验。 解决方法: html根文件添加以下标签 <meta http-eq…...
Leetcode(滑动窗口习题思路总结,持续更新。。。)
讲解题目:长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target ,找出该数组中满足其和 ≥ target 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。示例: 输入: target 7, nums [2,3,1,2,4,3] 输出: 2 解…...
【UNIAPP】uniapp版图片压缩工具
二次封装的uniapp版本图片压缩、上传工具,支持全端(H5、小程序、APP) 新建文件:file-util.js class FileUtil {/*** [文件上传]* param {[object]} fileObj [图片地址]* param {[object]} formData [参数]* param {[str…...
PaddlePaddle 开源产业级文档印章识别PaddleX-Pipeline “seal_recognition”模型 开箱即用篇(一)
AI时代到来,各行各业都在追求细分领域垂直类深度学习模型,今天给大家介绍一个PaddlePaddle旗下,基于PaddleX Pipeline 来完成印章识别的模型“seal_recognition”。 官方地址:https://github.com/PaddlePaddle/PaddleX/blob/relea…...
Vue3 + Vite 项目引入 Typescript
文章目录 一、TypeScript简介二、TypeScript 开发环境搭建三、编译方式1. 自动编译单个文件2. 自动编译整个项目 四、配置文件1. compilerOptions基本选项严格模式相关选项(启用 strict 后自动包含这些)模块与导入相关选项 2. include 和 excludeinclude…...
微信小程序实战篇-分类页面制作
一、项目背景与目标 在微信小程序开发中,分类页面是一个常见且重要的功能模块。它能够帮助用户快速定位和浏览不同类别的商品或信息,提升用户体验和操作效率。今天,我们将深入探讨如何制作一个实用的微信小程序分类页面,先来看一下…...
第三十七章 如何清理docker 日志
如何清理docker 日志 目标 掌握docker 日志设置掌握docker日志的清理办法背景 在现代软件开发和部署环境中,Docker 容器技术因其轻量级、可移植性和高效资源利用的特点,已成为许多企业和开发团队的首选。Docker 容器在运行过程中会产生大量的日志信息,这些日志对于监控容器…...
二刷代码随想录第七天
454. 四数相加 II 先用map记录前两个数的和num1 num2的值出现了多少次再在后两个数组里找0 - (num1 num2),找到后就累加map中的次数 class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3…...
1.tree of thought (使用LangChain解决4x4数独问题)
本教程将介绍如何使用LangChain库和chatglm API来解决一个4x4的数独问题。我们将通过以下步骤实现这一目标: 初始化chatglm 的聊天模型。定义数独问题和解决方案。创建一个自定义的检查器来验证每一步的思考。使用ToTChain来运行整个思考过程。 1. 初始化chatglm4…...
网络基础(4)IP协议
经过之前的学习对传输协议的学习,对于传输协议从系统底层到应用层对于socket套接字的学习已经有了一套完整的理论。 对于网络的层状结构,现在已经学习到了应用层和传输层: 在之前的学习中,通信的双方都只考虑了双方的传输层的东西࿰…...
124. 二叉树中的最大路径和【 力扣(LeetCode) 】
文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 124. 二叉树中的最大路径和 一、题目描述 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径…...
echarts:简单实现默认显示两柱子折线,点击按钮后显示新的柱子
问: 用echarts实现:默认显示两柱子折线,点击“税率”按钮,显示税率柱子,之前的两柱子折线消失 回答: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8…...
视频里的音频怎么提取出来成单独文件?音频提取照着这些方法做
在数字时代,视频与音频的分离与重组已成为日常需求之一。无论是出于制作背景音乐、保存讲座内容,还是编辑播客素材,提取视频中的音频并将其保存为单独文件都显得尤为重要。视频里的音频怎么提取出来成单独文件?本文将详细介绍几种…...
Excel——宏教程(精简版)
一、宏的简介 1、什么是宏? Excel宏是一种自动化工具,它允许用户录制一系列操作并将其转换为VBA(Visual Basic for Applications)代码。这样,用户可以在需要时执行这些操作,以自动化Excel任务。 2、宏的优点 我们可以利用宏来…...
C++中的std::tuple和std::pair
在C标准库中,std::tuple和std::pair是两种极具实用性的数据结构,它们都具备存储多个元素的功能,但各自有其独特的适用环境和特性。本文旨在深入探讨这两者之间的区别,并阐述在不同应用场景下应如何合理选择使用。 一、基本概念 s…...
引力搜索算法
引力搜索算法过程,包括了初始化、适应度评估、质量计算、加速度计算、更新速度和位置的一些步骤。 import numpy as np import random as rd from math import exp, sqrt import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotli…...
【时间之外】IT人求职和创业应知【35】-RTE三进宫
目录 新闻一:京东工业发布11.11战报,多项倍增数据体现工业经济信心提升 新闻二:阿里云100万核算力支撑天猫双11,弹性计算规模刷新纪录 新闻三:声网CEO赵斌:RTE将成为生成式AI时代AI Infra的关键部分 认知…...
Linux的目录结构
/ ├── bin # Binary - 存放用户可以直接使用的基本二进制可执行文件 ├── sbin # System Binaries - 存放系统管理员专用的二进制可执行文件 ├── usr # Unix System Resources - 存放用户使用的软件和库文件 │ ├── bin # Binary - 用户级应用程序…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
