Приложение - генератор отчетов, по данным, полученным из MS SQL SERVER.
На клиенте создается ajax запрос к серверу. Сервер запускает sql-запрос к скулю, получает данные, сериализует в json и отправляет клиенту. Клиент на основе данных ответа генерит таблицу и выводит на страницу.
Столкнулся с тем, что слишком долго выполняется sql-запрос (около 4х минут).
Eсли я захожу на сайт через nginx, то через 2 минуты после отправки ajax'а, получаю алерт "Ошибка error: Bad Gateway", а если захожу на сайт через localhost: port, т.е. минуя nginx, то получаю алерт "Ошибка error: error".
одновременно с этим в консоль выводится запись:
GET /result?IP=10.10.10.7&CODE=12&START=02.12.2013&END= 02.12.2014 200 120618ms
статус 200!!!
время выполнения хоть и указано 2 минуты +- пара секунд, но реально sql-запрос еще продолжает работать. Это становится ясно потому что еще через пару минут в туже консоль ниже выводятся записи
console.log("SerializeToJSON");
и
console.log("SendClient");
из соответствующих функций. Но к этому времени, возникает ощущение, что обратная связь с клиентом через объект res уже потеряна и в результате res.end(jsonData); уходит в никуда.
у кого есть какие мысли на этот счет? не знаю куда еще копнуть и что проверить?
Если уменьшить время время выполнения sql-запроса и соответственно объем полученных данных, путем подбора аргументов запроса, то все работает.
Для открытия коннекта и выполнения запроса использую модуль odbc
в
документации ничего про таймауты на выполнения запроса не сказано.
Пробовал задать таймаут в строке коннекта вот так:
var Connect = "Driver={SQL Server};Server=" + ip + ";Database=MyDB;UID=sa;PWD=password;command timeout=600000;";
не помогло.
это код серверной части, обработчик ajax'а:
exports.result = function(req, res, curSessionId) {
var params = new Params(
req.param("IP"),
req.param("CODE"),
req.param("START"),
req.param("END")
);
GetData(res, params, function(data) {
SerializeToJSON(data, function(jsonData) {
SendClient(res, jsonData);
});
});
}
function GetData(res, params, callback) {
var i = 0;
var ip = params["p_IP"];
var code = params["p_CODE"];
var Start = params["p_START"];
var End = params["p_END"];
var tmpConnect = "Driver={SQL Server};Server=" + ip + ";Database=MyDB;UID=sa;PWD=password;command timeout=600000;";
odbc.open(tmpConnect, function(err, tmpDB) {
if (err) {
return console.log("Error!\n" + err.message);
}
var SQL = "SELECT * FROM [dbo].[ufn_getJornalRealizNew]('" + Start + "', '" + End + "', '" + code + "')";
tmpDB.query(SQL, function (err, rows, moreResultSets) {
if (err) {
return console.log("Error!\n" + err.message);
}
tmpDB.close();
callback(rows);
});
});
}
function SerializeToJSON(data, callback) {
var jsonData = JSON.stringify(data);
console.log(SerializeToJSON);
callback(jsonData);
}
function SendClient(res, jsonData) {
console.log(SendClient);
res.end(jsonData);
}
function Params(ip, code, Start, End) {
this.p_IP = ip;
this.p_CODE = code;
this.p_START = Start;
this.p_END = End;
}
а вот код ajax ф-и на клиенте:
function QueryItem(ip, code, Start, End) {
document.getElementById('btn').innerText = "Подождите...";
//alert(ip + "@" + code + "@" + kad + "@" + Start + "@" + End);
content = $.ajax({
url: '/result',
type: 'get',
timeout: 600000,
data: ({IP: ip, CODE: code, START: Start, END: End}),
success: function(msg) {
alert("Ответ от сервера получен!");
SetTable(msg);
document.getElementById('btn').innerText = "Сформировать"
},
error: onAjaxError
}).responseText;
return;
}
var onAjaxError = function(xhr, status){
//showLoading(false)
var errinfo = { errcode: status };
if (xhr.status != 200) {
// может быть статус 200, а ошибка
// из-за некорректного JSON
errinfo.message = xhr.statusText;
} else {
errinfo.message = 'Некорректные данные с сервера';
}
onLoadError(errinfo);
}
var onLoadError = function(error) {
var msg = "Ошибка "+error.errcode;
if (error.message) msg = msg + ' :'+error.message;
return alert(msg);
}
Сервер создан на основе модуля Express:
var express = require('express');
var app = express();
http.createServer(app).listen(config.get('port'), function(){
console.log('Express server of the REPORTS project listening on port ' + config.get('port'));
});
Может это node (или кто-то другой) закрывает соединение с клиентом через 2 минуты? Может какие-то таймауты в ноде надо указать?