全部產品
Search
文件中心

Tablestore:使用 Java SDK 寫入資料時報錯:The count of attribute columns exceeds the maximum:128

更新時間:Mar 05, 2025

問題現象

使用Tablestore Java SDK 寫入資料時出現如下報錯:

The count of attribute columns exceeds the maximum:128

原因分析

使用TableStoreWriter工具類寫入資料時,預設的屬性列寫入個數上限為128。

解決方案

使用 Java SDK 初始化 TableStoreWriter 時,可以通過修改 MaxColumnsCount 參數來提高屬性列寫入個數的上限。最高可以設定為1024,即一行最多寫入1024個屬性列。

運行代碼前,請在系統內容變數中配置阿里雲帳號或RAM使用者的AccessKey資訊。具體操作,請參見配置訪問憑證
// yourInstanceName 填寫您的執行個體名稱
final String instanceName = "yourInstanceName";
// yourEndpoint 填寫您的執行個體訪問地址
final String endPoint = "yourEndpoint";
// 擷取環境變數裡的 AccessKey ID 和 AccessKey Secret
String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");

ClientConfiguration cc = new ClientConfiguration();
cc.setRetryStrategy(new DefaultRetryStrategy()); // 可定製重試策略,如果需要保證資料寫入成功率,可採用更激進的重試策略。
AsyncClient asyncClient = new AsyncClient(endPoint, accessKeyId, accessKeySecret, instanceName, cc);

// 初始化
WriterConfig config = new WriterConfig();
config.setMaxBatchSize(4 * 1024 * 1024); // 配置一次大量匯入請求的大小限制,預設值為 4 MB。
config.setMaxColumnsCount(128); // 配置一行的列數的上限,預設值為 128。
config.setBufferSize(1024); // 配置記憶體中最多緩衝的資料行數,預設值為 1024,必須是 2 的指數倍。
config.setMaxBatchRowsCount(100); // 配置一次大量匯入的行數上限,預設值為 100。
config.setConcurrency(10); // 配置最大並發數,預設值為 10。
config.setMaxAttrColumnSize(2 * 1024 * 1024); // 配置屬性列的值大小上限,預設值為 2 MB。
config.setMaxPKColumnSize(1024); // 配置主鍵列的值大小上限,預設值為 1 KB。
config.setFlushInterval(10000); // 配置緩衝區 flush 的時間間隔,預設值為 10。單位為秒。

// 配置一個 callback ,OTSWriter 通過該 callback 反饋哪些匯入成功,哪些行匯入失敗,該 callback 只簡單的統計寫入成功和失敗的行數。
AtomicLong succeedCount = new AtomicLong();
AtomicLong failedCount = new AtomicLong();
TableStoreCallback<RowChange, ConsumedCapacity> callback = new SampleCallback(succeedCount, failedCount);
ExecutorService executor = Executors.newFixedThreadPool(2);
TableStoreWriter tablestoreWriter = new DefaultTableStoreWriter(asyncClient, tableName, config, callback, executor);

關於 TableStoreWriter 的更多資訊,請參見使用TableStoreWriter並發寫入資料