SQL Server, Oracle, など

Download Report

Transcript SQL Server, Oracle, など

Microsoft ON ― 出張ワークショップ ―
[コース: B3]
.NET Framework 2.0
分散アプリケーション開発
(参加者向け)
第1章 理想の分散アーキテクチャ
“強いシステム” とはどのようなシステムか
ソフトウェア品質の全体像 (ISO 9126)
非機能的要件
機能的要件
ソフトウェアでは、目に見えづらい非機能要件が多数潜在しています
これら非機能要件のすべてを都度要件定義で決めることは事実上困難です
機能性
合目的性
正確性
相互運用性
セキュリティ
標準適合性
使用性
理解性
習得性
運用性
信頼性
成熟性
障害許容性
回復性
効率性
時間効率性
資源効率性
保守性
解析性
変更性
安定性
試験性
移植性
環境適応性
設置(配置)性
置換性
要件の定義
(都度実施)
方法の規定
アーキテクチャの規定
資源再配置
負荷分散
アプリケーション配布
二重化
非同期処理
トランザクション管理
認証
XX
メッセージング
• より見えづらい
データ移行
セキュリティ
• より定義しづらい
• より実装が難しい
相互接続
• よりトラブルを起こしやすい
、、、、、、
運用と拡張性を考慮した ”強い” 実装の探求
Windows DNA (1997年~)
アプリケーション同士が密接に連携し、変更・再配置などにも考慮した分散 Web
アプリケーション構築のためのアーキテクチャを提唱 (その後のMicrosoftの分散
アプリケーションの考え方のベース)
データなどの内部実装(例:ファイルからデータベースへの変更、など)に非依存
サービスのプラグイン、拡張が可能な、成長型のアーキテクチャ
運用と拡張性を考慮した ”強い” 実装の探求
より “接続性” を重視した .NET Framework
次世代システム


Capabilities


クライアント/サーバー
VB、第 4 世代言語
分散システム
レガシー システム連携









ダム端末
COBOL
集中管理



