日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

文檔

基于Client SDK數據寫入

更新時間:

AnalyticDB PostgreSQL版Client SDK旨在通過API方式提供高性能COPY數據到AnalyticDB PostgreSQL版的方式。

AnalyticDB PostgreSQL版Client SDK支持用戶定制化開發或對接寫入程序。通過SDK開發寫入程序,可簡化在AnalyticDB PostgreSQL版中寫入數據的流程,無需擔心連接池、緩存等問題,相比較直接COPY/INSERT寫入,通過并行化等內部機制有幾倍性能提升。

說明

AnalyticDB PostgreSQL版Client SDK主要職責是將您傳入的數據高效地寫入,不負責原始數據的讀取、處理等工作。

Maven repositories

您可以通過Maven管理配置新SDK的版本。Maven的配置信息如下:

<dependency>
  <groupId>com.alibaba.cloud.analyticdb</groupId>
  <artifactId>adb4pgclient</artifactId>
  <version>1.0.4</version>
</dependency>
說明

離線Jar包下載鏈接:adb4pgclient-1.0.4.jar

接口列表

表 1. DatabaseConfig類

接口名

描述

setHost(String adbHost)

需要連接的AnalyticDB PostgreSQL版的連接地址。

setPort(int port)

需要連接的AnalyticDB PostgreSQL版的端口,默認為5432。

setDatabase(String database)

需要連接的AnalyticDB PostgreSQL版數據庫名稱。

setUser(String username)

需要連接的AnalyticDB PostgreSQL版使用的用戶名。

setPassword(String pwd)

設置連接的AnalyticDB PostgreSQL版使用的密碼。

addTable(List<String> table, String schema)

需要寫入的表名List,請按照表所屬schema分別添加。該方法可調用多次,但在使用DatabaseConfig構造Adb4PGClient對象之后再調用不再生效。

setColumns(List<String> columns, String tableName, String schemaName)

