我创建了一个http服务端,在接收请求函数中查找数据库里面的数据,将数据传回给客户端,当另外一个请求来临时,他要等到前面那个请求查找完数据返回客户端后,才能执行。如何解决该问题,是否要创建子进程去处理数据查询。
9 回复
用oracle,数据库的数据是亿级的,异步了也没用,还是要等待数据返回给客户端,另外一个请求才能获得请求,就像我们在http响应函数里面,计算一个长时间的计算一样。有什么好的办法吗,用child_process的话,几个请求就把CPU的用光了
如楼上童鞋所言,楼主的问题在于数据库优化这块。
- 用node.js哪个oracle客户端,请明确写出来。如果路过的童鞋有相关使用经验,就能提出一些更具体的建议,不是吗。
- 首先请确认sql查询语句的执行效率,在pl/sql developer之类的oracle客户端跑一次sql语句。如果比较耗时,下面该干什么就不必说了。
- 开个网络抓包/监视工具之类,在http请求的过程中,监视与oracle数据库的连接数有多少,如果自始至终只有1,那么就如说过的,增加连接数。为什么一直强调连接数?因为连接数只有1的情况下,确实有可能阻塞。有数据库的地方,就有必要使用连接池来控制连接数。
另外,建议把sql查询、发起查询的伪代码(去掉业务逻辑!)贴出来。所谓旁观者清,当局者迷。
var oracle = require(‘oracle_bindings.node’); var oracleOperator = new oracle.OracleClient();
module.exports = function(app){ app.get('/locate’,function(req,res){ try{
console.log('begin');
var sql = 'select * from xx';
oracleOperator.connect('xx','xx','xx',function(error,conn){
if(error){
}
else{ //查询在PLSQL也要4 秒多
conn.query(sql,function(err,result){
for(var i=0; i < result.length;i++){
console.log(result[i]);
}
res.send('locate');
});
}
});
}catch(e){
console.log(e);
}finally{
}
});
}
- pl/sql中执行查询需时4s+,考虑在相关的检索字段上设置索引吧,不过这与本帖的问题主旨无关。
- nodejs连接oracle的客户端模块,看来楼主是自家开发的(访问oracle的nodejs插件,目前支持windows)。结合给出的代码片段-conn没有close,就是说conn由底层的c++来维护,那么这个conn能建立多少个呢。如果只支持单连接,请考虑改进此oracle模块,支持多连接吧。单一连接同一时间只能执行一个查询,要并行执行2个查询,就得建立2个数据库连接。这也就是为什么child_process就能同时执行n个查询,因为oracle客户端模块实例化n个,可用的数据库连接也有n个。 另外conn执行查询的部分,估计也是同步执行的,在查询结束前,程序流程被卡住了?
- 换用其他oracle模块nearinfinity/node-oracle / mariano/node-db-oracle。做个对比,对自家模块的开发也是有好处的,闭门造车不可取。