随着TDengine-2.0.14.0版本的发布,咱们在这个版本中为JDBC Connector添加了一种新的实现:JDBC-RESTful。它内部使用RESTful接口, 而不是taosc链接TDengine服务器,这样可以跨平台,不只在Linux, Windows, 在Mac上都能开发TDengine应用了。特别的是,你也不用担忧升级TDengine须要同步升级客户端了。java
01 使用JDBC-RESTful的好处
1.实现TDengine跨平台应用开发node
以前,因为TDengine的JDBC驱动依赖本地动态库(linux上为libtaos.so,windows上为taos.dll),开发者须要先在本地安装客户端。不然,应用程序会报错:linux
no taos in java.library.path
而TDengine目前只支持Linux和Windows操做系统的客户端安装包,而且源码也没法在其余操做系统上编译。这对于使用macOS的用户来讲,须要先在macOS上写好代码,再将代码部署到Linux服务器上调试,或使用像VS code等能够支持远程代码开发的IDE工具,这些都增长了使用TDengine的开发成本。这也是咱们开发JDBC-RESTful的缘由。使用JDBC-RESTful后,不须要安装客户端!不须要使用远程代码开发的IDE工具!在MacBook上也能够作开发啦。数据库
2.无需安装和升级TDengine客户端windows
使用JDBC-RESTful后,不须要安装TDengine的客户端,也不须要跟随服务端升级客户端。对企业应用开发来讲,由专门的运维人员来负责TDengine的维护和升级,服务端升级后,应用不须要升级客户端。服务器
3.可忽略不计的迁移和使用成本restful
使用JDBC-RESTful,只须要修改一下driverClass和URL便可。这对于大部分的Java应用来讲,只是修改一下配置文件便可。运维
下面,详细描述一下JDBC-RESTful的相关概念和使用方法。socket
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 相比,仅须要:
-
driverClass 指定为“com.taosdata.jdbc.rs.RestfulDriver”;
-
jdbcUrl 以“jdbc:TAOS-RS://”开头;
-
使用 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)
测试记录:
测试结论:
-
在每条SQL中插入的记录数少的状况下,JDBC-RESTful的写入性能是JDBC-JNI的50%左右;
-
在每条SQL中插入的记录数多的状况下,JDBC-RESTful的写入性能是JDBC-JNI性能的90%左右;
-
JDBC-RESTful与JDBC-JNI在查询性能上,没有明显差别。
注意:以上测试的写入性能和查询性能与具体测试环境和配置有关,在不一样的测试环境在性能差别上略有不一样。
总结
这里,给使用JDBC-RESTful的Java开发者一些使用建议:
-
JDBC-RESTful提供了跨平台开发的特性,能够在开发环境中使用。
-
JDBC-JNI相比JDBC-RESTful有必定的性能优点,若是在生产环境中但愿最大化发挥TDengine的性能,可使用JDBC-JNI的方式。
-
JDBC-RESTful到JDBC-JNI的切换十分简单,通常只须要修改配置文件便可。
点击这里,试一试JDBC-RESTful吧。