藉助RESTful接口,TDengine的JDBC驅動可跨平臺,並且不用爲升級發愁了

隨着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 相比,僅須要:

  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吧。

相關文章
相關標籤/搜索