Web アプリケーション
CGI, Java, ASP
3 階層分散システム
システム間連携
PC CUI
C
スタンドアロン
Time
サービス間連携(商用
Web サービス、など)
マルチ デバイス対応
運用と拡張性を考慮した ”強い” 実装の探求
分散アーキテクチャ(DNA思想) + .NET Framework
スケーラブルな再利用シナリオ(例:全社規模の共有、社外サービスの接続、等)
オープンで標準化された接続(SOAPなど)、さまざまなデバイスに対応、オフラインシナ
リオへの対応、、、 など
ユーザデバイス
UIP
Webファーム
プレゼンテーション
(第3章)
Biz ロジック
DB アクセス
サービス Agent
DB クラスタ
外部サービス
アプリケーションファーム
ビジネスロジック
(第3章)
データ
(第2章)
第2章 データ層とデータアクセス実装
データアクセスの2つのモデル
なぜ、非接続型なのか(その背景)
時代に適した新しいデータアクセスの必要性
ホスト/バッチ
クライアント - サーバ
Web
接続
接続
接続
接続
接続
接続/切断
データ取得後の柔軟な活用 (DBと切り離しポータブルに扱える)
抽出
コピー
挿入
変更
バインド
データベース非依存コードと依存コードの明確な分離
(SQL 89/92/99, 独自関数, etc)
例: update test set col1 = nvl(val, ‘no item’);
接続/切断
ADO.NET の接続型と非接続型
方法の相違
接続型データアクセス
非接続型データアクセス
データ操作
(
プロバイダに
依存しない
処理
読
み
込
み
)
追
加
変
更
削
除
デ
ー
タ
更
新
コピーされたインメモリデータベース
(DataSet, DataTable)
DataAdapter
デ
ー
タ
更
新
データソース
(SQL Server, Oracle, など)
切
断
接
続
デ
ー
タ
検
索
Update
読
み
込
み
追
加
変
更
削
除
Fill
接
続
デ
ー
タ
検
索
)
(SQL Server,
Oracle, OLE DB,
など)
データ操作
(
プロバイダに
依存した
処理
切
断
データソース
(SQL Server, Oracle, など)
ADO.NET の接続型と非接続型
使用するクラスの相違
接続型データアクセス
非接続型データアクセス
DataSet
DataTable
DataView
プロバイダに
依存しない
処理
DataRelation
DataRow, DataColumn
.....
コピーされたインメモリデータベース
(DataSet, DataTable)
OLE DB 用
Oracle 用
サードベンダなどで
独自に拡張可能
プロバイダに
SQL Server 用
SqlConnection
依存した
処理
(SQL Server,
Oracle, OLE DB,
など)
SqlCommand
.....
SqlDataReader
SqlDataAdapter
.....
データソース
(SQL Server, Oracle, など)
SqlCommandBuilder
データソース
(SQL Server, Oracle, など)
ADO.NET 非接続型の実装概念
Fill メソッド
DataAdapter/TableAdapter オブジェクトにSQLクエリ(または
ストアドプロシージャ)の Command を設定
① コマンド設定
② Fill メソッド実行
SelectCommand
InsertCommand
DataSet
Update メソッド
UpdateCommand
DataAdapter
TableAdapter
DeleteCommand
DataBase
ADO.NET 非接続型の実装概念
Update メソッド
DataAdapter/TableAdapter オブジェクト の更新コマンドを設
定(更新コマンドの設定詳細は後述)
Fill メソッド実行
DataSet
②Update メソッド
SelectCommand
InsertCommand
UpdateCommand
DataAdapter
TableAdapter
DeleteCommand
① コマンド設定
DataBase
ADO.NET 非接続型の実装概念
RowState による状態管理
Fill 直後の DataTable
RowState
Column1
Column2
Unchanged
1
Dog
Unchanged
2
Cat
Unchanged
3
更新後の DataTable
更
新
Snake
RowState
Column1
Column2
Unchanged
1
Dog
Modified
2
Lion
Deleted
3
Snake
Added
4
Cow
関連 Method
• CancelEdit
直前の行の更新を
キャンセル
• RejectChange
一連の更新処理を
元に戻す
• AcceptChange
一連の更新処理を
確定する
ADO.NET その他の実装
パラメータの使用
Parameterオブジェクトを使用することで、単なる文字列置換でな
い、意味的な引数管理をおこなう
CommandText のSQL文中で、パラメタ位置を指定
SqlClient では @xxxx で指定、OleDb では ? で指定
Parameterオブジェクトを使ってパラメータをアタッチ
Parameter object をAdd
Value プロパティにパラメータの内容(入力引数)を設定
‘SQL Server Client
Dim cmd As New SqlCommand( “select * from authors where au_id = @au_id”, conn )
cmd.Parameters.Add(“@au_id”, SqlDbType.VarChar, 11)
cmd.Parameters(“@au_id”).Value = “172-32-1176”
:
‘ OLE DB Client
Dim cmd As New OleDbCommand( “select * from authors where au_id = ?”, conn )
cmd.Parameters.Add(“au_id”, OleDbType.VarChar, 11 )
cmd.Parameters(0).Value = “172-32-1176”
:
ADO.NET その他の実装
ストアドプロシージャの使用
非接続型においても、コマンドに “ロジック” を実装 できるため有用
パラメータのない簡単なストアドプロシージャの実装方法
CommandText プロパティ、CommandType プロパティを設定
Dim cmd As New SqlCommand(conn)
cmd.CommandText = “MyProcedure”
cmd.CommandType = CommandType.StoredProcedure
conn.Open()
SqlDataReader dr = cmd.ExecuteReader()
:
パラメータを持つストアドプロシージャの実装方法
Direction プロパティ (Output / Input / ReturnValue) でさまざまな引数を指定
Dim cmd As New SqlCommand(conn)
Dim param As New SqlClient.SqlParameter
cmd.CommandText = “MyProcedure”
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add(“@Param1”, SqlDbType.Int).Value = 3
param.Direction = ParameterDirection.ReturnValue
param.ParameterName = “@ReturnValue”
param.SqlDbType = SqlDbType.Int
cmd.Parameters.Add(param)
:
入力パラメータの場合
返り値の場合
マネージコードの SQL Server ストアド実装
SQL CLR の利用
優位点
ストアドプロシージャから、通常のマネージ実装同等のコード
を実装可能
ADO.NET から都度接続する方法と比べ、DB接続などの
オーバーヘッドを軽減
(また、 SQL Server と同一のプロセス内で実行)
留意点
但し、CLR上で実行されるため、極端にレスポンスにクリティカ
ルな繰り返し処理などでは、T-SQL が優位 (CLR 上の型変
換などのオーバーヘッドが若干有)
データアクセスにおける実装上の留意点
接続プールへの配慮
Connection オブジェクトの接続文字列ごとに接続プー
ルがキャッシュされる
例:“Server=(local);DataBase=Pubs;…”
Max値、Min値などを指定可能。ログインのトレースなどで最
適化する
接続プールの動きを理解することが重要
Connection String が完全に一致している場合のみ、
Connection がプールされる
但し、SQL Server の Windows 統合認証では、接続文字列
が同じでもユーザごとにプールが作成されるので注意する
ADO.NET 2.0 では、接続プールの実行時の制御が
可能 (ClearAllPoolsメソッド、など)
データアクセスにおける実装上の留意点
オプティミスティックな同時実行の制御
“非接続” モデル固有の設計上の課題
一般的解決策として、複数名での更新排他の制
御を更新コマンド(Insert/Update/Delete)として
実装
UpdateCommand の実装例
Update Seat Set State = “occupied” where Id = @ID
更新 (ID = 5)
更新 (ID = 5)
遅い者勝
ち!
Update Seat Set State = “occupied”
where (Id = @ID) and (State = “empty”)
データアクセスにおける実装上の留意点
移植性への配慮(プロバイダ非依存な実装)
方法1: System.Data.Common 名前空間とDbProviderFactory を使用 (ADO.NET
2.0の新機能)
‘ プロバイダ依存な記載
Dim dataFactory As DbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient")
‘ 以降、プロバイダ非依存な記載
Dim cmd As DbCommand = conn.CreateCommand()
cmd.CommandText = "SELECT Name FROM Sales.Store WHERE CustomerID = @CustomerID"
Dim param As DbParameter = dataFactory.CreateParameter()
param.ParameterName = "@CustomerID"
param.Value = txtCustomerID.Text
cmd.Parameters.Add(param)
Dim customerName As String = cmd.ExecuteScalar()
方法2: インタフェースへのキャストを使用
‘ プロバイダ依存な記載
IDbConnection con = new SqlConnection(“Server=(local);Integrated Security=SSPI;Database=northwind”);
‘ 以降、プロバイダ非依存な記載
string sqlStr = "SELECT id, name FROM TestTable";
IDbCommand cmd = con.CreateCommand();
cmd.CommandText = sqlStr;
con.Open();
IDataReader dr = cmd.ExecuteReader();
メッセージキュー
メッセージキューの役割
信頼性の確保
ネットワークや送信先のアプリケーションの状態にかかわらず、メッセージ配
信が保証される
応答性の確保
メッセージキューの非同期メッセージングを活用することで、複数のアプリ
ケーションを非同期に動作可能。
またネットワークトラフィックなどを考慮し、転送時間などをアプリケーション側
で制御可能 (夜間のバッチ転送など)
処理A
処理A
DB
注文処理
処理B
処理B
このような場合、アプリケーションの再稼動時に
メッセージを送信する必要がある
DB
メッセージキュー
メッセージキューの利用手順
キューを作成する(静的 or 動的)
パブリックキュー : ネットワーク全体に発行
プライベートキュー : ローカルコンピュータのみ
キューへのプロパティ設定
メッセージを送信するアプリケーションと受信するアプリケーショ
ンを作成する
特別な処理を必要とする場合はシステムキューを利用する
配信不能キュー、ジャーナルキュー等
トランザクションの管理
2.0 で追加された System.Transaction
System.Transaction を使用すると、
TransactionScope を使用したプログラミングモデルを使用可能
SQL Server 2005 では、状況に応じ、LTM から DTC (OleTx) に自動
的に昇格
ネイティブ
トランザクション
System.EnterpriseServices
(OleTx ,DTC)
System.Transaction
VS
スケーラブルでない!
 分散環境に未対応
オーバーヘッド大 (遅い!)
 マルチリソースに未対応
Using tx As New TransactionScope()
Dim MyCon As SqlConnection = New SqlConnection("server=MyServer; " & _
"database=AdventureWorks;user id=MyUser; password=MyPassword")
MyCon.Open()
:
Dim RecNum As Integer = MyCommand.ExecuteNonQuery()
MyCon.Close()
tx.Complete()
End Using
第3章 ビジネスロジックの分離と
XML Web サービスの活用
XML Web サービスの利用
型指定された DataSet を使用する
“型指定された DataSet” とは?
テーブル名等を事前に取り込んで作成されたDataSet
DataSet クラスの派生クラスとして独自に生成したクラス
WebMethod は標準的なDataSetを使用可能である
が、“型指定されたDataSet” を使うと、、、
曖昧さを排除できる
スキーマ定義を通し、他環境との相互運用が可能となる
(型指定していない DataSet は Microsoft 独自)
ソースの可読性が向上する
型指定されていない場合:
型指定されている場合:
ds.Tables[“customer”].Rows[5][“name”]
ds.customer[5].name
その他: IntelliSense が利用可能、コンパイル時のチェッ
クによるエラー発生率が低下、パフォーマンスの向上、な
ど
XML Web サービスの利用
XML Web サービスによる検索・更新の実装
WebMethod の返り値/引数の双方に、型付データセットを使
用可能
更新頻度によっては、通信データ量を考慮し、データセットの
GetChanges メソッドなどを使用 (但し型付データセットへのキャスト
が必要なので注意)
Web サービスの実行OSユーザは、アプリケーションプールの
アイデンティティユーザで実行 (Windows 統合認証によるDB
接続の際は、コネクションプール管理、権限等に注意する)
管理と安定性に配慮して、アプリケーションプールを構成
ワーカープロセスを分離 (個別のリソースプランを指定可)
システム規模に応じ Web ガーデンを構成可
例外は、SoapException に変換され、XML にシリアル化され
る(開発者は .NET Framework の通常の例外処理でハンドリ
ングできる)
セキュリティの実装
XML Web サービスにおける認証と暗号化(1)
スケーラブルな実装シナリオ(例:社外からの接続、一般消費
者向けサービス、など)では特に配慮が必要
XML Web サービスでは、フォーム認証は使用不可
基本認証
ダイジェスト認証
統合 Windows 認証
クライアント証明書を利用した認証
認証機構の実装には、XML Web サービス側は構成を変更し
(実装コードの変更は不要)、クライアント側はコードを記述
Dim ws As New localhost.Service()
ws.Credentials = New System.Net.NetworkCredential(TextBox1.Text, TextBox2.Text)
認証をカスタムコードで構築することも可能
(但し、カスタム Http Module を作成する必要があり非常に面倒)
セキュリティの実装
XML Web サービスにおける認証と暗号化(2)
SSL (Secure Socket Layer) による暗号化機構の実装
セッション層で処理される公開鍵/秘密鍵方式による暗号化方式
(HTTPS プロトコルを使用)
暗号化で使用する公開鍵はブラウザ側で保持。
また、複合化で使用する秘密鍵はサーバ側で保持。
サーバ(IIS)側は必要事項を入力し、認証局(CA)に証明書を要求す
る (Web サイトの [プロパティ] 画面の [ディレクトリセキュリティ] タブ)
サーバ(IIS)側に、認証局(CA)から電子メールで発行されたサーバ証
明書をインストールする
ブラウザに、認証局(CA)から取得したルート証明書をインストールす
る (著名なものは、通常、ブラウザに組み込まれている)
第4章 プレゼンテーションの実装
.NET におけるプレゼンテーション実装の種類
用途に応じた .NET 実装
Office アプリケーション
Windows フォーム
PocketPC/デバイスアプリケーション
Web フォーム
(及び モバイルWebフォーム)
ビジネスユーザ
向き
コンシューマ向き
Office
アプリケーション
リッチ (高機能なUI)
Windows フォーム
with “Atlas”
Web フォーム
リーチ(環境やアプリへの依存性が低い)
DataSet のオフラインシナリオの実装
アプリケーションの形態ごとに準備された手段
デバイス
Office
アプリケーション アプリケーション
方法
XMLシリアル化
Cachedデータ
DiffGram
のサポート
○
○
-
ドキュメント(ブッ
ク)のトップレベル
でしかサポートしな
いため、Sheetオブ
ジェクトなどで使用
する場合は、トップ
レベルでオブジェク
トを宣言し参照する
その他
留意事項
Web
フォーム
基本的に、オフラインはサポートしない
(但しサーバ側での Read/Write は可能)
Windows
フォーム
Windows フォームの難読化
Windows フォーム配置の際の留意点
.NET アプリケーションであるか否かに関係なく、原則
として、クライアントアプリケーションに重要情報など
は含めない
特に .NET アプリケーションでは逆アセンブリが容易
アプリケーション要件の理由で重要情報を含める必要
がある場合は、可能な限りクライアントの難読化と文
字列の暗号化をおこなう
難読化したアプリケーションの ClickOnce による配置
も可能
ステートレスなHTTPへの配慮
XML Web サービス/Web フォーム利用時の留意点
XML Web サービスにおいては、基本は、WebMethod 単位の
ルートトランザクションとしてしか機能できないので注意
ルートトランザクションとして、DTC (EnterpriseServices) を使用可能
WebMethodAttribute の TransactionOption を設定する
可能な限り、1 メソッドは1 つの完結した操作として実装(デザイン)
Web フォームにおいては、毎回、DataSet のメモリの内容は
破棄されるので注意
DataGrid などへの表示情報(及び内部のオリジナルデータなど)は、
すべて ViewState にストックされている
このため、カスタムのデータメソッド(EditCommand、
UpdateCommandなど)の実装では、Session や ViewState に退避し
たり、DataSet などを再度 Fill (データを再構築) したりする必要がある
リソースやパフォーマンスに配慮したカスタムなバインド処理で
は、ObjectDataSource の利用も効果的
Web フォームのセッション管理
ASP.NET で進化したセッションコントロール
従来のセッション管理
② セッション作成
(タイムアウト時間設定)
① サーバ接続
セッション
③ セッションIDの書き込み
Webサーバ
(次回以降、このIDでセッション
を識別)
Webブラウザ
この方式の問題点
Web ファーム構成でセッションを管理する場合は自前の作りこみが必要
プロセスに依存したセッションでスケーラビリティがない
セッションID を Cookie へ書き込むため、Cookie の有効/無効などブラ
ウザの設定状態に依存して動かなくなる
など
ASP.NET のセッション管理
コンフィグレーション(web.config)の設定で、これらをすべて解消
まとめ
便利さの裏に隠れているもの
知れば知るほど深い、、、 .NET
.NET は、開発者に、煩わしい内部処理から開放された新しい
開発フレームワーク (ASP.NET、ADO.NET、etc) を提供
.NET のより深遠な技術を理解しコントロールすることで、分散
システムという領域まで拡張可能、
Business
• フレームワークとしての便利さ
• ビジネスロジックへの集中(煩わしさからの解放)
•よりハイレベルなコントロール
Technology
リソースコントロール、セッションコントロール、
セキュリティ、チューニング、
など
システムの規模・厳格性
Windows による 可用性(非ダウンタイム)実績の一部抜粋
クラスタ構成
シングルサーバ構成
Tarbus
99.999 %
HotBot.com
99.99 %
Morigaga Ramp
99.999 %
Buy.com
99.98 %
FreeMarkets.com
99.999 %
Bames & Noble.com
99.98 %
VirtualBank
99.999 %
CBSMarketWatch.com
99.98 %
例えば、Bames&Noble など、計画停止を含めても 98.55 % (停止が年間 5 日程度)
技術情報リソース
「300 秒でズバリ !!」&「10 行でズバリ !!」シリーズ:
http://www.microsoft.com/japan/msdn/thisweek/300x10/
Step 7 シリーズ 「分散アプリケーション開発編」:
http://www.microsoft.com/japan/msdn/thisweek/step7/defa
ult.aspx
Microsoft patterns & practices:
http://msdn.microsoft.com/practices/
マイクロソフトのコンサルタントが執筆!
『.NET エンタープライズWebアプリケーション
開発技術大全』(全5巻)
© 2006 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not
be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.
MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.