借助RESTful接口,TDengine的JDBC驱动可跨平台,而且不用为升级发愁了

news/2024/5/18 22:59:24 标签: java, jdbc, restful, 数据库, tdengine

随着TDengine-2.0.14.0版本的发布,我们在这个版本中为JDBC Connector添加了一种新的实现:JDBC-RESTful。它内部使用RESTful接口, 而不是taosc连接TDengine服务器,这样能够跨平台,不仅在Linux, Windows, 在Mac上都能开发TDengine应用了。特别的是,你也不用担心升级TDengine需要同步升级客户端了。

01 使用JDBC-RESTful的好处

1.实现TDengine跨平台应用开发

之前,由于TDengine的JDBC驱动依赖本地动态库(linux上为libtaos.so,windows上为taos.dll),开发者需要先在本地安装客户端。否则,应用程序会报错:

no taos in java.library.path

而TDengine目前只支持Linux和Windows操作系统的客户端安装包,并且源码也无法在其他操作系统上编译。这对于使用macOS的用户来说,需要先在macOS上写好代码,再将代码部署到Linux服务器上调试,或使用像VS code等可以支持远程代码开发的IDE工具,这些都增加了使用TDengine的开发成本。这也是我们开发JDBC-RESTful的原因。使用JDBC-RESTful后,不需要安装客户端!不需要使用远程代码开发的IDE工具!在MacBook上也可以做开发啦。

2.无需安装和升级TDengine客户端

使用JDBC-RESTful后,不需要安装TDengine的客户端,也不需要跟随服务端升级客户端。对企业应用开发来说,由专门的运维人员来负责TDengine的维护和升级,服务端升级后,应用不需要升级客户端。

3.可忽略不计的迁移和使用成本

使用JDBC-RESTful,只需要修改一下driverClass和URL即可。这对于大部分的Java应用来说,只是修改一下配置文件即可。

下面,详细描述一下JDBC-RESTful的相关概念和使用方法。

02 JDBC-RESTful的实现原理

目前,JDBC Connector的实现包括2种形式:JDBC-JNI 和 JDBC-RESTful。

  • JDBC-JNI :使用JNI调用客户端 libtaos.so(或 taos.dll )的本地方法,通过socket与taosd通信。

  • JDBC-RESTful :在内部封装了 TDengine的RESTful 接口,将SQL封装成HTTP请求发送给server端的taosd示例。

上图显示了 3 种 Java 应用使用连接器访问 TDengine 的方式:

  • JDBC-JNI:Java 应用在物理节点1(pnode1)上使用 JDBC-JNI 的 API ,直接调用客户端 API(libtaos.so 或 taos.dll)将写入和查询请求发送到位于物理节点2(pnode2)上的 taosd 实例。

  • RESTful:应用将 SQL 发送给位于物理节点2(pnode2)上的 RESTful 连接器,再调用客户端 API(libtaos.so)。

  • JDBC-RESTful:Java 应用通过 JDBC-RESTful 的 API ,将 SQL 封装成一个 RESTful 请求,发送给物理节点2的 RESTful 连接器。

03 JDBC-RESTful的使用示例

使用 JDBC-RESTful 接口,与之前的 JDBC-JNI 相比,仅需要:

  1. driverClass 指定为“com.taosdata.jdbc.rs.RestfulDriver”;

  2. jdbcUrl 以“jdbc:TAOS-RS://”开头;

  3. 使用 6041 作为连接端口。

下面,展示一个完整的使用JDBC-RESTful的示例。

1.在pom.xml中引入taos-jdbcdriver依赖

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

2.示例代码

