错误信息

当调用 API/SDK 使用表格存储功能时可能会出现一些报错信息。本文介绍了常见错误信息的解决方案。

错误信息

可能原因

解决方案

相关功能文档

java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STOPPED

一般是由于 OTSClient 被调用了 shutdown,其内部的 I/O reactor 均已被关闭。

调用的 OTSClient 不能处于 shutDown 状态。如果调用的 OTSClient 已处于 shutDown 状态,请重新初始化 OTSClient 后再进行操作。

初始化 OTSClient

java.lang.UnsupportedOperationException: This is supposed to be overridden by subclassed

表格存储 Java SDK 依赖 2.4.1 版本的 Protobuf 库和 4.0.2 版本的 httpasyncclient,容易与您的应用程序中自带的相同库冲突。

在 Maven 项目中的 pom.xml 中添加如下依赖即可。

说明

classifier 为 jar-with-dependencies,它将依赖的 HttpClient 和 Protobuf 库都通过 rename package 的方式打包进去,去除了对 HttpClient 和 Protobuf 的依赖。

<dependency>
    <groupId>com.aliyun.openservices</groupId>
    <artifactId>tablestore</artifactId>
    <version>替换为您当前使用的版本</version>
    <classifier>jar-with-dependencies</classifier>
    <exclusions>
        <exclusion>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpasyncclient</artifactId>
        </exclusion>
    </exclusions>
</dependency>    

安装表格存储 Java SDK

The count of attribute columns exceeds the maximum:128

在向表格存储数据表写入数据时,一行最多支持写入 1024 列。在使用 TableStoreWriter 的过程中,客户端会有一个默认写入 128 列的限制。

使用 Java SDK 构造 TableStoreWriter 客户端时,您可以通过修改 MaxColumnsCount 参数来适当调大一行默认写入的列数。

使用 TableStoreWriter 进行高并发、高吞吐的数据写入

length of field value is longer than 32 for the [WILDCARD_QUERY] query

带有通配符的字符串长度超过 32 字节。

使用通配符查询时,要匹配的值可以是一个带有通配符的字符串,带有通配符的字符串长度不能超过 32 字节,请替换查询字符串。

通配符查询

field:xx must enable enable_sort_and_agg

创建多元索引时没有为对应字段开启排序与统计聚合(即 enable_sort_and_agg = true)功能。

请通过多元索引的动态修改 schema 功能来为要使用的字段开启排序与统计聚合功能。具体操作,请参见动态修改 schema

[bool_query] sub query must not be null

查询条件中的子查询条件为空,未配置必选参数。

您需要自行排查代码中查询条件的相关参数配置,请确保已正确配置查询条件中的所有子查询条件。

重要

如果自行排查代码后问题仍未解决,请加入钉钉群 23307953(表格存储技术交流群-2)或 36165029092(表格存储技术支持群-3)联系我们。

多条件组合查询

can't set [sort] when [token] is not null

在使用 token 翻页时设置了 sort。

通过多元索引查询数据使用 token 进行翻页时,token 中已编码了排序字段,无需再额外设置 sort。

排序和翻页

[table ttl] must be bigger than or equal search index ttl

数据表上存在多元索引,数据表的 TTL 必须大于或等于多元索引的 TTL。

当要调整数据表 TTL 时,请确认所需数据表 TTL 是否小于多元索引 TTL。

  • 如果所需数据表 TTL 小于多元索引 TTL,请同时调小多元索引 TTL 和数据表 TTL,此时需要先调整多元索引 TTL,再调整数据表 TTL。

  • 如果所需数据表 TTL 大于或等于多元索引 TTL,请直接进行修改。

The sql scanned rows of main table exceeds the quota, main table rows quota is 100000

如果使用 SQL 查询数据时使用的条件为非分区键,则会造成全表扫描数据,可能会出现扫描到的行数或者数据量超过限制的情况。

重要

目前 SQL 单次扫描支持的最大行数为 100000 行,最大数据量为 128 MB,最长时间为 30 秒。

使用 SQL 查询数据时,请确保查询条件包含主键列且符合最左匹配原则,并为 SQL 语句添加 limit 参数来控制返回的行数。

如果查询条件不满足上述条件,您还可以通过如下方式进行查询加速。更多信息,请参见索引选择策略

  • 如果通过创建二级索引即可满足查询条件包含主键列且符合最左匹配原则,则建议您创建二级索引进行查询加速。更多信息,请参见二级索引介绍

  • 如果查询条件中包括聚合函数(例如 count、sum、avg)、group by 或者基于非主键的过滤查询,则建议创建多元索引进行查询加速。更多信息,请参见多元索引介绍

    如果已为数据表创建多元索引仍出现该错误,建议检查多元索引中是否包含所有查询时用到的字段。

使用 SQL 查询数据

Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]

缺少 javassist-x.x.x.jar 包。

您可以通过以下两种方式安装 javassist-x.x.x.jar 包。

  • 下载 javassist 安装包(即 javassist-x.x.x.jar)并导入到项目中。具体下载路径请参见javassist安装包。 javassist-x.x.x.jar 中的 x.x.x 表示 javassist 的版本号,请根据实际下载所需版本的安装包。

  • 在 Maven 项目中加入依赖项。

    在 Maven 工程的 pom.xml 中加入相应依赖即可。此处以 3.15.0-GA 版本为例介绍,在 <dependencies> 内加入如下内容:

    <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.15.0-GA</version>
    </dependency>

通过 Hibernate 使用 SQL 查询数据

Disallow read index table in building base state

二级索引的存量构造需要对表中的存量数据进行读取,然后同步到索引表。在存量数据同步完成之前,不允许读索引表,当存量数据同步完成,可以正常读取索引表。存量数据同步时间与数据表的数据量大小相关。

等待二级索引存量数据构造和同步完成后再进行数据读取。

Checksum mismatch

表格存储的整型是 64 位的,而 32 位 PHP 只能用 string 表示 64 位的整型,所以暂不支持 32 位 PHP;且 Windows 系统中 PHP 7 之前版本的整型不是真正的 64 位。

在 Windows 系统中使用表格存储 PHP SDK 时,PHP版本必须使用 PHP 7 及以上的 64 位版本,强烈建议使用 PHP 7 以获得最佳性能。

通过 phpinfo() 查看PHP配置信息中的 Architecture 类型,可以判断 PHP 版本是否满足使用要求。

安装表格存储 PHP SDK