Multithreading 无法删除连接定义';它具有关联的连接';

Multithreading 无法删除连接定义';它具有关联的连接';,multithreading,delphi,database-connection,firedac,delphi-10.2-tokyo,Multithreading,Delphi,Database Connection,Firedac,Delphi 10.2 Tokyo,我的代码有一个设计时TFDConnection。设置参数并打开它,然后我从中派生一个ConnectionDefinition以供以后(并发)使用: 与 打开设计时连接后,我使用TTTSQLScripts组件: lTTSQLScripts := TTTSQLScripts.Create(Application,ADataConnection); lTTSQLScripts.Scripts.Text := 'some SQL'; lTTSQLScripts.Execute; FreeAndNil(L

我的代码有一个设计时
TFDConnection
。设置参数并打开它,然后我从中派生一个ConnectionDefinition以供以后(并发)使用:

打开设计时连接后,我使用
TTTSQLScripts
组件:

lTTSQLScripts := TTTSQLScripts.Create(Application,ADataConnection);
lTTSQLScripts.Scripts.Text := 'some SQL';
lTTSQLScripts.Execute;
FreeAndNil(LTTSQLScripts);
问题

当我第二次设置设计时
TFDConnection
时,在运行上述代码之后,
FDManager.DeleteConnectionDef
调用会触发:

[FireDac][Stan][Def]-251无法定义[xxxPooled]。它有关联的连接

所以有东西在保持连接,但我看不出是什么

上述结构中是否有不正确或可疑的东西会导致这种情况?,
或者:当我尝试删除定义时,是否可以找到有关仍然“关联”的连接的任何信息?

传递的所有
a连接
变量均指我的设计时
tfd连接

新增:
我还尝试更改定义连接属性,但一旦TTTScripts运行,就会出现相同的错误:

var lDefCon: IFDStanConnectionDef;
lDefCon := FDManager.ConnectionDefs.ConnectionDefByName(cPooledName);
lDefCon.Params.Assign(lParams);
lDefCon.Apply;

在建立新连接之前关闭FDManager似乎是最简单的解决方案

很明显,这会起作用,因为池连接也会被删除


(这意味着我还没有找到问题的根源,但我需要继续使用生产代码;我愿意花在修补上的钱是有限的。因此,我不会将此答案标记为解决方案)。

我从未需要删除连接定义。要么在匹配时重用它,要么创建一个新的。我的理解是,池连接实例在未使用时会被保留,不会被销毁。因此,引用的连接定义也必须可用。我也不明白,为什么要从现有连接创建连接定义。为什么不首先创建连接def并在所有地方使用它呢?至于最后一个问题:历史和陌生。有一个旧的设计时TSDDatabase组件,我用TFDConnection替换了它。在转换现有应用程序时,您不希望一次打开太多应用程序(比如用并行TTask替换所有线程)。但我会考虑你的建议。
constructor TTTSQLScripts.Create(AOwner: TComponent; AConnection: TFDConnection);
begin
  inherited Create(AOwner);
  FConn := TFDConnection.Create(nil);
  // Pick up the pooled connection definition for concurrency:
  FConn.ConnectionDefName := AConnection.ConnectionName + 'Pooled';
  FConn.ResourceOptions.ParamExpand := false; 
  FScripts := TStringList.Create;
end;

destructor TTTSQLScripts.Destroy;
begin
  FConn.Close;
  FreeAndNil(FScripts);
  FreeAndNil(FConn);
  inherited;
end;

function TTTSQLScripts.Execute: Boolean;
begin
   try
      FConn.ExecSQL(FScript);
      Result := true;
   except
      Result := false;
   end;
end;
lTTSQLScripts := TTTSQLScripts.Create(Application,ADataConnection);
lTTSQLScripts.Scripts.Text := 'some SQL';
lTTSQLScripts.Execute;
FreeAndNil(LTTSQLScripts);
var lDefCon: IFDStanConnectionDef;
lDefCon := FDManager.ConnectionDefs.ConnectionDefByName(cPooledName);
lDefCon.Params.Assign(lParams);
lDefCon.Apply;