使用Java驱动在YugabyteDB执行findAll查询报数组越界异常
问题根因
该异常是YugabyteDB 4.6.0-yb-6及更早版本定制Java驱动的已知缺陷:当执行不带任何绑定参数的全表查询时(比如Spring Data JPA自动生成的findAll对应SELECT * FROM my_list.attribute语句,无查询参数),分区感知负载均衡策略PartitionAwarePolicy未对空的EmptyColumnDefinitions做长度校验,直接访问下标为0的元素,触发数组越界。
解决方案
方案1(推荐,无需修改业务代码)
直接升级Java驱动版本到4.6.0-yb-9及以上的Yugabyte官方兼容版本,该版本已修复该空定义访问的边界问题,升级后即可正常执行findAll查询。
方案2(临时规避,无法升级驱动时使用)
两种可选规避逻辑二选一即可:
- 自定义带参数的全表查询:在Repository层新增带分区键过滤的查询方法,示例如下:
调用时传入UUID最小值@Query("SELECT * FROM my_list.attribute WHERE id > :minId") List<MyClass> findAllCustom(@Param("minId") UUID minId);new UUID(0L, 0L)即可实现全表扫描,携带绑定参数后不会触发空定义访问逻辑。 - 临时替换负载均衡策略:在项目配置文件中修改Cassandra驱动的负载均衡策略为轮询,避开分区感知策略的异常分支,配置示例:
spring.data.cassandra.load-balancing-policy.class=com.datastax.oss.driver.internal.core.loadbalancing.RoundRobinPolicy
额外建议
YugabyteDB 2.9.0属于开发预览版本,未经过生产级稳定性验证,如果是生产环境使用,建议同步升级到2.18.x、2.20.x等长期支持稳定版本,避免其他已知兼容性问题。
内容的提问来源于stack exchange,提问作者dh YB
相关产品推荐
相关产品推荐

