连接到postgresclosures'此套接字已closures'的错误消息

我正在向node.js 0.6.12迁移,现在在使用pg模块(版本0.6.14)时得到以下错误信息:

Error: This socket is closed. at Socket._write (net.js:453:28) at Socket.write (net.js:446:15) at [object Object]._send (/home/luc/node_modules/pg/lib/connection.js:102:24) at [object Object].flush (/home/luc/node_modules/pg/lib/connection.js:192:8) at [object Object].getRows (/home/luc/node_modules/pg/lib/query.js:112:14) at [object Object].prepare (/home/luc/node_modules/pg/lib/query.js:150:8) at [object Object].submit (/home/luc/node_modules/pg/lib/query.js:97:10) at [object Object]._pulseQueryQueue (/home/luc/node_modules/pg/lib/client.js:166:24) at [object Object].query (/home/luc/node_modules/pg/lib/client.js:193:8) at /home/luc/test/routes/user.js:23:29 

我的代码中显示的行是:

 var get_obj = client.query("SELECT id FROM users WHERE name = $1", [name]); 

这个使用与节点0.4.8和gp 0.5.0正常工作,但现在不工作了,现在我正在testing迁移。

我看到网上有这样的错误,但没有答案。

UPDATE

这似乎与我处理我的postgres连接的方式有关。 今天,我运行应用程序时创build一个单一的连接。 我认为每个请求创build一个新的连接会更好。 在快速中间件中创build连接是否是最好的解决scheme?

通常,框架和中间件保持连接打开(或:连接池)。 问题最可能在于你的node.js代码(或用法)。 顺便说一句:如果你有权访问postgres的日志文件,你可能会看到从node.js显式断开连接。 (log_connections和log_disconnections都应该设置为True才能看到这个)

连接+断开连接被认为是一个昂贵的操作(TCPstream量,授权,派生工作进程(对于postgres),会话设置,日志logging,(会计?))。 但是,如果它适合你(或者你只有一个请求+会话回复)没关系。

成本/资源使用估计

对于会话设置:

  • TCP / IP连接设置:2 * 2 IP数据包:= 4 *往返延迟
  • login密码:
    • 2 * 2 TCP阅读:= 4 *往返延迟
    • 4个系统的R / W电话
    • 一些数据库查询/查询用户授权,(说10 … 100磁盘读取;大多caching)
    • 会话build设:= fork(for postgres)+许多正在克隆的COW页面(?100-1000页面错误?)
  • 会话初始化:=几次往返

为查询:

  • 发送+接收查询:=几个TCP / IP往返
  • parsing:=几个(1 … 100)目录查找(大部分来自磁盘caching)
  • 执行:= xxx磁盘读取(可能来自caching)
  • 获取和存储结果:=分配(脏)缓冲区
  • 发送结果:= xxx TCP往返
  • 丢弃结果缓冲区:=(几乎免费!)

会话拆解:

  • 3 * 2 IP往返
  • 父进程的wait()(对不起,我想用unix方式;-)
  • 1个套接字描述符在TIME_WAIT状态几秒/分钟

正如你所看到的,花费在连接build立上的资源量是10,也许是典型查询+结果花费的100倍; 如果你有多个查询来执行,保持连接是明智的。 (或保持一个开放的连接池)

为了简单起见,我忽略了CPU消耗,主要忽略了内存/缓冲区的使用。 现在,CPU几乎是免费的。 在等待磁盘(10毫秒)或networking(x毫秒)时可以完成的计算量是不可思议的:每个字节有几个(100 … 10K?)滴答。