跳到主要内容

建立连接

TDengine TSDB 提供了丰富的应用程序开发接口。为便于用户快速开发应用,它支持多种编程语言的连接器,其中官方连接器包括 C/C++、Java、Python、Go、Node.js、C# 和 Rust;社区开发者也贡献了多个非官方连接器,例如 ADO.NET、Lua 和 PHP 连接器。这些连接器支持通过原生接口和 WebSocket 接口连接 TDengine TSDB 集群。另外,用户还可以直接调用 taosAdapter 提供的 REST API 接口访问 TDengine TSDB,进行数据写入和查询操作。

连接方式

下图为 TDengine TSDB 客户端和服务端连接方式的架构图: TDengine TSDB connection architecture

如上面的架构图所示,我们有三种方式来访问 TDengine TSDB:

  1. WebSocket 连接:通过连接器使用 taosAdapter 组件提供的 WebSocket API 建立与 taosd 的连接,这种连接方式下文中简称“WebSocket 连接”。 推荐使用 WebSocket 连接
  2. 原生连接:通过连接器使用客户端驱动程序 taosc 直接与服务端程序 taosd 建立连接,这种连接方式下文中简称“原生连接”。
  3. REST API:不使用连接器,通过 HTTP 客户端直接调用 taosAdapter 组件提供的 REST API 建立与 taosd 的连接,这种连接方式下文中简称“REST API”。

备注:客户端驱动程序 taosc 包含了 C 原生和 WebSocket 连接器,使用 C/C++ 语言开发的应用都需要依赖客户端驱动程序 taosc。

对于 WebSocket 连接和原生连接,连接器都提供了相同或相似的 API 操作数据库,只是初始化连接的方式稍有不同,用户在使用上不会感到什么差别。 各种连接方式和各语言连接器支持情况请参考 连接器功能特性

关键不同点在于:

  1. 使用 原生连接,需要保证客户端的驱动程序 taosc 和服务端的 TDengine TSDB 版本保持一致。
  2. 使用 WebSocket 连接,除 C/C++ 和 ODBC 连接器外,用户无需安装客户端驱动程序 taosc。即使依赖客户端驱动程序 taosc,也无需保证其和服务端的 TDengine TSDB 版本保持一致。
  3. 连接云服务实例,必须使用 WebSocket 连接。
  4. REST API 仅提供执行 SQL 功能,不支持参数绑定和数据订阅。

安装客户端驱动 taosc

如果选择原生连接,而且应用程序不在 TDengine TSDB 同一台服务器上运行,你需要先安装客户端驱动,否则可以跳过此一步。为避免客户端驱动和服务端不兼容,请使用一致的版本。

