如何在Ignite Cache中使用In操作符查询及创建临时表批量更新
Ignite缓存批量更新多行:临时表创建与批量填充方案
一、创建会话级临时表
Ignite支持创建会话级临时表,仅在当前连接会话内有效,断开连接后自动销毁。语法和常规SQL一致,只需指定TEMPORARY关键字:
CREATE TEMPORARY TABLE tmp_update_ids ( id INT PRIMARY KEY -- 列类型要和目标缓存表的主键/匹配列类型完全一致 );
若需关联多列,直接扩展字段定义即可,比如添加type VARCHAR(20)等。
二、批量填充临时表
有两种高效的批量填充方式:
1. SQL批量插入
直接用INSERT INTO的多值语法一次性插入批量数据,适合已知固定值的场景:
INSERT INTO tmp_update_ids (id) VALUES (1), (2), (3), (10), (15); -- 一次性插入多个目标ID
无需额外API,直接通过SQL客户端执行即可。
2. Ignite API批量写入(Java示例)
如果数据是动态生成的集合,用Ignite的DataStreamer或直接调用缓存的putAll方法,性能比单条SQL插入更优:
// 获取Ignite实例 Ignite ignite = Ignition.ignite(); // 获取临时表对应的缓存(临时表本质是Ignite缓存,命名规则为SQL_PUBLIC_<表名大写>) IgniteCache<Integer, Object> tmpCache = ignite.cache("SQL_PUBLIC_TMP_UPDATE_IDS"); // 准备批量数据 Map<Integer, Object> batchData = new HashMap<>(); batchData.put(1, new Object()); // 临时表仅需主键列时,值可使用占位符 batchData.put(2, new Object()); batchData.put(3, new Object()); // 批量写入临时表 tmpCache.putAll(batchData);
三、结合临时表执行批量更新
临时表填充完成后,即可关联目标缓存表执行批量更新,比如更新user_cache表中ID在临时表的记录:
UPDATE user_cache SET status = 'ACTIVE' WHERE id IN (SELECT id FROM tmp_update_ids);
也可使用JOIN语法,分布式场景下性能更优:
UPDATE user_cache u SET u.status = 'ACTIVE' FROM tmp_update_ids t WHERE u.id = t.id;
注意事项
- 临时表的列类型必须与目标缓存表的匹配列完全一致,否则会出现类型不匹配错误。
- 会话级临时表仅对当前连接可见,不同会话的临时表相互独立。
- 分布式集群中,临时表数据会自动分布在节点上,Ignite会处理分布式关联查询的逻辑。
内容的提问来源于stack exchange,提问作者Rohan19
相关产品推荐
相关产品推荐

