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 );
, а затем откройте его, чтобы получить доступ к данным в нем.