2012-08-13 14 views
7

私はvclフォームクライアントを持つdatasnapサーバを持っています。クライアントから、サーバがシャットダウンを知らせて、既存のクライアント接続で再起動した場合、どうすれば対処できますか?このシナリオでは、10053 EIdSocketError例外が発生します。DatasnapとSocketError

複製するには、サーバーとクライアントの両方を起動し、サーバーへの呼び出しを行います(私はDataSnapプロキシジェネレータを介して公開されたメソッドを使用します)。その後、サーバーをシャットダウンし(アプリケーションを閉じるなど)、再起動します。私は再びサーバーへの呼び出しを試みます。

例: dspPolicyGroupがTDataSetProviderで、cdsPolicyGroupがTClientDataSetのある

sm := TsvrPolicySearchClient.Create(datClientDB.SQLConnection1.DBXConnection); 
    try 
     ds := sm.SearchPolicyByPolicy(40, WCRef, '', 3); 
     dspPolicyGroup.DataSet := ds; 

     if cdsPolicyGroup.Active then 
     cdsPolicyGroup.Refresh 
     else 
     cdsPolicyGroup.Open; 

    finally 
     sm.Free; 
    end; 

CLIENTコール(私はローカルに "店舗" 私のTDataSetの結果を、それを使用)。

サーバ

function TsvrPolicySearch.SearchPolicyByPolicy(AClientId: Integer; WCRefNum, ClientRef: string; SearchMethod: Integer): TDataSet; 
begin 
    spPolicyByWCRef.Close; 
    spPolicyByWCRef.ParamByName('p_client').AsInteger := AClientId; 
    spPolicyByWCRef.ParamByName('p_search_method').AsInteger := SearchMethod; 
    spPolicyByWCRef.ParamByName('p_wc_refno').AsString := WCRefNum; 
    spPolicyByWCRef.Open; 
    Result := spPolicyByWCRef; 
end; 

私は、これは定期的にそれを複製することは非常に簡単だということを見て人が遭遇されると思うだろう。私はEIdSocketError(と等価)とハンドルをチェックするために各呼び出しの前に "Test Connection"コールか何か(TestConnectionメソッドなど)を配置する必要がありますか?または、おそらくそれはより多くの設計上の欠陥ですか?

おかげ

答えて

1

この問題の最も簡単な回避策は、呼び出しへのTDSServerClassライフサイクル属性を変更することです。 これにより、ステートレスサーバーが作成され、サーバーは要求ごとに新しいセッションを作成します。しかし、クライアント接続を中断することなく、サーバーを閉じて再接続することができます。

2

私のシナリオ:

  • クライアントアプリケーションのDataSnapサーバー(TCP/IP、リモートサーバー)に接続する
  • クライアント要求(DataSnapサーバーのメソッドを使用して)データセット。私は、クライアント上で

    • :データセット
    • サーバのシャットダウン(taskkill、近いアプリケーションがない事項)
    • クライアント要求のDataSet againt(ehhrrrソケットエラー)

    ソリューションをダウンロードしTClientDataSetの

  • クライアント例外をキャッチする(AppEvents.OnException)
  • DataSnapサーバーへの接続でソケットエラーであることを認識しました
  • 接続が失われたという情報を含むダイアログウィンドウを表示します。ユーザーは、「RETRY」をクリックすることができます - アプリケーションのキャッチ例外プロセス全体が最初から動作するかどうかもしそうなら、
    • 無料と再作成のDataSnapクライアントモジュールと接続
    • を初期化することは、要求データセット(接続テストのための特別なデータセット)にしてください。

この操作の後、私のクライアントのDataSnapサーバーへの再接続し、新しいTCP/IP接続を使用してデータセットを要求することができます。もちろん、ユーザーはダイアログを閉じることができますが、アプリケーションはオフになります。

これはあなたを助けることができると思います。私は他の多くのソリューションを試しましたが、これが最善の結果でした。さらに、アルゴリズムは、クライアントの障害による接続の喪失をサポートします。

関連する問題