Длительный опрос: достигнут максимальный размер пула - PullRequest
1 голос
/ 03 марта 2020

Я использую длинный опрос на своем веб-сайте, чтобы проверить наличие новых данных в базе данных 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

Так что мне было интересно, что я что-то не так, и как я мог бы решить эту проблему, используя длинный опрос ...

К веб-сайту будет подключено множество пользователей со своей учетной записью, и они будут иметь доступ к своим собственным базам данных.

...