需要插入表的字段名(若是全字段插入,columnList.add("*")即可,table列表中的所有表都需要設置字段名,否則檢查不會通過。

setInsertIgnore(boolean insertIgnore)

設置是否忽略發生主鍵沖突錯誤的數據行,要根據業務的使用場景進行判斷,針對配置的所有表。默認為false,表示不忽略發生主鍵沖突錯誤的數據行(即會覆蓋寫發生沖突的行)。

setEmptyAsNull(boolean emptyAsNull)

設置empty數據設置為null,默認false,針對配置的所有表。

setParallelNumber(int parallelNumber)

設置寫入AnalyticDB PostgreSQL版時的并發線程數,默認4,針對配置的所有表,一般情況不建議修改。

setLogger(Logger logger)

設置client中使用的logger對象,此處使用slf4j.Logger。

setRetryTimes(int retryTimes)

設置commit時,寫入AnalyticDB PostgreSQL版出現異常時重試的次數,默認為3。

setRetryIntervalTime(long retryIntervalTime)

設置重試間隔的時間,單位是ms,默認為 1000 ms。

setCommitSize(long commitSize)

設置自動提交的數據量(單位Byte),默認為10MB,一般不建議設置。

表 2. Row類

接口名稱

描述

setColumn(int index, Object value)

設置Row字段列表的值,要求必須按照字段的順序(此種方式,Row實例不可復用,每條數據必須單獨的Row實例)。

setColumnValues(List<Object> values)

直接將List格式數據行寫入Row中。

updateColumn(int index, Object value)

更新Row字段列表的值,注意更新的字段數據(此方法,Row實例可以復用,只需更新Row實例中的數據即可。

表 3. Adb4pgClient 類

接口名稱

描述

addRow(Row row, String tableName, String schemaName) / addRows(List<Row> rows, String tableName, String schemaName)

插入對應表的Row格式化的數據,即一條記錄,數據會存儲在SDK的緩沖區中,等待commit。如果數據量超過commitSize會在addRow/addRows的時候做一次自動commit,然后將最新的數據add進來;如果在自動commit失敗的時候失敗,調用方需要處理此異常,并且會在異常中得到失敗的數據list。

addMap(Map<String, String> dataMap,String tableName, String schemaName) / addMaps(List<Map<String, String>> dataMaps, String tableName, String schemaName)

對應于addRow,支持map格式數據的寫入,如果數據量滿了會在addMap/addMaps的時候做一次自動commit,然后將最新的數據add進來;如果在自動commit失敗的時候失敗,調用方需要處理此異常,并且會在異常中得到失敗的數據list。

commit()

將緩存的數據進行提交,寫入AnalyticDB PostgreSQL版中,若commit失敗,會把執行錯誤的語句放在異常中拋出,調用方需要對此異常進行處理。

TableInfo getTableInfo(String tableName, String schemaName)

獲取對應table的結構信息。

List<ColumnInfo> getColumnInfo(String tableName, String schemaName)

獲取對應table的字段列表信息,字段類是ColumnInfo,可以通過columnInfo.isNullable()獲取該字段是否能為null。

stop()

實例使用完之后,stop釋放內部線程池及資源,如果內存中有數據未commit,則會拋Exception,若需要強行stop,請使用forceStop()

forceStop()

強行釋放內部線程池及資源,會丟失掉緩存在內存中未commit的數據,一般不推薦使用。

Connection getConnection() throws SQLException

從client連接池獲取數據庫Connection連接,調用方可以使用獲得的Connection做非copy操作,使用方式和jdbc的連接使用方式一致。

說明

使用結束后一定要釋放掉相應的資源(如ResultSet、Statement、Connection)。

表 4. ColumnInfo類

接口名稱

描述

boolean isNullable()

判斷該字段是否能為null。

錯誤碼名

錯誤碼值

描述

COMMIT_ERROR_DATA_LIST

101

commit中某些數據出現異常,會返回異常的數據。

說明

通過e.getErrData()即可獲得異常數據List<String>,此錯誤碼在addMap(s)addRow(s)commit操作的時候都可能會發生,因此在這些操作的時候需要單獨處理此錯誤碼的異常

COMMIT_ERROR_OTHER

102

commit中的其他異常。

ADD_DATA_ERROR

103

add數據過程中出現的異常。

CREATE_CONNECTION_ERROR

104

創建連接出現異常。

CLOSE_CONNECTION_ERROR

105

關閉連接出現異常。

CONFIG_ERROR

106

配置DatabaseConfig出現配置錯誤。

STOP_ERROR

107

停止實例時的報錯。

OTHER

999

默認異常錯誤碼。

代碼示例

public class Adb4pgClientUsage {
    public void demo() {
        DatabaseConfig databaseConfig = new DatabaseConfig();
        // Should set your database real host or url
        databaseConfig.setHost("100.100.100.100");
        // Should set your database real port
        databaseConfig.setPort(8888);
        // 連接數據庫的用戶名。
        databaseConfig.setUser("your user name");
        // 連接數據庫的密碼。
        databaseConfig.setPassword("your password");
      // 需要連接的database。
        databaseConfig.setDatabase("your database name");
        // 設置需要寫入的表名列表。
        List<String> tables = new ArrayList<String>();
        tables.add("your table name 1");
        tables.add("your table name 2");

        // 不同schema下的表可分別addTable,但是一旦使用databseconfig 創造Client實例之后,table配置是不可修改的。/
        // schema傳入null, 則默認schema為public。
        databaseConfig.addTable(tables, "table schema name");

        // 設置需要寫入的表字段。
        List<String> columns = new ArrayList<String>();
        columns.add("column1");
        columns.add("column2");
        // 如果是所有字段,字段列表使用 columns.add("*") 即可。
        databaseConfig.setColumns(columns, "your table name 1", "table schema name");
        databaseConfig.setColumns(Collections.singletonList("*"),"your table name 2", "table schema name");


        // If the value of column is empty, set null
        databaseConfig.setEmptyAsNull(false);
        // 使用insert ignore into方式進行插入。
        databaseConfig.setInsertIgnore(true);
        // commit時,寫入數據庫出現異常時重試的3次。
        databaseConfig.setRetryTimes(3);
        // 重試間隔的時間為1s,單位是ms。
        databaseConfig.setRetryIntervalTime(1000);
        // Initialize AdbClient,初始化實例之后,databaseConfig的配置信息不能再修改。
        Adb4pgClient adbClient = new Adb4pgClient(databaseConfig);

        // 數據需要攢批,多次add,再commit,具體攢批數量見"注意事項"。
        for (int i = 0; i < 10; i++) {
            // Add row(s) to buffer. One instance for one record
            Row row = new Row(columns.size());
            // Set column
            // the column index must be same as the sequence of columns
            // the column value can be any type, internally it will be formatted according to column type
            row.setColumn(0, i); // Number value
            row.setColumn(1, "string value"); // String value
            // 如果sql長度滿了會在addRow或者addMap的時候會進行一次自動提交。
            // 如果提交失敗會返回AdbClientException異常,錯誤碼為COMMIT_ERROR_DATA_LIST。
            adbClient.addRow(row, "your table name 1", "table schema name");
        }

        Row row = new Row();
        row.setColumn(0, 10); // Number value
        row.setColumn(1, "2018-01-01 08:00:00"); // Date/Timestamp/Time value
        adbClient.addRow(row, "your table name 1", "table schema name");
        // Update column. Row實例可復用。
        row.updateColumn(0, 11);
        row.updateColumn(1, "2018-01-02 08:00:00");
        adbClient.addRow(row, "your table name 1", "table schema name");

        // Add map(s) to buffer
        Map<String, String> rowMap = new HashMap<String, String>();
        rowMap.put("t1", "12");
        rowMap.put("t2", "string value");
        // 這邊需要攢批的,建議多次add之后在進行commit。
        adbClient.addMap(rowMap, "your table name 2", "table schema name");

        // Commit buffer to ADS
        // Buffer is cleaned after successfully commit to ADS
        try {
            adbClient.commit();
        } catch (Exception e) {
            // TODO: Handle exception here
        } finally {
            adbClient.stop();
        }
    }

}

注意事項

  • AnalyticDB PostgreSQL版Client SDK是非線程安全的,所以如果多線程調用的情況,需要每個線程維護自己的Client對象。

    重要

    不建議多線程共用SDK實例,除了線程安全問題外,也容易讓Client成為寫入性能的瓶頸。

  • 數據必須在調用commit成功后才能認為是寫入AnalyticDB PostgreSQL版成功的。

  • 針對Client拋出的異常,調用方要根據錯誤碼的意義自行判斷如何處理,如果是數據寫入有問題,可以重復提交或者記錄下有問題的數據后跳過。

  • 很多時候寫入線程并不是越多越好,因為業務程序會涉及到攢數據的場景,對內存的消耗是比較明顯的,所以業務調用方一定要多多關注應用程序的GC情況。

  • 數據攢批數量不要太小,如果太小,攢批寫入意義就不大了,條件允許的情況下可以add 10000條進行一次commit。

  • DatabaseConfig配置在實例化client對象成功之后是不能再修改的,所有配置項必須在client對象初始化之前完成配置。

  • Client SDK目的是對寫入(INSERT)提供性能優化,對于其他SQL操作,可以通過getConnection()獲得JDBC連接,通過標準JDBC接口進行處理。