借助RESTful接口,TDengine的JDBC驅動可跨平台,而且不用為升級發愁了


隨着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的切換十分簡單,一般只需要修改配置文件即可。

點擊這里,開始嘗試TDengine JDBC-RESTful吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM