Я использую длинный опрос на своем веб-сайте, чтобы проверить наличие новых данных в базе данных MySQL, а затем обновляю пользовательский интерфейс, фактически, если веб-сайт работает дольше, чем + - один час, когда веб-сайт просто сломался, дав следующая ошибка:
500 {"Message":"error connecting: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.","StackTrace":" at MySql.Data.MySqlClient.MySqlPool.GetConnection()\r\n at MySql.Data.MySqlClient.MySqlConnection.Open()\r\n at VisualReservation._Default.getSale() in C:\\Users\\imytyuk\\Documents\\Visual Studio 2017\\Projects\\VisualReservation\\VisualReservation\\Default.aspx.vb:line 109","ExceptionType":"MySql.Data.MySqlClient.MySqlException"}
Таким образом, кажется, что слишком много подключений к базе данных, и она просто разрывается. На самом деле ошибка вызывается следующим методом, который вызывается из длинного опроса
function getTavoli(data_tavoli, salaSelect, pooling) {
$.ajax({
type: "POST",
url: "Default.aspx/SetTavoli",
data: JSON.stringify({ data: moment(data_tavoli).format('YYYY-MM-DD') }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (r) {
var ingiorno = $('#ingiorno').val();
var fngiorno = $('#fngiorno').val();
var insera = $('#insera').val();
var fnsera = $('#fnsera').val();
ingiorno = ingiorno.split(":")[0];
fngiorno = fngiorno.split(":")[0];
insera = insera.split(":")[0];
fnsera = fnsera.split(":")[0];
if ($('#titleTurni').attr('data-turno') == "giorno") {
Range = ingiorno * 4
Fine = (fngiorno * 4) + 1;
orainizio = ingiorno;
orafine = fngiorno;
} else {
Range = insera * 4
Fine = (fnsera * 4) + 1;
orainizio = insera;
orafine = fnsera;
}
data = r.d;
data = $.parseJSON(data);
if (pooling) {
if (JSON.stringify(data) === prevData) {
return;
} else {
recreateTabs();
prevData = JSON.stringify(data);
}
}
$('#listBodyMobile').empty();
$('#bodyGiorno').empty();
$('#bodySera').empty();
getInfo(data_tavoli);
$.each(data, function (i, item) {
// doing all stuff with items
});
});
},
error: function (xhr, status, errorThrow) {
console.log(xhr.status + " " + xhr.responseText);
}
});
}
Опрос вызывается следующим образом
poolingTav = setInterval(() => {
getTavoli(new Date($("#day").attr('data-giorno')), $("#titleSale").attr('data-numsala'), true);
}, 50000)
В то время как SetTavoli на стороне сервера выглядит следующим образом
<WebMethod()>
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)>
Public Shared Function SetTavoli(ByVal data As String) As String
Dim con As MySqlConnection = New MySqlConnection
con.ConnectionString = "CONNSTRING"
DeleteSTB(con)
Dim strSql As String = "QUERY"
Dim dtb As New DataTable
con.Open()
Dim sqlCmd As New MySqlCommand(strSql, con)
Dim sqlDad As New MySqlDataAdapter(sqlCmd)
sqlDad.Fill(dtb)
con.Dispose()
dtb.Columns(0).ColumnName = "data"
dtb.Columns(1).ColumnName = "orain"
dtb.Columns(2).ColumnName = "oraout"
dtb.Columns(3).ColumnName = "numtav"
dtb.Columns(4).ColumnName = "numcop"
dtb.Columns(5).ColumnName = "email"
dtb.Columns(6).ColumnName = "tel"
dtb.Columns(7).ColumnName = "note"
dtb.Columns(8).ColumnName = "nome"
dtb.Columns(9).ColumnName = "id"
dtb.Columns(10).ColumnName = "stato"
Return Json(dtb)
End Function
Так что мне было интересно, что я что-то не так, и как я мог бы решить эту проблему, используя длинный опрос ...
К веб-сайту будет подключено множество пользователей со своей учетной записью, и они будут иметь доступ к своим собственным базам данных.