我应该在什么时候关闭数据库连接?
首先向到来的各位表示感谢!
我的程序大概是这样子的,我现在应该在哪里db.end()呢:
var mysql = require('mysql');
var db = mysql.createClient();
fn1();
fn2();
function fn1(){
db.query('select * fro table1', function(error, rows){
rows.forEach(function(row){
db.query('update table set field=? where id=?', [value, row.id]);
});
});
}
function fn2(){
db.query('select * from table2', function(error, rows){
rows.forEach(function(row){
db.query('update table2 set field=? where id=?', [value, row.id]);
});
});
}
17 回复
你要把fn1、fn2也写成异步的形式。
能具体点不
@liuj0225 异步之后,怎么关闭数据库连接呢?需要关闭吗?
@dtrex 需要,我这个是一个脚本,在putty中node deamon.js,如果不db.end()脚本执行完成进程不退出
异步编程之痛~
用连接池或者其他数据库连接插件不就能实现用的时候开,不用的时候关了么?
真是好悲剧啊,看这个问题就想哭,没啥好办法就用wind.js吧~
@liuj0225 这个确实比较麻烦,那你每次执行要连接数据库,然后进行完查询,关闭数据怎么样?
我觉得你这样写sql 是有问题的,你为什么不写一个查询,然后执行完之后关闭
上面这个是我写的简单想表达是这个意思,实际业务比这个要复杂,必须要这样做的
@liuj0225 这样的话可以在fn1 fn2加一个callback告诉这个查询完成 再进行相应的处理
设置一个标志,在多个回调中检测标志后再判断是否关闭
//函数改成支持回调的方式
var f1 = function (callback) {
setTimeout(function () {
console.log('1')
callback()
},1000)
}
var f2 = function (callback) {
setTimeout(function () {
console.log('2')
callback()
},1000)
}
//用一个类 管理函数队列
//一个简单的实现 有个叫Async的库就是干这个的
function Async (fns) {
this._fns = fns
}
Async.prototype.next = function() {
if(fn = this._fns.shift()){
fn (this.next.bind(this))
}else{
console.log('搞完了')
}
};
async = new Async([f1,f2])
async.next()
用wind.js吧,还是用传统思想去写程序吧
最近一直在用Async,蛮好用的
多谢,帮我解决了问题
确实不错