Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 与postgres的连接使用';此插座已关闭';错误消息_Postgresql_Node.js_Express_Node Postgres - Fatal编程技术网

Postgresql 与postgres的连接使用';此插座已关闭';错误消息

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连接的方式有关。今天,我在运行应用程序时创建了一个连接。我

我正在向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连接的方式有关。今天,我在运行应用程序时创建了一个连接。我认为在每个请求上创建一个新连接会更好。在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个套接字描述符处于时间\等待状态数秒/分钟
如您所见,用于建立连接的资源量是10,可能是典型查询+结果成本的100倍;如果要执行多个查询,最好保持连接打开。(或维护一组打开的连接)


为了简单起见,我忽略了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]);