20
エンバカデロ・テクノロジーズ エヴァンジェリスト 高橋智宏 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 DataSnapユースケース研究」 多層技術の概要と最適化、実践テクニック B4Delphi/C++テクニカルセッション

B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

エンバカデロ・テクノロジーズ エヴァンジェリスト 高橋智宏

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

「DataSnapユースケース研究」 多層技術の概要と最適化、実践テクニック

【B4】Delphi/C++テクニカルセッション

Page 2: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

アジェンダ • DataSnapの基礎

– プロトコル – サーバーメソッド

• 現実的な構成例 – DMZ + ロードバランス – ライフサイクル

• DB接続のレイヤ – 親クラス – FireDAC

• デモ – マルチデバイス対応

• Tips – HTTPSを利用するには? – バイナリデータの送受信 – サーバーメソッドの非同期呼び出しは?

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 2

Page 3: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

DataSnapの基礎

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 3

1

Page 4: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

DataSnapとは?

4

• 2層のC/S

• 3層構造

GUIアプリ RDBMS

GUIアプリ DataSnapサーバ RDBMS

ドライバ

DB

アクセス

DataSnap DataSnap プロトコル

DB

アクセス

ドライバ

GUI, 業務ロジック SQL文 etc…

業務ロジック SQL文 etc… GUI

TCP/IP HTTP(s)

Page 5: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

5 Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.

本文書の一部または全部の転載を禁止します。

検討事項 • 特にセキュリティ面と運用面

– RDBMSの「ユーザー名」と「パスワード」の管理 – ネットワーク上、直接RDBMSに接続出来てしまう – dbExpress/dbGo/FireDACなどのDBコンポーネント

• コンポーネントのアップデート 全端末への再配布 – RDBMSのネイティブクライアントライブラリ

• サポートされているプラットフォームは?? • インストーラ • モジュールのアップデート 全端末への再配布

– ビジネスロジックやSQL文がクライアント側に存在 • アプリケーションのアップデート 全端末への再配布

– ファイアウォール etc…

Page 6: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

6 Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.

本文書の一部または全部の転載を禁止します。

DataSnapプロトコル • TCP/IP

– デフォルト211番ポート – SSL, IPv6 は未サポート

• HTTP – デフォルト80番ポート – HTTPSもサポート

• RPC形式 – サーバーメソッド

• 要は、RDBMSのストアドプロシージャと同じ扱い!! • パラメータ & 戻り値

– in, var, out, return • 組み込みの非同期呼び出しは無い

– インスタンスのライフサイクル • Server, Session, Invocation

– Callback, Filter, Event • データフォーマット

– JSON(JavaScript Object Notation)

{"method":"connect","params":"drivername":"DATASNAP","port":"211","communicationprotocol":"tcp/ip","hostname":"127.0.0.1","DriverUnit":"DbxDatasnap",....]} {"method":"execute","params":[{"fields":[-1,false,"Dbx.MetaData","GetDatabase"]}]} {"method":"reader_close","params":[1,0]} {"method":"disconnect","params":[0]}

