PostgreSQL error: Connection terminated unexpectedly for long queries
PostgreSQL error: Connection terminated unexpectedly for long queries
我正在尝试使用以下函数将数万个 Twitter 配置文件添加到 PostgreSQL 数据库。 Twitter 部分效果很好——我得到了 5000 个 id 的批次,将它们推送到主数组 allFollowers
,然后在达到 API 速率限制时暂停 15 分钟(在获取 75000 个配置文件之后),然后再获取下一个一批关注者。
问题是,我认为,当函数暂停 15 分钟时,数据库连接关闭。当函数完成 运行ning 时,我收到错误 Connection terminated unexpectedly
。当我 运行 在拥有不到 75000 名关注者的 Twitter 帐户上进行此操作时,它不必暂停,没有任何问题。
我正在使用 pg-promise with the default options. I've tried many of the suggestions in this post 连接到数据库 - 即一个巨大的 idleTimeoutMillis
值(比函数到达 运行 所需的时间长)或将其设置为 0,但是没有运气。它们的性能似乎都与默认设置相同。
我还尝试在 await addProfiles
行之前显式调用 db.connect()
,但这也没有改变任何东西。
async function getTwitterFollowers() {
const allFollowers = []
const targetAccount = 'TwitterDev'
await getGroupOfFollowers(-1) // Default cursor for the Twitter API is -1
async function getGroupOfFollowers(cursor) {
await T.get('followers/ids', {
screen_name: targetAccount,
stringify_ids: true,
cursor: cursor,
count: 5000,
})
.then(async (res) => {
const followerIds = await res.data.ids
followerIds.map((id) => {
allFollowers.push(id)
})
// Paginate and get the next 5000 followers if the first page is full
if (followerIds.length === 5000) {
await getGroupOfFollowers(res.data.next_cursor)
}
})
.catch(async (err) => {
// This is expected to fail due to Twitter rate limiting, so we pause and try again
// This is why the queries are so long
console.error('Trying again in 15 mins.', err.twitterReply.errors[0].message)
// Pause for 15 mins
await new Promise((resolve) => setTimeout(resolve, 900000))
// Try again
await getGroupOfFollowers(cursor)
})
}
// It could take many hours to get to this point for large Twitter accounts
try {
await addProfiles(
allFollowers.map((id) => ({
id: id,
added: new Date(),
}))
)
console.log(`Added/updated ${allFollowers.length} profiles to the database`)
} catch (err) {
console.error("Error adding target accounts' followers to the database.", err)
// This is the "Error: Connection terminated unexpectedly"
}
return allFollowers
}
我想知道我的问题是否出在数据库启动选项中(同样,我使用所有默认设置,因为其他建议的答案不起作用),或者以其他方式保持连接。将不胜感激。
我正在尝试使用以下函数将数万个 Twitter 配置文件添加到 PostgreSQL 数据库。 Twitter 部分效果很好——我得到了 5000 个 id 的批次,将它们推送到主数组 allFollowers
,然后在达到 API 速率限制时暂停 15 分钟(在获取 75000 个配置文件之后),然后再获取下一个一批关注者。
问题是,我认为,当函数暂停 15 分钟时,数据库连接关闭。当函数完成 运行ning 时,我收到错误 Connection terminated unexpectedly
。当我 运行 在拥有不到 75000 名关注者的 Twitter 帐户上进行此操作时,它不必暂停,没有任何问题。
我正在使用 pg-promise with the default options. I've tried many of the suggestions in this post 连接到数据库 - 即一个巨大的 idleTimeoutMillis
值(比函数到达 运行 所需的时间长)或将其设置为 0,但是没有运气。它们的性能似乎都与默认设置相同。
我还尝试在 await addProfiles
行之前显式调用 db.connect()
,但这也没有改变任何东西。
async function getTwitterFollowers() {
const allFollowers = []
const targetAccount = 'TwitterDev'
await getGroupOfFollowers(-1) // Default cursor for the Twitter API is -1
async function getGroupOfFollowers(cursor) {
await T.get('followers/ids', {
screen_name: targetAccount,
stringify_ids: true,
cursor: cursor,
count: 5000,
})
.then(async (res) => {
const followerIds = await res.data.ids
followerIds.map((id) => {
allFollowers.push(id)
})
// Paginate and get the next 5000 followers if the first page is full
if (followerIds.length === 5000) {
await getGroupOfFollowers(res.data.next_cursor)
}
})
.catch(async (err) => {
// This is expected to fail due to Twitter rate limiting, so we pause and try again
// This is why the queries are so long
console.error('Trying again in 15 mins.', err.twitterReply.errors[0].message)
// Pause for 15 mins
await new Promise((resolve) => setTimeout(resolve, 900000))
// Try again
await getGroupOfFollowers(cursor)
})
}
// It could take many hours to get to this point for large Twitter accounts
try {
await addProfiles(
allFollowers.map((id) => ({
id: id,
added: new Date(),
}))
)
console.log(`Added/updated ${allFollowers.length} profiles to the database`)
} catch (err) {
console.error("Error adding target accounts' followers to the database.", err)
// This is the "Error: Connection terminated unexpectedly"
}
return allFollowers
}
我想知道我的问题是否出在数据库启动选项中(同样,我使用所有默认设置,因为其他建议的答案不起作用),或者以其他方式保持连接。将不胜感激。