2013-06-12 3 views
0

Я унаследовал некоторый код node.js, который, я точно не знаю, как это работает. Проблема заключается в том, что это открытие соединений с базой данных, а не закрытие или повторное использование. Поэтому в какой-то момент я должен убить процесс узла, чтобы освободить соединения, или база данных начнет жаловаться. Я попытался закрыть соединения самостоятельно, но не должен понимать логику, основанную на событиях, так как я либо заканчиваю закрытие соединения до того, как второй запрос может быть запущен, либо вообще нет. Я использую узел 0.6.12 на Ubuntu 12.04.2 LTS с узлом mysql module v0.9.6. Ниже приведен пример модельного метода.Node.js закрытия соединений с базой данных

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 модулей. Любая помощь будет принята с благодарностью.

ответ

0

на самом деле вы делаете это 1. запросов и вызовов query_results, когда результаты будут готовы 2. запрос снова (найдено строк) с anoymous функции 3. Завершение соединения дб

но, Theres один проблема с этим: конец называется, перед аноном. я думаю, функция для результата found_rows.

я думаю, что у вас есть несколько моментов в этом коде, который должен назвать options.database_client.end() 1. при бросании ошибки (2 места) 2. между «обратным вызовом (неопределенный, all_results);» и вернуться;" (2 места тоже)

или лучше: закройте db, после того, как обратный вызов в первой строке вызван извне этого метода или даже лучше: в конце запроса со стороны