使用不可用主机阻止Delphi FireDac应用程序

时间:2016-08-18 13:28:22

标签: delphi firebird firedac

资料来源:Delphi XE10; Os:W10;数据库服务器:FB 2_5_1;

我创建了客户端应用程序来连接多个数据库。我的应用程序创建了TSource->创建TThread - >使用FDConnection创建DataModule。 每个TSource都有自己的TThread,它有自己的DataModule;

要测试我有两个定义:HostLocal和HostRemote; 我的测试: a)运行:Host.Remote的Connection.Open; b)下一次运行:Connection.Open for HostLocal;

当HostRemote不可用时,HostLocal等待我不知道是什么。  为什么不可用的连接阻止了另一个正确的连接?

编辑: 数据库服务器已更新为3.0.0

代码:

    begin
      Application.Initialize;
      Application.CreateForm(TFormMain, FormMain);
      Application.Run;
    end.

单位UnitFormMain;

    procedure TFormMain.FormCreate(Sender: TObject);
    begin
      Source0 := TFormSource.Create(Self);
      Source1 := TFormSource.Create(Self);
    end;

    procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      FreeAndNil( Source0 );
      FreeAndNil( Source1 );
    end;

    procedure TFormMain.Button1Click(Sender: TObject);
    begin
      Source0.Show;
      Source1.Show;

      Source0.ThStart( 0 );
      Source1.ThStart( 1 );
    end;

单位UnitFormSource;

    TFormSource = class(TForm)
        Memo: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        th: TMyThread;
      public
        procedure ThStart( value: Integer );
        procedure MyTerminate( Sender: TObject );
      end;
    ...
    procedure TFormSource.FormCreate(Sender: TObject);
    begin
      th := TMyThread.Create( TRUE );
      th.OnTerminate := MyTerminate;
      th.Priority := TThreadPriority.tpLower;
      th.FreeOnTerminate := TRUE;
    end;

    procedure TFormSource.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      FreeAndNil( th );
      Action := TCloseAction.caFree;
    end;

    procedure TFormSource.ThStart(value: Integer);
    begin
      th.SetSwitch( value );
      th.Resume;
      Memo.Lines.Add( TimeToStr(Now) + ' Start' );
    end;

    procedure TFormSource.MyTerminate(Sender: TObject);
    begin
      Memo.Lines.Add( TimeToStr(Now) + ' Terminate' );
    end;

单位UnitThread;

    TMyThread = class(TThread)
      private
        Switch: Integer;
        dm: TDMFireBird;
      protected
        procedure Execute; override;
      public
        constructor Create(CreateSuspended: Boolean);
        destructor Destroy; override;
        procedure SetSwitch(value: Integer);
      end;
    ...
    constructor TMyThread.Create(CreateSuspended: Boolean);
      begin
        inherited Create(CreateSuspended);
        dm := TDMFireBird.Create(nil);
        Switch := -1;
      end;

      destructor TMyThread.Destroy;
      begin
        FreeAndNil(dm);
        inherited;
      end;

      procedure TMyThread.Execute;
      begin
        with dm.FDConnection.Params do
        begin
          Clear;
          Add('DriverID=FB');
        end;

        case Switch of
          0:
            with dm.FDConnection.Params do
              Add('Protocol=Local');
          1:
            with dm.FDConnection.Params do
            begin
              Add('Protocol=TCPIP');
              Add('Server=10.0.0.1'); // unavailable connection - server not exist
              Add('Port=3050');
            end;
        end;
        with dm.FDConnection.Params do
        begin
          Add('Database=D:\temp\test.fdb');
          Add('User_Name=SYSDBA');
          Add('Password=masterkey');
        end;

        try
          dm.FDConnection.Open;
        except
          // to-do: update error message
        end;
      end;

      procedure TMyThread.SetSwitch(value: Integer);
      begin
        Switch := value;
      end;

单位UnitDMFireBird;

      TDMFireBird = class(TDataModule)
          FDConnection: TFDConnection;
          FDTransaction: TFDTransaction;
        private
          { Private declarations }
        public
          { Public declarations }
        end;

测试1号 代码:

    Source0.ThStart( 0 );
    // Source1.ThStart( 1 );

Source0的结果:

    14:46:20 Start
    14:46:20 Terminate

Source1的结果:无结果

评论:同时打开第一个连接;

测试2号 代码:

    Source0.ThStart( 0 );
    Source1.ThStart( 1 );

Source0的结果:

    14:48:16 Start
    14:48:40 Terminate

Source1的结果:

    14:48:16 Start
    14:48:40 Terminate

评论:同时终止两者。

我的问题。为什么一个阻止另一个为什么(对于测试2)首先正确连接等待第二次不可用的连接?在测试2号中,第一个连接应该像测试1中那样打开 - >快,没等。

0 个答案:

没有答案