安装步骤

  1. 下载客户端安装包
    1. 解压缩软件包

      将软件包放置在当前用户可读写的任意目录下,然后执行下面的命令:tar -xzvf tdengine-tsdb-oss-client-3.3.8.8-linux-x64.tar.gz 其中 VERSION 需要替换为实际版本的字符串。

    2. 执行安装脚本

      解压软件包之后,会在解压目录下看到以下文件 (目录):

      • install_client.sh:安装脚本,用于应用驱动程序
      • package.tar.gz:应用驱动安装包
      • driver:TDengine 应用驱动 driver
      • examples: 各种编程语言的示例程序 (c/C#/go/JDBC/MATLAB/python/R) 运行 install_client.sh 进行安装。
    3. 配置 taos.cfg

      编辑 taos.cfg 文件(默认路径/etc/taos/taos.cfg),将 firstEP 修改为 TDengine 服务器的 End Point,例如:h1.tdengine.com:6030

    提示
    1. 如本机没有部署 TDengine 服务,仅安装了应用驱动,则 taos.cfg 中仅需配置 firstEP,无需在本机配置 FQDN
    2. 为防止与服务器端连接时出现“Unable to resolve FQDN”错误,建议确认本机的 /etc/hosts 文件已经配置了服务器正确的 FQDN 值,或配置好了 DNS 服务。

    安装验证

    以上安装和配置完成后,并确认 TDengine TSDB 服务已经正常启动运行,此时可以执行安装包里带有的 TDengine TSDB 命令行程序 taos 进行登录。

    在 Linux shell 下直接执行 taos 连接到 TDengine 服务,进入到 TDengine CLI 界面,示例如下:

    $ taos

    taos> show databases;
    name |
    =================================
    information_schema |
    performance_schema |
    db |
    Query OK, 3 rows in database (0.019154s)

    taos>

    安装连接器

    如果使用 Maven 管理项目,只需在 pom.xml 中加入以下依赖。

    <dependency>
    <groupId>com.taosdata.jdbc</groupId>
    <artifactId>taos-jdbcdriver</artifactId>
    <version>3.7.8</version>
    </dependency>

    建立连接

    在执行这一步之前,请确保有一个正在运行的,且可以访问到的 TDengine TSDB,而且服务端的 FQDN 配置正确。以下示例代码,都假设 TDengine TSDB 安装在本机,且 FQDN(默认 localhost)和 serverPort(默认 6030)都使用默认配置。

    连接参数

    连接的配置项较多,因此在建立连接之前,我们能先介绍一下各语言连接器建立连接使用的参数。

    Java 连接器建立连接的参数有 URL 和 Properties。TDengine TSDB 的 JDBC URL 规范格式为:

    jdbc:[TAOS|TAOS-WS]://[host_name]:[port]/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}|&batchfetch={batchfetch}]

    URL 和 Properties 的详细参数说明和如何使用详见 url 规范

    WebSocket 连接

    下面是各语言连接器建立 WebSocket 连接代码样例。演示了如何使用 WebSocket 连接方式连接到 TDengine TSDB 数据库,并对连接设定一些参数。整个过程主要涉及到数据库连接的建立和异常处理。

    public static void main(String[] args) throws Exception {
    // use
    // String jdbcUrl =
    // "jdbc:TAOS-WS://localhost:6041/dbName?user=root&password=taosdata";
    // if you want to connect a specified database named "dbName".
    String jdbcUrl = "jdbc:TAOS-WS://localhost:6041?user=root&password=taosdata";
    Properties connProps = new Properties();
    connProps.setProperty(TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT, "true");
    connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
    connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");

    try (Connection conn = DriverManager.getConnection(jdbcUrl, connProps)) {
    System.out.println("Connected to " + jdbcUrl + " successfully.");

    // you can use the connection for execute SQL here

    } catch (Exception ex) {
    // please refer to the JDBC specifications for detailed exceptions info
    System.out.printf("Failed to connect to %s, %sErrMessage: %s%n",
    jdbcUrl,
    ex instanceof SQLException ? "ErrCode: " + ((SQLException) ex).getErrorCode() + ", " : "",
    ex.getMessage());
    // Print stack trace for context in examples. Use logging in production.
    ex.printStackTrace();
    throw ex;
    }
    }

    查看源码

    原生连接

    下面是各语言连接器建立原生连接代码样例。演示了如何使用原生连接方式连接到 TDengine TSDB 数据库,并对连接设定一些参数。整个过程主要涉及到数据库连接的建立和异常处理。

    public static void main(String[] args) throws Exception {
    // use
    // String jdbcUrl =
    // "jdbc:TAOS://localhost:6030/dbName?user=root&password=taosdata";
    // if you want to connect a specified database named "dbName".
    String jdbcUrl = "jdbc:TAOS://localhost:6030?user=root&password=taosdata";
    Properties connProps = new Properties();
    connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
    connProps.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
    connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");

    try (Connection conn = DriverManager.getConnection(jdbcUrl, connProps)) {
    System.out.println("Connected to " + jdbcUrl + " successfully.");

    // you can use the connection for execute SQL here

    } catch (Exception ex) {
    // please refer to the JDBC specifications for detailed exceptions info
    System.out.printf("Failed to connect to %s, %sErrMessage: %s%n",
    jdbcUrl,
    ex instanceof SQLException ? "ErrCode: " + ((SQLException) ex).getErrorCode() + ", " : "",
    ex.getMessage());
    // Print stack trace for context in examples. Use logging in production.
    ex.printStackTrace();
    throw ex;
    }
    }

    查看源码

    提示

    如果建立连接失败,大部分情况下是 FQDN 或防火墙的配置不正确,详细的排查方法请看《常见问题及反馈》中的“遇到错误 Unable to establish connection, 我怎么办?”

    连接池

    有些连接器提供了连接池,或者可以与已有的连接池组件配合使用。使用连接池,应用程序可以快速地从连接池中获取可用连接,避免了每次操作时创建和销毁连接的开销。这不仅减少了资源消耗,还提高了响应速度。此外,连接池还支持对连接的管理,如最大连接数限制、连接的有效性检查,确保了连接的高效和可靠使用。我们推荐使用连接池管理连接
    下面是各语言连接器的连接池支持代码样例。

    HikariCP

    使用示例如下:

    public static void main(String[] args) throws Exception {
    HikariConfig config = new HikariConfig();
    // jdbc properties
    config.setJdbcUrl("jdbc:TAOS-WS://127.0.0.1:6041/log");
    config.setUsername("root");
    config.setPassword("taosdata");
    // connection pool configurations
    config.setMinimumIdle(10); // minimum number of idle connection
    config.setMaximumPoolSize(10); // maximum number of connection in the pool
    config.setConnectionTimeout(30000); // maximum wait milliseconds for get connection from pool
    config.setMaxLifetime(0); // maximum life time for each connection
    config.setIdleTimeout(0); // max idle time for recycle idle connection

    HikariDataSource dataSource = new HikariDataSource(config); // create datasource

    Connection connection = dataSource.getConnection(); // get connection
    Statement statement = connection.createStatement(); // get statement

    // query or insert
    // ...
    statement.close();
    connection.close(); // put back to connection pool
    dataSource.close();
    }

    查看源码

    通过 HikariDataSource.getConnection() 获取连接后,使用完成后需要调用 close() 方法,实际上它并不会关闭连接,只是放回连接池中。 更多 HikariCP 使用问题请查看官方说明

    Druid

    使用示例如下:

    public static void main(String[] args) throws Exception {
    String url = "jdbc:TAOS-WS://127.0.0.1:6041/log";

    DruidDataSource dataSource = new DruidDataSource();
    // jdbc properties
    dataSource.setDriverClassName("com.taosdata.jdbc.ws.WebSocketDriver");
    dataSource.setUrl(url);
    dataSource.setUsername("root");
    dataSource.setPassword("taosdata");
    // pool configurations
    dataSource.setInitialSize(10);
    dataSource.setMinIdle(10);
    dataSource.setMaxActive(10);
    dataSource.setMaxWait(30000);

    Connection connection = dataSource.getConnection(); // get connection
    Statement statement = connection.createStatement(); // get statement
    // query or insert
    // ...

    statement.close();
    connection.close(); // put back to connection pool
    dataSource.close();
    }

    查看源码

    更多 druid 使用问题请查看官方说明