GridDB Python客户端时序容器复用RowSet查询返回陈旧数据问题咨询
GridDB Python客户端时序容器连续查询返回陈旧数据的问题解答
问题结论
这是GridDB Python客户端针对**时序容器(TimeSeries)**的已知设计限制:时序容器的RowSet实例内部会缓存查询结果,复用同一RowSet(即使关联新的查询语句)会直接读取缓存数据,而非重新执行新查询。集合容器(Collections)无此限制,是因为其RowSet未实现结果缓存机制。
原因分析
GridDB为优化时序数据的查询性能,给时序容器的RowSet增加了结果缓存逻辑。当你复用同一个RowSet变量(即使重新赋值为新query的fetch结果),底层可能仍会复用之前的缓存实例(或存在引用未释放的情况),导致新查询的结果被旧缓存覆盖。
正确解决方案
每次执行新查询时,必须创建全新的RowSet实例,无需重建容器对象,只需确保每次查询都通过query.fetch()获取新的RowSet即可。修正后的示例代码:
# 查询1 query1 = container.query("SELECT * WHERE ts >= TIMESTAMP('2024-06-01T00:00:00')") rs1 = query1.fetch(False) print([row for row in rs1]) # 查询2:创建全新的query和RowSet实例 query2 = container.query("SELECT * WHERE ts >= TIMESTAMP('2024-06-01T00:02:00')") rs2 = query2.fetch(False) print([row for row in rs2])
补充说明
- 调用
rs.close()/query.close()无效:缓存是RowSet实例级别的,关闭操作不会清除已缓存的数据,复用变量仍会读取旧缓存。 - 重建容器有效:新容器对象生成的查询会创建完全独立的
RowSet实例,不受之前缓存影响。 - 该限制在GridDB CE 5.3及Cloud版本中表现一致,属于客户端的性能优化设计,而非bug。
内容的提问来源于stack exchange,提问作者VIK
相关产品推荐
相关产品推荐

