Postgresql 与postgres的连接使用';此插座已关闭';错误消息
我正在向node.js 0.6.12迁移,现在在使用pg模块(版本0.6.14)时收到以下错误消息: 我的代码中显示的行是:Postgresql 与postgres的连接使用';此插座已关闭';错误消息,postgresql,node.js,express,node-postgres,Postgresql,Node.js,Express,Node Postgres,我正在向node.js 0.6.12迁移,现在在使用pg模块(版本0.6.14)时收到以下错误消息: 我的代码中显示的行是: var get_obj = client.query("SELECT id FROM users WHERE name = $1", [name]); 这种用法在节点0.4.8和gp 0.5.0中可以正常使用,但现在我正在测试迁移 我在网上看到了几个类似这样的错误,但没有回答 更新 这似乎与我处理postgres连接的方式有关。今天,我在运行应用程序时创建了一个连接。我
var get_obj = client.query("SELECT id FROM users WHERE name = $1", [name]);
这种用法在节点0.4.8和gp 0.5.0中可以正常使用,但现在我正在测试迁移
我在网上看到了几个类似这样的错误,但没有回答
更新
这似乎与我处理postgres连接的方式有关。今天,我在运行应用程序时创建了一个连接。我认为在每个请求上创建一个新连接会更好。在express中间件中创建连接是最好的解决方案吗 通常,框架和中间件保持连接打开(或:连接池)。问题很可能在于node.js代码(或用法)。顺便说一句:如果您可以访问postgres的日志文件,您可能会看到node.js显式断开连接。(log_connections和log_disconnections都应设置为True以查看此信息)
连接+断开连接被认为是一项昂贵的操作(TCP流量、授权、分支工作进程(对于postgres)、会话设置、日志记录(记帐?)。但是,如果它对您有效(或者您只有一个会话请求+回复),那么就可以了 成本/资源使用估算: 对于会话设置:
- TCP/IP连接设置:2*2个IP数据包:=4*往返延迟
- 登录/密码:
- 2*2 TCP读写:=4*往返延迟
- 4个系统R/W呼叫
- 为用户授权进行一些数据库查询/查找(例如10…100次磁盘读取;大部分是缓存的)
- 会话构造:=fork(用于postgres)+大量正在克隆的COW页面(?100-1000页错误?)
- 会话初始化:=几次往返
- 发送+接收查询:=几个TCP/IP往返
- 解析:=几个(1…100)目录查找(主要来自磁盘缓存)
- 执行:=xxx磁盘读取(可能来自缓存)
- 获取和存储结果:=分配(脏)缓冲区
- 发送结果:=xxx TCP往返
- 放弃结果缓冲区:=(几乎免费!)
- 3*2 IP往返
- 子进程的exit(),父进程的wait()(对不起,我认为是unix术语;-)
- 1个套接字描述符处于时间\等待状态数秒/分钟
为了简单起见,我忽略了CPU消耗,主要是忽略了内存/缓冲区的使用。如今,CPU几乎是免费的;在等待磁盘(10毫秒)或网络(x毫秒)时可以完成的计算量令人难以置信:每个字节有几个(100…10K?)滴答声。通常,框架和中间件保持连接打开(或:连接池)。问题很可能在于node.js代码(或用法)。顺便说一句:如果您可以访问postgres的日志文件,您可能会看到node.js显式断开连接。(log_connections和log_disconnections都应该设置为True才能看到这一点)@wildplasser,在expressjs中,我创建了一个中间件,为每个请求打开一个新连接。不确定这是不是最好的方法,但它解决了问题。然后我会检查一下连接池。连接+断开连接被认为是一项昂贵的操作(TCP流量、授权、分支工作进程(对于postgres)、会话设置、日志记录(记帐?)。但是如果它对你有效(或者你只有一个请求+会话回复),那就没关系了。@wildplasser,是的,我每个会话只有一个请求。谢谢你的建议。你能回答一下你的评论吗?我也回答了。为您服务…非常详细,谢谢。我对每个http请求使用一个db连接,如果处理请求需要对db进行多次调用,则保持相同的db连接。不过,这真的很好用。谢谢。
var get_obj = client.query("SELECT id FROM users WHERE name = $1", [name]);