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 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 原生连接相比,仅需要:
- 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