Delphi - DataSet создает слишком много соединений в MySQL

У меня проблема с использованием компонента TFDDataSet в моем приложении.

У меня есть функция, которая извлекает много раз, если у клиента есть новые заказы. Если он возвращает пустое значение, функция завершается.

...
 fdm_XMLREsumo.Close;
       fdm_XMLREsumo.Active := false;
       _DataSetJSON := SM.GetXMLResumoChave( pEnt_ID, pChave); //See Edit 1
       _DataSet.Close;
       _DataSet := TFDJSONDataSetsReader.GetListValueByName( _DataSetJSON, sXMLResumo );
       _DataSet.Open; <-- here's the problem 
       if not _DataSet.IsEmpty then begin
        exit;
       end;
       fdm_XMLREsumo.AppendData( _DataSet );
      ...

Проблема в том, что каждый раз, когда он выполняется _DataSet.Open; это создает новое соединение в моей БД.
Из-за этого у меня too many connections исключение.

Я проверил в свойствах моего сервера, и это выглядит так:

Многие темы в состоянии сна

я пытался Connection.Close, _DataSet.Close, _DataSet.Free а также _DataSet.Destroy но ничего не получалось.
Я прочитал это, и это объясняет, что даже если вы делаете _DataSet.Close связь все еще существует, потому что DataSets работать в памяти.
Есть также этот парень, имеющий аналогичную проблему, но с использованием Query,
Кто-нибудь знает, как мне это решить?
Я использую MySQL

РЕДАКТИРОВАТЬ 1
Как @CraigYoung помог мне сказать, что мой пример нуждается в MCVE

SM.GetXMLResumoChave метод:


Здесь он использует соединение с базой данных, которое закрывается в конце функции. Уже отлажен, и здесь он не оставляет открытого соединения в MySQL Proccess List

function TDAOXMLResumo.GetXMLResumoChave(xEnt_id: Integer; xChave: String): TFDJSONDataSets;
begin
  if not oSM.FDConn.Connected then
    oSM.FDConn.Connected := true;
  QueryPesquisa.SQL.Clear;
  QueryPesquisa.SQL.Text :=
     ' select * from table' +
     ' where ent_id = :ent_id ' +
     '       and xre_chNFe = :xre_chNFe ';
  QueryPesquisa.ParamByName('ent_id').Asinteger   := xEnt_id;
  QueryPesquisa.ParamByName('xre_chNFe').Asstring := xChave;
  Result := TFDJSONDataSets.Create;
  //TFDJSONDataSetsWriter.ListAdd Opens the Query that is passed as parameter and store the data as JSON in the TFDJSONDataSets (Result) object
  TFDJSONDataSetsWriter.ListAdd(Result, sXMLResumo, QueryPesquisa);  
  //Closing the Query
  QueryPesquisa.Close;
  //Closing the Connection
  oSM.FDConn.Close;
end;`

В основном, _DataSet только получает список JSON здесь: _DataSet := TFDJSONDataSetsReader.GetListValueByName( _DataSetJSON, sXMLResumo );, а затем откройте его, чтобы получить доступ к данным в нем.

0 ответов

Другие вопросы по тегам