使用Knex onConflict导致云函数超时问题求助
解决Knex.js循环插入GeoJSON到PostGIS超时问题
你的问题核心在于循环里串行执行单个插入请求——每处理一个feature就发起一次数据库调用,当features数量较多时,累计的网络延迟和数据库操作时间会直接导致云函数超时。
优化方案:批量插入
先把所有待插入的数据整理成数组,再一次性执行插入操作,这样只需要一次数据库请求,能极大提升执行效率。
修改后的代码如下:
async function insertFeatures() { try { const results = await getGeoJSON(); pool = pool || (await createPool()); const st = knexPostgis(pool); // 批量整理所有待插入数据 const insertData = results.features.map(feature => { const { geometry, properties } = feature; const { region, date, type, name, url } = properties; const point = st.geomFromGeoJSON(geometry); return { region, url, date, name, type, geom: point }; }); // 一次性执行批量插入,冲突时忽略重复url的记录 await pool('observations') .insert(insertData) .onConflict('url') .ignore(); } catch (error) { console.log(error); return res.status(500).json({ message: `${error} Poop` }); } }
关键注意事项
- 必须确保
observations表的url字段已创建唯一约束,否则onConflict('url').ignore()不会生效。可以通过以下SQL语句添加约束:ALTER TABLE observations ADD CONSTRAINT unique_url UNIQUE (url); - 如果待插入的features数量极大(比如上万条),可以将数据分成若干小批次插入(例如每1000条一批),避免单次请求数据量过大导致数据库压力过高。
内容的提问来源于stack exchange,提问作者jjhi11
相关产品推荐
相关产品推荐

