我是node,postgresql以及整个Web开发业务的新手。我目前正在编写一个简单的应用程序,它连接到postgres数据库并在Web视图中显示表的内容。该应用程序将托管在OpenShift中。
我的主要参赛作品在server.js
:
var pg = require('pg');
pg.connect(connection_string, function(err, client) {
// handle error
// save client: app.client = client;
});
现在,要处理GET /
请求:
function handle_request(req, res){
app.client.query('...', function(err, result){
if (err) throw err; // Will handle error later, crash for now
res.render( ... ); // Render the web view with the result
});
}
我的应用似乎有效:该表在Web视图中正确呈现,并且适用于多个连接(来自不同设备的不同Web客户端)。但是,如果没有几分钟的请求,则后续请求将使应用程序崩溃,并显示超时信息。这是堆栈信息:
/home/hai/myapp/server.js:98
if (err) throw err;
^
Error: This socket is closed.
at Socket._write (net.js:474:19)
at Socket.write (net.js:466:15)
at [object Object].query (/home/hai/myapp/node_modules/pg/lib/connection.js:109:15)
at [object Object].submit (/home/hai/myapp/node_modules/pg/lib/query.js:99:16)
at [object Object]._pulseQueryQueue (/home/hai/myapp/node_modules/pg/lib/client.js:166:24)
at [object Object].query (/home/hai/myapp/node_modules/pg/lib/client.js:193:8)
at /home/hai/myapp/server.js:97:17
at callbacks (/home/hai/myapp/node_modules/express/lib/router/index.js:160:37)
at param (/home/hai/myapp/node_modules/express/lib/router/index.js:134:11)
at pass (/home/hai/myapp/node_modules/express/lib/router/index.js:141:5)
有没有办法让连接超时(更好)?或按需重新连接(最好)?我试图通过不在开始时连接到数据库来重新设计我的应用程序,但是在GET /
请求时。此解决方案仅适用于第一个请求,然后在第二个请求中崩溃。任何见解都表示赞赏。
答案 0 :(得分:2)
您是否查看了postgres keepalive设置值?它发送数据包以保持空闲连接不会超时。 http://www.postgresql.org/docs/9.1/static/runtime-config-connection.html
我也发现了类似的问题: How to use tcp_keepalives settings in Postgresql?
您还可以按设定的时间间隔从数据库执行非常小的查询。但是,这种方法肯定更容易被黑客攻击。
编辑:你也可以尝试像这样启动客户端:
var client = new pg.Client(conString);
在进行查询之前,您可以检查客户端是否仍然连接。我相信你可以使用:
if(client.connection._events != null)
client.connect();
答案 1 :(得分:2)
面临同样的问题..告诉客户端在结束事件中关闭连接
query.on('end', function() {
client.end();
});
为我做了诀窍......
答案 2 :(得分:0)
您还可以将默认的空闲超时30秒更改为您需要的任何值。 E.g。
pg.defaults.poolIdleTimeout = 600000; // 10 mins