<!--

* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
  *
* http://www.apache.org/licenses/LICENSE-2.0
  *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
  -->

# Java Native API

In the native API of IoTDB, the `Session` is the core interface for interacting with the database. It integrates a rich set of methods that support data writing, querying, and metadata operations. By instantiating a `Session`, you can establish a connection to the IoTDB server and perform various database operations within the environment constructed by this connection. The `Session` is not thread-safe and should not be called simultaneously by multiple threads.

`SessionPool` is a connection pool for `Session`, and it is recommended to use `SessionPool` for programming. In scenarios with multi-threaded concurrency, `SessionPool` can manage and allocate connection resources effectively, thereby improving system performance and resource utilization efficiency.

## 1. Overview of Steps

1. Create a Connection Pool Instance: Initialize a SessionPool object to manage multiple Session instances.
2. Perform Operations: Directly obtain a Session instance from the SessionPool and execute database operations, without the need to open and close connections each time.
3. Close Connection Pool Resources: When database operations are no longer needed, close the SessionPool to release all related resources.


## 2. Detailed Steps

This section provides an overview of the core development process and does not demonstrate all parameters and interfaces. For a complete list of functionalities and parameters, please refer to:[Java Native API](./Programming-Java-Native-API_timecho#_3-native-interface-description) or check the: [Source Code](https://github.com/apache/iotdb/tree/rc/2.0.1/example/session/src/main/java/org/apache/iotdb)

### 2.1 Create a Maven Project

Create a Maven project and add the following dependencies to the pom.xml file (JDK >= 1.8, Maven >= 3.6):

```xml
<dependencies>
    <dependency>
      <groupId>org.apache.iotdb</groupId>
      <artifactId>iotdb-session</artifactId>
      <!-- The version number is the same as the database version number -->
      <version>${project.version}</version>
    </dependency>
</dependencies>
```

### 2.2 Creating a Connection Pool Instance


```java
import java.util.ArrayList;
import java.util.List;
import org.apache.iotdb.session.pool.SessionPool;

public class IoTDBSessionPoolExample {
    private static SessionPool sessionPool;

    public static void main(String[] args) {
        // Using nodeUrls ensures that when one node goes down, other nodes are automatically connected to retry
        List<String> nodeUrls = new ArrayList<>();
        nodeUrls.add("127.0.0.1:6667");
        nodeUrls.add("127.0.0.1:6668");
        sessionPool =
                new SessionPool.Builder()
                        .nodeUrls(nodeUrls)
                        .user("root")
                        .password("TimechoDB@2021") //Before V2.0.6.x the default password is root "
                        .maxSize(3)
                        .build();
    }
}
```

### 2.3 Performing Database Operations

#### 2.3.1 Data Insertion

In industrial scenarios, data insertion can be categorized into the following types: inserting multiple rows of data, and inserting multiple rows of data for a single device. Below, we introduce the insertion interfaces for different scenarios.

##### Multi-Row Data Insertion Interface

Interface Description: Supports inserting multiple rows of data at once, where each row corresponds to multiple measurement values for a device at a specific timestamp.


Interface List:

| **Interface Name**                                           | **Function Description**                                     |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| `insertRecords(List<String> deviceIds, List<Long> times, List<List<String>> measurementsList, List<List<TSDataType>> typesList, List<List<Object>> valuesList)` | Inserts multiple rows of data, suitable for scenarios where measurements are independently collected. |

Code Example:

```java
import java.util.ArrayList;
import java.util.List;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.apache.iotdb.session.pool.SessionPool;
import org.apache.tsfile.enums.TSDataType;

public class SessionPoolExample {
 private static SessionPool sessionPool;
     public static void main(String[] args) throws IoTDBConnectionException, StatementExecutionException {
          // 1. init SessionPool
        constructSessionPool();
          // 2. execute insert data
        insertRecordsExample();
          // 3. close SessionPool
        closeSessionPool();
  }

  private static void constructSessionPool() {
        // Using nodeUrls ensures that when one node goes down, other nodes are automatically connected to retry
        List<String> nodeUrls = new ArrayList<>();
        nodeUrls.add("127.0.0.1:6667");
        nodeUrls.add("127.0.0.1:6668");
        sessionPool =
                new SessionPool.Builder()
                        .nodeUrls(nodeUrls)
                        .user("root")
                        .password("TimechoDB@2021") //Before V2.0.6.x the default password is root 
                        .maxSize(3)
                        .build();
    }

    public static void insertRecordsExample() throws IoTDBConnectionException, StatementExecutionException {
        String deviceId = "root.sg1.d1";
        List<String> measurements = new ArrayList<>();
        measurements.add("s1");
        measurements.add("s2");
        measurements.add("s3");
        List<String> deviceIds = new ArrayList<>();
        List<List<String>> measurementsList = new ArrayList<>();
        List<List<Object>> valuesList = new ArrayList<>();
        List<Long> timestamps = new ArrayList<>();
        List<List<TSDataType>> typesList = new ArrayList<>();

        for (long time = 0; time < 500; time++) {
            List<Object> values = new ArrayList<>();
            List<TSDataType> types = new ArrayList<>();
            values.add(1L);
            values.add(2L);
            values.add(3L);
            types.add(TSDataType.INT64);
            types.add(TSDataType.INT64);
            types.add(TSDataType.INT64);

            deviceIds.add(deviceId);
            measurementsList.add(measurements);
            valuesList.add(values);
            typesList.add(types);
            timestamps.add(time);
            if (time != 0 && time % 100 == 0) {
                try {
                    sessionPool.insertRecords(deviceIds, timestamps, measurementsList, typesList, valuesList);
                } catch (IoTDBConnectionException | StatementExecutionException e) {
                    // solve exception
                }
                deviceIds.clear();
                measurementsList.clear();
                valuesList.clear();
                typesList.clear();
                timestamps.clear();
            }
        }
        try {
            sessionPool.insertRecords(deviceIds, timestamps, measurementsList, typesList, valuesList);
        } catch (IoTDBConnectionException | StatementExecutionException e) {
            // solve exception
        }
    }
    
      public static void closeSessionPool(){
        sessionPool.close();
    }
}
```

##### Single-Device Multi-Row Data Insertion Interface

Interface Description: Supports inserting multiple rows of data for a single device at once, where each row corresponds to multiple measurement values for a specific timestamp.

Interface List：

| **Interface Name**            | **Function Description**                                     |
| ----------------------------- | ------------------------------------------------------------ |
| `insertTablet(Tablet tablet)` | Inserts multiple rows of data for a single device, suitable for scenarios where measurements are independently collected. |

Code Example:

```java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.apache.iotdb.session.pool.SessionPool;
import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.write.record.Tablet;
import org.apache.tsfile.write.schema.IMeasurementSchema;
import org.apache.tsfile.write.schema.MeasurementSchema;

public class SessionPoolExample {
    private static SessionPool sessionPool;
    public static void main(String[] args) throws IoTDBConnectionException, StatementExecutionException {
        // 1. init SessionPool
        constructSessionPool();
        // 2. execute insert data
        insertTabletExample();
        // 3. close SessionPool
        closeSessionPool();
    }

    private static void constructSessionPool() {
        // Using nodeUrls ensures that when one node goes down, other nodes are automatically connected to retry
        List<String> nodeUrls = new ArrayList<>();
        nodeUrls.add("127.0.0.1:6667");
        //nodeUrls.add("127.0.0.1:6668");
        sessionPool =
                new SessionPool.Builder()
                        .nodeUrls(nodeUrls)
                        .user("root")
                        .password("TimechoDB@2021") //Before V2.0.6.x the default password is root 
                        .maxSize(3)
                        .build();
    }

    private static void insertTabletExample() throws IoTDBConnectionException, StatementExecutionException {
        /*
         * A Tablet example:
         *      device1
         * time s1, s2, s3
         * 1,   1,  1,  1
         * 2,   2,  2,  2
         * 3,   3,  3,  3
         */
        // The schema of measurements of one device
        // only measurementId and data type in MeasurementSchema take effects in Tablet
        List<IMeasurementSchema> schemaList = new ArrayList<>();
        schemaList.add(new MeasurementSchema("s1", TSDataType.INT64));
        schemaList.add(new MeasurementSchema("s2", TSDataType.INT64));
        schemaList.add(new MeasurementSchema("s3", TSDataType.INT64));

        Tablet tablet = new Tablet("root.sg.d1",schemaList,100);

        // Method 1 to add tablet data
        long timestamp = System.currentTimeMillis();

        Random random = new Random();
        for (long row = 0; row < 100; row++) {
            int rowIndex = tablet.getRowSize();
            tablet.addTimestamp(rowIndex, timestamp);
            for (int s = 0; s < 3; s++) {
                long value = random.nextLong();
                tablet.addValue(schemaList.get(s).getMeasurementName(), rowIndex, value);
            }
            if (tablet.getRowSize() == tablet.getMaxRowNumber()) {
                sessionPool.insertTablet(tablet);
                tablet.reset();
            }
            timestamp++;
        }
        if (tablet.getRowSize() != 0) {
            sessionPool.insertTablet(tablet);
            tablet.reset();
        }
    }

    public static void closeSessionPool(){
        sessionPool.close();
    }
}
```

#### 2.3.2 SQL Operations

SQL operations are divided into two categories: queries and non-queries. The corresponding interfaces are executeQuery and executeNonQuery. The difference between them is that the former executes specific query statements and returns a result set, while the latter performs insert, delete, and update operations and does not return a result set.

```java
import java.util.ArrayList;
import java.util.List;
import org.apache.iotdb.isession.pool.SessionDataSetWrapper;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.apache.iotdb.session.pool.SessionPool;

public class SessionPoolExample {
  private static SessionPool sessionPool;
  public static void main(String[] args) throws IoTDBConnectionException, StatementExecutionException {
        // 1. init SessionPool
        constructSessionPool(); 
        // 2. executes a non-query SQL statement, such as a DDL or DML command.
        executeQueryExample();
        // 3. executes a query SQL statement and returns the result set.
        executeNonQueryExample();
        // 4. close SessionPool
        closeSessionPool();
    }

    private static void executeNonQueryExample() throws IoTDBConnectionException, StatementExecutionException {
        // 1. create a nonAligned time series
        sessionPool.executeNonQueryStatement("create timeseries root.test.d1.s1 with dataType = int32");
        // 2. set ttl
        sessionPool.executeNonQueryStatement("set TTL to root.test.** 10000");
        // 3. delete time series
        sessionPool.executeNonQueryStatement("delete timeseries root.test.d1.s1");
    }
    
    private static void executeQueryExample() throws IoTDBConnectionException, StatementExecutionException {
        // 1. execute normal query
        try(SessionDataSetWrapper wrapper = sessionPool.executeQueryStatement("select s1 from root.sg1.d1 limit 10")) {
            // get DataIterator like JDBC
            DataIterator dataIterator = wrapper.iterator();
            System.out.println(wrapper.getColumnNames());
            System.out.println(wrapper.getColumnTypes());
            while (dataIterator.next()) {
                StringBuilder builder = new StringBuilder();
                for (String columnName : wrapper.getColumnNames()) {
                    builder.append(dataIterator.getString(columnName) + " ");
                }
                System.out.println(builder);
            }
        }
        // 2. execute aggregate query
        try(SessionDataSetWrapper wrapper = sessionPool.executeQueryStatement("select count(s1) from root.sg1.d1 group by ([0, 40), 5ms) ")) {
            // get DataIterator like JDBC
            DataIterator dataIterator = wrapper.iterator();
            System.out.println(wrapper.getColumnNames());
            System.out.println(wrapper.getColumnTypes());
            while (dataIterator.next()) {
                StringBuilder builder = new StringBuilder();
                for (String columnName : wrapper.getColumnNames()) {
                    builder.append(dataIterator.getString(columnName) + " ");
                }
                System.out.println(builder);
            }
        }
    }

    private static void constructSessionPool() {
    // Using nodeUrls ensures that when one node goes down, other nodes are automatically connected to retry
    List<String> nodeUrls = new ArrayList<>();
    nodeUrls.add("127.0.0.1:6667");
    nodeUrls.add("127.0.0.1:6668");
    sessionPool =
            new SessionPool.Builder()
                    .nodeUrls(nodeUrls)
                    .user("root")
                    .password("TimechoDB@2021") //Before V2.0.6.x the default password is root 
                    .maxSize(3)
                    .build();
    }

    public static void closeSessionPool(){
        sessionPool.close();
    }
}
```

### 3. Native Interface Description

#### 3.1 Parameter List

The Session class has the following fields, which can be set through the constructor or the Session.Builder method:

| **Field Name**                   | **Type**                            | **Description**                                              |
| -------------------------------- | ----------------------------------- | ------------------------------------------------------------ |
| `nodeUrls`                       | `List<String>`                      | List of URLs for database nodes, supporting multiple node connections |
| `username`                       | `String`                            | Username                                                     |
| `password`                       | `String`                            | Password                                                     |
| `fetchSize`                      | `int`                               | Default batch size for query results                         |
| `useSSL`                         | `boolean`                           | Whether to enable SSL                                        |
| `trustStore`                     | `String`                            | Path to the trust store                                      |
| `trustStorePwd`                  | `String`                            | Password for the trust store                                 |
| `queryTimeoutInMs`               | `long`                              | Query timeout in milliseconds                                |
| `enableRPCCompression`           | `boolean`                           | Whether to enable RPC compression                            |
| `connectionTimeoutInMs`          | `int`                               | Connection timeout in milliseconds                           |
| `zoneId`                         | `ZoneId`                            | Time zone setting for the session                            |
| `thriftDefaultBufferSize`        | `int`                               | Default buffer size for Thrift Thrift                        |
| `thriftMaxFrameSize`             | `int`                               | Maximum frame size for Thrift Thrift                         |
| `defaultEndPoint`                | `TEndPoint`                         | Default database endpoint information                        |
| `defaultSessionConnection`       | `SessionConnection`                 | Default session connection object                            |
| `isClosed`                       | `boolean`                           | Whether the current session is closed                        |
| `enableRedirection`              | `boolean`                           | Whether to enable redirection                                |
| `enableRecordsAutoConvertTablet` | `boolean`                           | Whether to enable the function of recording the automatic transfer to Tablet |
| `deviceIdToEndpoint`             | `Map<String, TEndPoint>`            | Mapping of device IDs to database endpoints                  |
| `endPointToSessionConnection`    | `Map<TEndPoint, SessionConnection>` | Mapping of database endpoints to session connections         |
| `executorService`                | `ScheduledExecutorService`          | Thread pool for periodically updating the node list          |
| `availableNodes`                 | `INodeSupplier`                     | Supplier of available nodes                                  |
| `enableQueryRedirection`         | `boolean`                           | Whether to enable query redirection                          |
| `version`                        | `Version`                           | Client version number, used for compatibility judgment with the server |
| `enableAutoFetch`                | `boolean`                           | Whether to enable automatic fetching                         |
| `maxRetryCount`                  | `int`                               | Maximum number of retries                                    |
| `retryIntervalInMs`              | `long`                              | Retry interval in milliseconds                               |



#### 3.2 Interface list

##### 3.2.1 Metadata Management

| **Method Name**                                              | **Function Description**                       | **Parameter Explanation**                                    |
| ------------------------------------------------------------ | ---------------------------------------------- | ------------------------------------------------------------ |
| `createDatabase(String database)`                            | Create a database                              | `database`: The name of the database to be created           |
| `deleteDatabase(String database)`                            | Delete a specified database                    | `database`: The name of the database to be deleted           |
| `deleteDatabases(List<String> databases)`                    | Batch delete databases                         | `databases`: A list of database names to be deleted          |
| `createTimeseries(String path, TSDataType dataType, TSEncoding encoding, CompressionType compressor)` | Create a single time series                    | `path`: The path of the time series，`dataType`: The data type，`encoding`: The encoding type，`compressor`: The compression type |
| `createAlignedTimeseries(...)`                               | Create aligned time series                     | Device ID, list of measurement points, list of data types, list of encodings, list of compression types |
| `createMultiTimeseries(...)`                                 | Batch create time series                       | Multiple paths, data types, encodings, compression types, properties, tags, aliases, etc. |
| `deleteTimeseries(String path)`                              | Delete a time series                           | `path`: The path of the time series to be deleted            |
| `deleteTimeseries(List<String> paths)`                       | Batch delete time series                       | `paths`:  A list of time series paths to be deleted          |
| `setSchemaTemplate(String templateName, String prefixPath)`  | Set a schema template                          | `templateName`: The name of template，`prefixPath`: The path where the template is applied |
| `createSchemaTemplate(Template template)`                    | Create a schema template                       | `template`: The template object                              |
| `dropSchemaTemplate(String templateName)`                    | Delete a schema template                       | `templateName`: The name of template to be deleted           |
| `addAlignedMeasurementsInTemplate(...)`                      | Add aligned measurements to a template         | Template name, list of measurement paths, data type, encoding type, compression type |
| `addUnalignedMeasurementsInTemplate(...)`                    | Add unaligned measurements to a template       | Same as above                                                |
| `deleteNodeInTemplate(String templateName, String path)`     | Delete a node in a template                    | `templateName`: The name of template，`path`: The path to be deleted |
| `countMeasurementsInTemplate(String name)`                   | Count the number of measurements in a template | `name`: The name of template                                 |
| `isMeasurementInTemplate(String templateName, String path)`  | Check if a measurement exists in a template    | `templateName`: The name of template，`path`: The path of the measurement |
| `isPathExistInTemplate(String templateName, String path)`    | Check if a path exists in a template           | same as above                                                |
| `showMeasurementsInTemplate(String templateName)`            | Show measurements in a template                | `templateName`: The name of template                         |
| `showMeasurementsInTemplate(String templateName, String pattern)` | Show measurements in a template by pattern     | `templateName`: The name of template，`pattern`: The matching pattern |
| `showAllTemplates()`                                         | Show all templates                             | No parameters                                                |
| `showPathsTemplateSetOn(String templateName)`                | Show paths where a template is set             | `templateName`: The name of the template                     |
| `showPathsTemplateUsingOn(String templateName)`              | Show actual paths using a template             | Same as above上                                              |
| `unsetSchemaTemplate(String prefixPath, String templateName)` | Unset the template setting for a path          | `prefixPath`: The path，`templateName`: The name of template |


##### 3.2.2 Data Insertion

| **Method Name**                                              | **Function Description**                                     | **Parameter Explanation**                                    |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| `insertRecord(String deviceId, long time, List<String> measurements, List<TSDataType> types, Object... values)` | Insert a single record                                       | `deviceId`: Device ID，`time`: Timestamp，`measurements`:  List of measurement points，`types`: List of data types，`values`: List of values |
| `insertRecord(String deviceId, long time, List<String> measurements, List<String> values)` | Insert a single record                                       | `deviceId`: Device ID，`time`: Timestamp，`measurements`: List of measurement points，`values`: List of values |
| `insertRecords(List<String> deviceIds, List<Long> times, List<List<String>> measurementsList, List<List<Object>> valuesList)` | Insert multiple records                                      | `deviceIds`: List of device IDs，`times`:  List of timestamps，`measurementsList`:  List of timestamps，`valuesList`: List of lists of values |
| `insertRecords(List<String> deviceIds, List<Long> times, List<List<String>> measurementsList, List<List<TSDataType>> typesList, List<List<Object>> valuesList)` | Insert multiple records                                      | Same as above，plus `typesList`: List of lists of data types |
| `insertRecordsOfOneDevice(String deviceId, List<Long> times, List<List<String>> measurementsList, List<List<TSDataType>> typesList, List<List<Object>> valuesList)` | Insert multiple records for a single device                  | `deviceId`:  Device ID，`times`: List of timestamps，`measurementsList`: List of lists of measurement points，`typesList`: List of lists of types，`valuesList`: List of lists of values |
| `insertRecordsOfOneDevice(String deviceId, List<Long> times, List<List<String>> measurementsList, List<List<TSDataType>> typesList, List<List<Object>> valuesList, boolean haveSorted)` | Insert sorted multiple records for a single device           | Same as above, plus `haveSorted`: Whether the data is already sorted |
| `insertStringRecordsOfOneDevice(String deviceId, List<Long> times, List<List<String>> measurementsList, List<List<String>> valuesList)` | Insert string-formatted records for a single device          | `deviceId`: Device ID，`times`: List of timestamps，`measurementsList`: List of lists of measurement points，`valuesList`:  List of lists of values |
| `insertStringRecordsOfOneDevice(String deviceId, List<Long> times, List<List<String>> measurementsList, List<List<String>> valuesList, boolean haveSorted)` | Insert sorted string-formatted records for a single device   | Same as above, plus  `haveSorted`: Whether the data is already sorted序 |
| `insertAlignedRecord(String deviceId, long time, List<String> measurements, List<TSDataType> types, List<Object> values)` | Insert a single aligned record                               | `deviceId`: Device ID，`time`: Timestamp，`measurements`: List of measurement points，`types`: List of types，`values`: List of values |
| `insertAlignedRecord(String deviceId, long time, List<String> measurements, List<String> values)` | Insert a single string-formatted aligned record              | `deviceId`: Device ID`time`: Timestamp,`measurements`: List of measurement points，`values`: List of values |
| `insertAlignedRecords(List<String> deviceIds, List<Long> times, List<List<String>> measurementsList, List<List<Object>> valuesList)` | Insert multiple aligned records                              | `deviceIds`: List of device IDs，`times`: List of timestamps，`measurementsList`:  List of lists of measurement points，`valuesList`: List of lists of values |
| `insertAlignedRecords(List<String> deviceIds, List<Long> times, List<List<String>> measurementsList, List<List<TSDataType>> typesList, List<List<Object>> valuesList)` | Insert multiple aligned records                              | Same as above, plus `typesList`: List of lists of data types |
| `insertAlignedRecordsOfOneDevice(String deviceId, List<Long> times, List<List<String>> measurementsList, List<List<TSDataType>> typesList, List<List<Object>> valuesList)` | Insert multiple aligned records for a single device          | Same as above                                                |
| `insertAlignedRecordsOfOneDevice(String deviceId, List<Long> times, List<List<String>> measurementsList, List<List<TSDataType>> typesList, List<List<Object>> valuesList, boolean haveSorted)` | Insert sorted multiple aligned records for a single device   | Same as above, plus  `haveSorted`: Whether the data is already sorted |
| `insertAlignedStringRecordsOfOneDevice(String deviceId, List<Long> times, List<List<String>> measurementsList, List<List<String>> valuesList)` | Insert string-formatted aligned records for a single device  | `deviceId`: Device ID，`times`: List of timestamps，`measurementsList`: List of lists of measurement points，`valuesList`:  List of lists of values |
| `insertAlignedStringRecordsOfOneDevice(String deviceId, List<Long> times, List<List<String>> measurementsList, List<List<String>> valuesList, boolean haveSorted)` | Insert sorted string-formatted aligned records for a single device | Same as above, plus w `haveSorted`: whether the data is already sorted |
| `insertTablet(Tablet tablet)`                                | Insert a single Tablet data                                  | `tablet`: The Tablet data to be inserted                     |
| `insertTablet(Tablet tablet, boolean sorted)`                | Insert a sorted Tablet data                                  | Same as above, plus `sorted`: whether the data is already sorted |
| `insertAlignedTablet(Tablet tablet)`                         | Insert an aligned Tablet data                                | `tablet`:  The Tablet data to be inserted                    |
| `insertAlignedTablet(Tablet tablet, boolean sorted)`         | Insert a sorted aligned Tablet data                          | Same as above, plus `sorted`: whether the data is already sorted |
| `insertTablets(Map<String, Tablet> tablets)`                 | Insert multiple Tablet data in batch                         | `tablets`: Mapping from device IDs to Tablet data            |
| `insertTablets(Map<String, Tablet> tablets, boolean sorted)` | Insert sorted multiple Tablet data in batch                  | Same as above, plus `sorted`: whether the data is already sorted |
| `insertAlignedTablets(Map<String, Tablet> tablets)`          | Insert multiple aligned Tablet data in batch                 | `tablets`: Mapping from device IDs to Tablet data            |
| `insertAlignedTablets(Map<String, Tablet> tablets, boolean sorted)` | Insert sorted multiple aligned Tablet data in batch          | Same as above, plus `sorted`: whether the data is already sorted |

##### 3.2.3 Data Deletion

| **Method Name**                                              | **Function Description**                                     | **Parameter Explanation**                               |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------- |
| `deleteTimeseries(String path)`                              | Delete a single time series                                  | `path`: The path of the time series                     |
| `deleteTimeseries(List<String> paths)`                       | Batch delete time series                                     | `paths`: A list of time series paths                    |
| `deleteData(String path, long endTime)`                      | Delete historical data for a specified path                  | `path`: The path，`endTime`: The end timestamp          |
| `deleteData(List<String> paths, long endTime)`               | Batch delete historical data for specified paths             | `paths`:  A list of paths，`endTime`: The end timestamp |
| `deleteData(List<String> paths, long startTime, long endTime)` | Delete historical data within a time range for specified paths | Same as above, plus  `startTime`: The start timestamp   |


##### 3.2.4 Data Query

| **Method Name**                                              | **Function Description**                                 | **Parameter Explanation**                                    |
| ------------------------------------------------------------ | -------------------------------------------------------- | ------------------------------------------------------------ |
| `executeQueryStatement(String sql)`                          | Execute a query statement                                | `sql`: The query SQL statement                               |
| `executeQueryStatement(String sql, long timeoutInMs)`        | Execute a query statement with timeout                   | `sql`: The query SQL statement, `timeoutInMs`: The query timeout (in milliseconds), default to the server configuration, which is 60s. |
| `executeRawDataQuery(List<String> paths, long startTime, long endTime)` | Query raw data for specified paths                       | paths: A list of query paths, `startTime`: The start timestamp, `endTime`: The end timestamp |
| `executeRawDataQuery(List<String> paths, long startTime, long endTime, long timeOut)` | Query raw data for specified paths (with timeout)        | Same as above, plus `timeOut`: The timeout time              |
| `executeLastDataQuery(List<String> paths)`                   | Query the latest data                                    | `paths`: A list of query paths                               |
| `executeLastDataQuery(List<String> paths, long lastTime)`    | Query the latest data at a specified time                | `paths`: A list of query paths, `lastTime`: The specified timestamp |
| `executeLastDataQuery(List<String> paths, long lastTime, long timeOut)` | Query the latest data at a specified time (with timeout) | Same as above, plus `timeOut`: The timeout time              |
| `executeLastDataQueryForOneDevice(String db, String device, List<String> sensors, boolean isLegalPathNodes)` | Query the latest data for a single device                | `db`: The database name, `device`: The device name, `sensors`: A list of sensors, `isLegalPathNodes`: Whether the path nodes are legal |
| `executeAggregationQuery(List<String> paths, List<TAggregationType> aggregations)` | Execute an aggregation query                             | `paths`: A list of query paths, `aggregations`: A list of aggregation types |
| `executeAggregationQuery(List<String> paths, List<TAggregationType> aggregations, long startTime, long endTime)` | Execute an aggregation query with a time range           | Same as above, plus `startTime`: The start timestamp, `endTime`:` The end timestamp |
| `executeAggregationQuery(List<String> paths, List<TAggregationType> aggregations, long startTime, long endTime, long interval)` | Execute an aggregation query with a time interval        | Same as above, plus `interval`: The time interval            |
| `executeAggregationQuery(List<String> paths, List<TAggregationType> aggregations, long startTime, long endTime, long interval, long slidingStep)` | Execute a sliding window aggregation query               | Same as above, plus `slidingStep`: The sliding step          |
| `fetchAllConnections()`                                      | Get information of all active connections                | No parameters                                                |

##### 3.2.5 System Status and Backup

| **Method Name**            | **Function Description**                  | **Parameter Explanation**                  |
| -------------------------- | ----------------------------------------- | ------------------------------------------ |
| `getBackupConfiguration()` | Get backup configuration information      | No parameters                              |
| `fetchAllConnections()`    | Get information of all active connections | No parameters                              |
| `getSystemStatus()`        | Get the system status                     | Deprecated, returns  `SystemStatus.NORMAL` |