Задача в следующем: надо параллельно запустить выполнение запроса к базе данных на нескольких удаленных серверах, после того как каждый из запросов отрабатывает, в консоль выводятся данные.
делаю так:
var arr = [{ SERVER_IP: '10.9.1.1',
DB_NAME: 'DataBase1' },
{ SERVER_IP: '10.9.2.1',
DB_NAME: 'DataBase2' }];
async.each(arr, function(arrData, callback) {
//ф-я модуля async, получает на вход массив объектов
//и для каждого объекта вызывает function(arrData, callback)
var ServerIp = arrData["SERVER_IP"];
var DbName = arrData["DB_NAME"];
var tmpConn = "Driver={SQL Server};Server=" + ServerIp + ";Database=" + DbName + ";UID=log;PWD=pwd;";
//динамически формирую строку коннекта
//для каждого объекта массива
console.log(tmpConn);
srcDB.open(tmpConn, function (err) {
//ф-я модуля odbc, асинхронно открывает
//коннект для текущей строки соединения
console.log('connect to ' + tmpConn);
if (err) {
return console.log("Error!\n" + err);
}
var SQL = "SELECT @@SERVERNAME as [SrvName]";
srcDB.query(SQL, function (err, rows, moreResultSets) {
//ф-я модуля odbc, асинхронно выполняет запрос к базе
console.log('query to ' + tmpConn);
if (err) {
return console.log('Error!\n' + err);
}
console.log(rows);
});
});
callback;
}, callback);
в итоге в консоли имею следующее:
Код:
|
connect to Driver={SQL Server};Server=10.9.1.1;Database=DataBase1;UID=log;PWD=pwd;
connect to Driver={SQL Server};Server=10.9.2.1;Database=DataBase2;UID=log;PWD=pwd;
query to Driver={SQL Server};Server=10.9.1.1;Database=DataBase1;UID=log;PWD=pwd;
[ { 'SrvName': 'SERVER2' } ]
query to Driver={SQL Server};Server=10.9.2.1;Database=DataBase2;UID=log;PWD=pwd;
[ { 'SrvName': 'SERVER2' } ] |
SERVER2 - имя сервера, сидящего на 10.9.2.1
т.е. запрос отрабатывает 2 раза, но на сервере, параметры для подключения на который, хранятся в последнем объекте массива...
что здесь не так?
где я просчитался?
быть может все дело в асинхронном открытии коннекта и запроса к базе?
если я и так запускаю
function(arrData, callback)
параллельно, может тогда коннект и запрос уже синхронно выполнять надо?