无码人妻精品一区二区三18禁,影音先锋男人AV橹橹色,污污污污污污www网站免费,日韩成人av无码一区二区三区,欧美性受xxxx狂喷水

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

Zhiyu Yang

2021-01-22 / ,

隨著 TDengine 2.0.14.0 版本的發布,我們在這個版本中為 JDBC Connector 添加了一種新的實現:JDBC-RESTful,一種基于 RESTful 接口的 JDBC 實現,可以通過 taos-jdbcdriver 2.0.18 來使用這個新特性。

!!!重要的事情先說,使用 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 工具!在 mac 上也可以做開發啦。
  2. 使用 JDBC-RESTful 后,不再需要升級客戶端。使用 JDBC-RESTful 后,不需要安裝 TDengine 的客戶端。對企業應用開發來說,由專門的運維人員來負責 TDengine 的維護和升級,server 端升級后,應用不需要升級 client。
  3. 遷移到 JDBC-RESTful 需要的改動很小。使用 JDBC-RESTful,只需要修改一下 driverClass 和 URL 即可。這對于大部分的 Java 應用來說,只是修改一下配置文件即可。

下面,詳細描述一下 JDBC-RESTful 的相關概念和使用方法。

一、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 的方式

上圖顯示了 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 連接器。

二、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();
        }
    }
}

三、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)

測試記錄:

對 JDBC-RESTful 接口測試的記錄

測試結論:

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