我有一个基于此模板的小型业余网络应用程序:https://github.com/tomsoderlund/nextjs-pwa-graphql-sql-boilerplate
它使用ElephantSQL的免费层(5个连接),在Zeit Now v2无服务器功能上运行-并用完Postgres连接(“ 角色“ djsktctf” ”连接过多)。
我正在使用death
NPM来关闭连接-这是在/api/graphql/index.js
中:
const { ApolloServer, gql } = require('apollo-server-micro')
const { config } = require('../../config/config')
// Postgres (pg)
const { Pool } = require('pg')
const onProcessDeath = require('death')
const pool = new Pool({ connectionString: config.databaseUrl })
let client
const initDatabaseClient = async () => {
if (!client) client = await pool.connect()
}
initDatabaseClient()
onProcessDeath((signal, err) => {
client && client.release()
})
const typeDefs = gql`
${require('../../graphql/font/schema')}
`
const resolvers = {
...require('../../graphql/font/resolvers')(pool)
}
const server = new ApolloServer({
typeDefs,
resolvers,
introspection: true,
playground: true
})
module.exports = server.createHandler({ path: config.graphqlPath })
然后在resolvers
内看起来像这样:
module.exports = (pool) => ({
Query: {
async articles (parent, variables, context, info) {
const sqlString = `SELECT * FROM article LIMIT 100;`
const { rows } = await pool.query(sqlString)
return rows
}
}
如何改进此功能以避免连接耗尽?
在获得以下答案后,我使用client.end()
更新了代码,而不是使用共享客户端:
// const results = await runDatabaseFunction(async (pool) => { ... })
const runDatabaseFunction = async function (functionToRun) {
// Connect db
const client = await pool.connect()
// Run function
const results = await functionToRun(client)
// Release db
await client.end()
await client.release()
return results
}
答案 0 :(得分:2)
我认为这个问题来自
client = await pool.connect()
似乎保留了您的数据库。因此,您需要断开与数据库之间的连接。
如果您在最后一次数据提取后添加了await client.end()
,则错误可能会消失。
就我而言,这种方式解决了问题。