【问题标题】:Node.js closing database connectionsNode.js 关闭数据库连接
【发布时间】:2013-06-12 17:00:43
【问题描述】:

我继承了一些我显然不知道它是如何工作的 node.js 代码。我遇到的问题是它正在打开数据库连接而不是关闭或重用它们。所以在某些时候我必须终止节点进程以释放连接,否则数据库将开始抱怨。我尝试自己关闭连接,但不能理解基于事件的逻辑,因为我要么在第二个查询运行之前关闭连接,要么根本不运行。我在 Ubuntu 12.04.2 LTS 上使用节点 0.6.12 和节点 mysql 模块 v0.9.6。下面是一个示例模型方法。

this.search = function(options, callback) {
    if (options.post) {
        var query;
        var param;
        var limit;
        var results_per_page = 10;
        var page = (options.post.hasOwnProperty('page') && parseInt(options.post.page)) ? options.post.page : 1;

        limit = ' LIMIT ' + ((page-1)*(results_per_page)) + ',' + results_per_page;
        if (options.post.term) {
                var escaped_term = options.database_client.escape('%' + options.post.term + '%');
                query = "Q" + limit;
        } else {
                query = "Q" + limit;

        }
        options.database_client.query(query, [], query_results);
        // Tried closing DB connection here
        function query_results(err, results, fields) {
            var all_results = {};
            all_results.total_results = 0;
            all_results.total_pages = 0;
            all_results.current_page = page;
            all_results.results = [];

            if (err) {
                console.log('You have an error: ' + err);
                throw err;
            } else {
                if(!results[0]) {
                    callback(undefined, all_results);
                    return;
                } else{
                    options.database_client.query("SELECT found_rows() AS total", [], function(err, results2, fields) {
                        if (err) {
                            console.log('You have an error: ' + err);
                            throw err;
                        } else {
                            if (!results2[0]) {
                                callback(undefined, all_results);
                                return;
                            } else {
                                var all_results = {};
                                all_results.total_results = results2[0].total;
                                all_results.total_pages = Math.ceil(all_results.total_results/results_per_page);
                                all_results.current_page = page;

                                for(var property in results) {
                                    if(results.hasOwnProperty(property)){
                                        if(results[property] == "" || results[property] == " "){
                                            results[property] = null;
                                        }
                                    }
                                }
                                all_results.results = results;

                            }
                            callback(undefined, all_results);
                            return;
                        }

                    }); // end query
                }
            }
            // I think here is only closing one connection
            options.database_client.end();
        }
    // Also tried here but total_pages, total_results end up being 0 in the results callback
    }
};

我正在使用options.database_client.end(); 根据 node.js mysql 模块文档关闭数据库连接。任何帮助将不胜感激。

【问题讨论】:

    标签: database node.js node-mysql


    【解决方案1】:

    实际上你正在这样做 1.查询并调用query_results,当结果准备好时 2. 使用匿名函数再次查询(找到的行) 3. 结束数据库连接

    但是,这样做有一个问题:end 在 anon 之前被调用。我认为 found_rows 结果的函数。

    我认为您在该代码中有几点,应该调用 options.database_client.end() 1. 抛出错误时(2处) 2.“回调(未定义,all_results);”之间和“返回;” (也有2个地方)

    或者更好:关闭数据库,在第一行的回调之后从这个方法外部调用,甚至更好:在外部请求结束时

    【讨论】:

      猜你喜欢
      • 2019-03-14
      • 1970-01-01
      • 2011-10-19
      • 2013-10-16
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 2017-07-18
      相关资源
      最近更新 更多