SqlFieldsQuery实例能否重复使用并每次调用setArgs传入不同参数?
SqlFieldsQuery实例能否重复使用并每次调用setArgs传入不同参数?
当然可以重复使用SqlFieldsQuery实例,并且每次调用setArgs()传入不同参数来执行查询是完全可行的!
虽然官方示例里大多习惯每次创建新的SqlFieldsQuery实例,但这更多是为了让示例代码更简洁直观,而非这种复用方式存在问题。SqlFieldsQuery的设计本身就支持动态替换参数的场景——setArgs()方法的作用就是覆盖当前实例的查询参数,每次调用后再传给IgniteCache#query(),就能执行对应参数的查询操作。
不过这里有个需要注意的点:如果是在多线程环境下复用同一个SqlFieldsQuery实例,一定要警惕线程安全问题。因为SqlFieldsQuery内部的参数状态是可变的,多个线程同时调用setArgs()或者触发查询的话,很可能会出现参数被意外覆盖、查询结果不符合预期的情况。这种场景下,要么给每个线程分配独立的SqlFieldsQuery实例,要么在操作共享实例时加上同步锁来保证线程安全。
另外,复用SqlFieldsQuery实例还能带来一点小收益:避免频繁创建对象带来的微小性能开销,在高频执行相同SQL模板的查询场景下,这种优化还是有实际意义的。
备注:内容来源于stack exchange,提问作者lmk
相关产品推荐
相关产品推荐