public class JdbcRestfulDemo {
    private static final String host = "taos-server";
    public static void main(String[] args) {
        try {
            // load JDBC-restful driver
            Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
            // use port 6041 in url when use JDBC-restful
            String url = "jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata";
            Properties properties = new Properties();
            properties.setProperty("charset", "UTF-8");
            properties.setProperty("locale", "en_US.UTF-8");
            properties.setProperty("timezone", "UTC-8");
            Connection conn = DriverManager.getConnection(url, properties);
            Statement stmt = conn.createStatement();
            stmt.execute("create database if not exists restful_test");
            stmt.execute("use restful_test");
            stmt.execute("create table restful_test.weather(ts timestamp, temperature float) tags(location nchar(64))");
            stmt.executeUpdate("insert into t1 using restful_test.weather tags('北京') values(now, 18.2)");
            ResultSet rs = stmt.executeQuery("select * from restful_test.weather");
            ResultSetMetaData meta = rs.getMetaData();
            while (rs.next()) {
                for (int i = 1; i <= meta.getColumnCount(); i++) {
                    System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "t");
                }
                System.out.println();
            }
            rs.close();
            
            stmt.close();
            conn.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

04 JDBC-RESTful的性能

从上面JDBC-RESTful的实现原理看到,JDBC-RESTful方式相当于对libtaos.so的C方法进行了两次封装,第一次是RESTful对libtaos.so中的方法进行了封装,第二次是taos-jdbcdriver对RESTful接口进行了封装。并且,使用JDBC-RESTful,意味着将数据库的访问请求全部发送给了server,server端需要做所有由client负责的SQL解析、结果集聚合等工作。那么使用JDBC-RESTful接口是否会造成性能下降呢?我们内部对JDBC-RESTful接口进行了性能测试。

测试环境:CPU:mac pro(6核,Intel Core i7),内存:16 GB ,硬盘:SSD(500GB)

测试记录:

测试结论:

  1. 在每条SQL中插入的记录数少的情况下,JDBC-RESTful的写入性能是JDBC-JNI的50%左右;

  2. 在每条SQL中插入的记录数多的情况下,JDBC-RESTful的写入性能是JDBC-JNI性能的90%左右;

  3. JDBC-RESTful与JDBC-JNI在查询性能上,没有明显差异。

注意:以上测试的写入性能和查询性能与具体测试环境和配置有关,在不同的测试环境在性能差异上略有不同。

总结

这里,给使用JDBC-RESTful的Java开发者一些使用建议:

  1. JDBC-RESTful提供了跨平台开发的特性,可以在开发环境中使用。

  2. JDBC-JNI相比JDBC-RESTful有一定的性能优势,如果在生产环境中希望最大化发挥TDengine的性能,可以使用JDBC-JNI的方式。

  3. JDBC-RESTful到JDBC-JNI的切换十分简单,一般只需要修改配置文件即可。

点击这里,试一试JDBC-RESTful吧。


http://www.niftyadmin.cn/n/983495.html

相关文章

Map 3D 2013 新功能和新API WebCast视频下载

7月23日的Map 3D 2013新功能和新API网络讲座视频现在已经可以下载了&#xff0c;感兴趣的童鞋们请到下面链接下载&#xff1a; http://download.autodesk.com/media/adn/SC_Map3D2013Webcast.zip

postgresql 存储过程简单使用

转载出处&#xff1a;http://blog.csdn.net/rachel_luo/article/ 一、存储过程结构&#xff1a; Create or replace function 过程名(参数名 参数类型,…..) returns 返回值类型 as $body$ //声明变量 Declare 变量名变量类型&#xff1b; 如&#xff1a; flag Boolean; 变量赋…

新春将至,“牛”气冲天

笙歌间错华筵启。喜新春新岁。菜传纤手青丝细。和气入、东风里。幡儿胜儿都姑媂。戴得更忔戏。愿新春以后&#xff0c;吉吉利利&#xff0c;百事都如意。——宋赵长卿《探春令》新春将至&#xff0c;涛思数据祝大家&#xff1a;岁岁常欢愉&#xff0c;年年皆胜意&#xff0c;多…

社区贡献者+1,大四毕业生开源跨平台TDengine图形化管理工具

我们团队做智能电表项目时&#xff0c;选用了基于 TDengine 的数据存储方案&#xff0c;开发过程中发现&#xff0c;如果没有图形化管理工具&#xff0c;查看数据不太方便&#xff0c;于是内部开发了 TDengineGUI&#xff0c;用来数据管理。追随 TDengine 团队彻底开源的理念&a…

迭代标签详解

varStatus是<c:forEach>jstl循环标签的一个属性&#xff0c;就拿varStatus“status”来说&#xff0c;事实上定义了一个名为status的对象作为varStatus的绑定值。该绑定值也就是status封装了当前遍历的状态&#xff0c;比如&#xff0c;可以从该对象上查看是遍历到了第几…

Windows 平台安装配置Golang语言环境

环境介绍&#xff1a; OS&#xff1a; Windows 7 sp1 Arch&#xff1a;x86_64 Golang Ver&#xff1a;Go 1.4.2 amd64 1、下载Golang语言安装包&#xff1a; Go 由Google于2009年开发释出&#xff0c;一种开放源代码的语言。github&#xff1a; golang/go。可以直接在这上…

JSP中出现According to TLD or attribute directive i...

2019独角兽企业重金招聘Python工程师标准>>> 可能是因为使用了JSP2.0版本, 同时又没有使用JSTL core库的备用版本(RT库), 以下有两种处理方法: 1. 修改web.xml. <web-app xmlns"http://java.sun.com/xml/ns/j2ee" xmlns:xsi"http://www.w3.org/20…

60秒定位问题,十倍程序员的Debug日常

作者&#xff1a;陶建辉 这是我在 2020 年 5 月写的一篇内部博客&#xff0c;当时是希望研发和技术支持同学能够帮助用户快速定位 Bug&#xff0c;解决问题。2020 年 12 月我又迭代了一版&#xff0c;并还针对此进行了内部的培训。这段时间我也一直在关注微信群中的提问&#…