{"result":[0,"DataSnap",2]} {"result":[{"rows":[0]},{"data":[1,`]},{"table":[{"fields":[0,false,1,0,true]},{"columns":[13,["QuoteChar",26,0,0,0,16,0,0],["ProcedureQuoteChar",26,0,0,0,16,0,0],["MaxCommands",6,0,0,0,0,0,0],["SupportsTransactions",4,0,0,0,0,0,0],["SupportsNestedTransactions",4,0,0,0,0,0,0],["SupportsRowSetSize",4,0,0,0,0,0,0]... ... ...

クライアントからのリクエストのサンプル

サーバーからのレスポンスのサンプル

Page 7: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

7 Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.

本文書の一部または全部の転載を禁止します。

サーバーメソッドとは? • リモートプロシージャコール(RPC)

– http://ja.wikipedia.org/wiki/RPC

• サーバーメソッドの実装 & エクスポート – 引数の型 – 戻り値 – 例外は? – クライアント用プロキシは?

Page 8: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

8 Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.

本文書の一部または全部の転載を禁止します。

サーバーメソッドで扱える型 • 基本型

– AnsiString – Boolean – Byte – Currency – TDateTime – TDBXDate – TDBXTime – Double – Int64 – Integer – LongInt – OleVariant – Single – ShortInt – SmallInt – String(UnicodeString) – WideString – TStream

• DBXValue型 • TDBXAnsiStringValue • TDBXAnsiCharsValue • TDBXBcdValue • TDBXBooleanValue • TDBXDateValue • TDBXDoubleValue • TDBXUInt8Value • TDBXInt8Value • TDBXInt16Value • TDBXInt32Value • TDBXInt64Value • TDBXJSonValue • TDBXReaderValue • TDBXSingleValue • TDBXStringValue • TDBXTimeStampValue • TDBXTimeValue • TDBXWideCharsValue • TDBXWideStringValue • TDBXStreamValue

• JSON型 • TJSONArray • TJSONNumber • TJSONObject • TJSONString • TJSONValue

• テーブル型 • TDataSet • TParams • TDBXReader

基本型 NULLサポート無し。 varや戻り値もOK

DBXValue型 NULLサポートあり。 varや戻り値はNG

テーブル型 varや戻り値もOK

配列型 (array of …)

サポートされません。 TJSONArrayを使う

Page 9: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

現実的な構成例

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 9

2

Page 10: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

システム構成例

10

• 複数のDataSnapサーバーをロードバランス

GUIアプリ DataSnapサーバ RDBMS

DataSnap

DataSnap プロトコル

FireDAC ドライバ

業務ロジック SQL文 etc… GUI

HTTPS

リバースプロキシ

DMZ HTTP

Apache Nginx ロードバランサ etc…

社内端末 DB管理者等

TCP/IP

Page 11: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

ロードバランスすると… • サーバーメソッド用クラスのライフサイクルとの兼ね合い

– Session (デフォルト) • クライアントアプリケーションからの接続とインスタンスが結びつく • ステートフル

– ステート(セッション情報)のリプリケーションは??

– Invocation • サーバーメソッドの呼び出しごとにインスタンスの生成&破棄を繰り返す • ステートレス

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 11

クライアント DataSnapサーバ RDBMS

リクエスト レスポンス

接続 クエリー実行 切断

クラス インスタンス クラス

インスタンス クラス インスタンス クラス

インスタンス クラス インスタンス

ロードバランサ

Page 12: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

DB接続のレイヤ

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 12

3

Page 13: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

13 Copyright ©2009 Embarcadero Technologies, Inc. All Rights Reserved.

本文書の一部または全部の転載を禁止します。

サーバーメソッドクラスの構造 • 親クラス

– TComponent, TDataModule, TDSServerModule • データアクセス

– IBExpress – dbExpress – dbGo(ADO) – FireDAC etc…

• 親クラスをTComponentで、データモジュールをプーリング? • コネクションプーリング

– 独自実装 – FireDAC

Page 14: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

DBアクセスモジュールの設計 • FireDACで使用する主なコンポーネント

– TFDConnection – TFDTable / TFDQuery など – TFDPhysIBDriverLink など – TFDGUIxWaitCursor (ProviderプロパティはConsole)

• データモジュール – データベースアクセスをカプセル化 – サーバーメソッドの処理とデータベース処理を分離

14

DataSnap クライアントアプリ

サーバー メソッド群

DataSnap サーバープロセス

データ モジュー

RDBMS

Page 15: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

デモ - 複数デバイス対応 -

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 15

Page 16: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

サーバー & クライアントの例 • サーバー

– Delphi 64bit スタンドアロン – TCP/IP + HTTP – TComponent(親) + データモジュール – FireDAC

• クライアント – Delphi VCL – Delphi iOS – Delphi Android – C++Builder OS X

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 16

Page 17: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

Tips

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 17

Page 18: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

HTTPSを利用するには? • リバースプロキシでHTTPSを処理し、HTTPのDataSnapにリダイレクトする

– http://blogs.embarcadero.com/teamj/2013/10/29/4096/

• DataSnap単体でもOpenSSL(Indyで利用)を使用したHTTPS接続を受付可能 – http://blogs.embarcadero.com/teamj/2013/10/30/4103/

• Windows ServerのIISを利用する – ISAPI(DLL)モードでDataSnapサーバーを実装 – IIS自体でHTTPSを処理する

• クライアントは、プロトコルにhttpsを指定するだけでOK

GUIアプリ DataSnapサーバ

DataSnap

DataSnap プロトコル

HTTPS

リバースプロキシ

HTTP

Page 19: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

バイナリデータの送受信 • TStreamを使う

– 高速 – もちろん、TJSONAarrayにByte配列を入れる方法もOKですが…

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 19

function TTestServer.Download(…): TStream; var memStream: TBytesStream; begin Result := nil; FileName := …; if FileExists(FileName) then begin memStream := TBytesStream.Create; memStream.LoadFromFile(FileName); Result := memStream; end; end;

procedure TForm1.BtnClick(Sender: TObject); var stream: TStream; b: Byte; mem: TBytesStream; begin stream := TestSV.Download('xyz.jpg'); mem := TBytesStream.Create; while stream.Read(b, 1) = 1 do mem.Write(b, 1); … mem.Free; end;

Server側 Client側

Page 20: B4 Delphi/C++テクニカルセッション DataSnapユースケース研究」 · Delphi 2007〜XE5 (32bit/64bit)をサポート • VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

サーバーメソッドの非同期呼び出しは? • VCL(Windows)向けなら OmniThreadLibrary が便利

– http://code.google.com/p/omnithreadlibrary/ – 最新版は 3.03a で、Delphi 2007〜XE5 (32bit/64bit)をサポート

• VCL以外(FireMonkey, iOS, Android)は – TThreadの派生クラスとSynchronizeメソッドなどを組み合わせる

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 20