我应该在什么时候关闭数据库连接?
发布于 2年前 作者 liuj0225 1584 次浏览

首先向到来的各位表示感谢!

我的程序大概是这样子的,我现在应该在哪里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,蛮好用的

多谢,帮我解决了问题

回到顶部