データアクセス
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「...
-戻る
--[[FAQ - D層フレームワーク]]
--[[アプリケーション設計のポイント]]
---データアクセス
---[[バッチ処理方式]]
*目次 [#t1163486]
#contents
*概要 [#q91aa2c1]
データアクセス関連の処理方式についてまとめる。
*コネクション & トランザクション管理 [#o703aabb]
**コネクション管理方式 [#ce589a30]
***ConnectionのOpen/Close [#f9106cce]
ConnectionのOpen/Close処理の実装は、”Open棟梁”のB層の「[[...
-メソッド毎に共通処理の動作を変更する場合は、「メソッド属...
-[[例外的に「B層業務処理」内部で手動トランザクション処理...
***Connection Pooling [#e1eb068b]
コネクション プーリングに関しては、通常データ プロバイダ...
**トランザクション制御方式 [#v184ccf0]
***自動トランザクション [#e3777e4f]
-TransactionのBeginとCommit/Rollback処理の実装は、”Open棟...
-このため、APサーバを用いた処理方式の場合、DBMSトランザク...
***手動トランザクション [#r047062c]
1回のB層呼び出しに対して、複数のコネクション、トランザク...
手動トランザクションを検討する(”Open棟梁”は[[手動トラン...
**サンプル・コード [#q7358e77]
-例えば、
--手動のトランザクション管理や、
--2層C/Sで2本目のコネクションを
>必要とする場合など、
-データアクセス制御クラス(Dam)を手動で生成して、~
コネクション、トランザクションの手動管理をする事でこれを...
-以下は、B層のサンプル コードである。
/// <summary>業務処理を実装</summary>
/// <param name="testParameter">引数クラス</param>
private void UOC_メソッド名(TestParameterValue testParam...
{ //メソッド引数にBaseParameterValueの派生の型を定義可能。
// 戻り値クラスを生成して、事前に戻り地に設定しておく。
TestReturnValue testReturn = new TestReturnValue();
this.ReturnValue = testReturn;
// ↓業務処理------------------------------------------...
// データアクセス制御クラス(Dam)
// SQL Server / SQL Client用のDamを手動で生成
BaseDam dam = new DamSqlSvr();
// 接続文字列をロード
string connstring = GetConfigParameter.GetConnectionSt...
// コネクションをオープンする。
dam.ConnectionOpen(connstring);
// 手動トランザクション(規定の分離レベル)
dam.BeginTransaction(DbEnum.IsolationLevelEnum.ReadCom...
// 個別Dao
LayerD myDao = new LayerD(dam);
//myDao.xxxx(testParameter, ref testReturn);
// 汎用Dao
CmnDao cmnDao = new CmnDao(dam);
cmnDao.ExecSelectScalar();
// トランザクション、コネクションの解放
dam.CommitTransaction();
dam.ConnectionClose();
// ↑業務処理------------------------------------------...
}
>トランザクション、コネクションの解放処理(CommitTransact...
通常GCにより解放される場合、トランザクションはロールバッ...
*排他制御方式 [#ze68b1c1]
HTTPリクエストなど、通信処理(リクエスト)を跨いだ排他制...
通信処理(リクエスト)を跨いでDBMSトランザクションを持続...
リクエストを跨いで排他(ロック)を掛けるには、[[楽観排他...
**DBMSトランザクションの範囲の排他制御方式 [#i0ace1b4]
DBMSトランザクションの範囲は、DBMSの分離レベルに従った排...
必要に応じて更新ロック(OracleであればFor Update Wait・No...
-参考:[[DBMSのロック・分離戦略と同時実行制御 - マイクロ...
**楽観排他方式 [#pae80218]
***全列比較方式 [#a1d85e92]
.NETでは、DataTableがサポートするDataRowVersionを使用した...
-具体的には、Where句で全列のAnd = DataRowVersion.Original...
--行の状態とバージョン~
https://msdn.microsoft.com/ja-jp/library/ww3k31w0.aspx
が一般的であるが、クエリが無用に長くなる等の問題もあるの...
***タイムスタンプ方式 [#u9c92f1b]
楽観排他方式(タイムスタンプを使用する)は、
-データの取得時に、タイムスタンプを取得し、
-データの更新時に、Where句に主キーとタイムスタンプ列を指...
排他方式である。
#ref(timestamp.png,left,nowrap,タイムスタンプ)
SQL ServerやOracleにはタイムスタンプ型がある。
-SQL ServerのTimeStamp型は、Insert・Update時に更新が自動...
-Oracleでは、Insert、Update時にOracle埋め込み関数である、...
***D層自動生成ツール [#h2bda0d8]
なお、”Open棟梁”の[[D層自動生成ツール]]では、
楽観排他(ロック)対応のDao生成が可能で、
-タイムスタンプ更新の自動化
-タイムスタンプ指定の強制
などが可能である。
**悲観排他方式(ロック管理テーブル) [#l9f989c5]
以下のケースで、ロック管理テーブルなどを使用して悲観排他...
-DBMSトランザクションを維持できない、サーバアプリケーショ...
タイムスタンプを使用した楽観排他(ロック)ではなく、悲観...
-若しくは、業務的に子レコードの更新の際に親レコードの悲観...
行単位の悲観排他(ロック)を必要とするテーブル毎に「行ロ...
***行ロック管理テーブル [#qac4dfe6]
「行ロック管理テーブル」は次のように設計すると良い。
|キー(ユニーク)|ロック ユーザ|ロック取得時間|h
|aaa|User1|yyyy/MM/dd HH:mm:ss.SSS|
|bbb|User2|yyyy/MM/dd HH:mm:ss.SSS|
|ccc|User3|yyyy/MM/dd HH:mm:ss.SSS|
***処理シーケンス [#wdc4b91c]
行単位の悲観排他(ロック)方式の処理シーケンスを以下に示...
+トランザクションを開始して更新先テーブルを参照し、更新ロ...
+同一トランザクション内で「行ロック管理テーブル」に、上記...
追加の際、主キーは「キー(ユニーク)」列へ、ユーザ名は「...
--追加に失敗した場合は、悲観排他(ロック)取得に失敗した...
--追加に成功した場合は、悲観排他(ロック)取得に成功した...
+取得した更新対象データ行をクライアントにレスポンス、画面...
+トランザクションを開始して
--更新先テーブルを参照し、更新ロックをかける。
--「行ロック管理テーブル」の更新対象データに対応するレコ...
+上記の2つのレコードのうち、
--どちらか一方 or 双方が存在しない場合は、処理に失敗し...
--双方が存在する場合は、処理に成功したものとし、処理を続...
+「行ロック管理テーブル」に更新ロックをかけた状態で、更新...
+同一トランザクション内で「行ロック管理テーブル」のレコー...
--テーブル単位に管理テーブルを分割するため、負荷は軽減で...
--ログアウトの際に「行ロック管理テーブル」のロック ユーザ...
--必要であれば、他のロック解除を忘れた場合にもユーザが悲...
ロック取得時間にタイムアウトを儲けるか、「行ロック管理テ...
*テーブル設計 [#x54bcb93]
**コード設計 [#j928029b]
コードには以下の種類がある。
***採番コード [#ife2f343]
-非正規化マッピングにてID化したトランザクションデータの主...
-採番方法については、本ドキュメントの「[[ID採番方式>#ne94...
***リストコード [#mafbff09]
-可変リストコード
--変更可能であり、PG埋め込み不可能なコード。
--非正規化マッピングにてID化したマスタテーブルの主キー。
-非可変リストコード
--変更不可能であり、PG埋め込み可能なコード。
--区分やステータスなど。
**削除方式 [#mf26f840]
物理削除か?論理削除か?を検討する。
***物理削除 [#z2c81374]
-DELETEでデータを削除する。
-データが履歴として残らない、~
バックアップなどからしか復元できない。
-データ量を削減できる。
***論理削除 [#od85031a]
-UPDATEで削除フラグを立てる。
-データが履歴として残る。~
削除フラグを変更してデータを復元できる。
-データ量を削減できない。
***データのアーカイブ方法 [#se145aad]
増え続けるトランザクションデータは性能やメンテナンス上の...
-インサート → デリートの削除バッチでアーカイブ・テーブル...
-必要であれば[[パーティション化>http://techinfoofmicrosof...
スライディング・ウィンドウ方式もある(こちらの方がトラン...
**マスタ・データ [#r997ed93]
***有効期限付きデータを利用する場合 [#l55f9a01]
-メリット~
オン中の自動切り替えが可能であるため、運用が容易。
-デメリット~
データ取得に工夫が必要になる~
(Where句に有効期限と現在日付の比較を含めるなど)。
-必要な列
--「ID(PK)」
--「業務キー(unique)」
--「業務キーに対応する情報」
--「有効期限」
***システム共通定数テーブル [#r6076991]
-メリット~
テーブルを纏められるため、管理が容易になる。
-デメリット
--データ取得に工夫が必要になる(Where句に定数区分を含める...
--外部参照制約は利用できない(主キーで無いため)。
--テーブル名が無く、汎用のテーブル名列名なので仕様が見え...
例えば、「定数区分キー」に対応する「業務キー」の業務的な...
--列長等も所謂「十分な大きさ」になるため、テーブル側仕様...
-必要な列
--「ID(PK)」
--「定数区分キー」+「業務キー」(unique)
--「「定数区分キー」+「業務キー」に対応する情報」
(有効期限付きデータの併用可能)。
**ID採番方式 [#ne94d048]
***SEQUENCE・IDENTITY [#g471542d]
必ず、連番にならなくても良ければ、~
DBMSに実装されているSEQUENCEやIDENTITYを使用する。
以下、主要DBMSの採番機構を表に纏めた。
|項番|DBMS|採番機構|確認方法|h
|1|Oracle|SEQUENCEオブジェクト|SEQUENCE.CURRVALを確認する...
|2|SQL Server|オート インクリメント列(IDENTITYプロパティ...
|3|DB2|SEQUENCEオブジェクト|・・・|
|4|MySQL|オート インクリメント列(AUTO_INCREMENT属性)|・...
|5|PostgreSQL|SEQUENCEオブジェクト|・・・|
|6|HiRDB|SEQUENCEオブジェクト|・・・|
Windows Server 2008 R2から、SEQUENCEオブジェクトがサポー...
-Microsoft SQL Server: シーケンスによるソリューション~
https://technet.microsoft.com/ja-jp/magazine/hh407114.aspx
>Microsoft SQL Server では、待望の新機能 "シーケンス" が...
***連番採番方式 [#fcbec90b]
必ず連番にする連番採番方式は、要件に合わせて個別に設計す...
-連番採番(追い越しを不許可):
--採番テーブルをテーブルロック → 同時実行性 低
--例えば、採番テーブルにはテーブルロックをかけて業務トラ...
-連番採番(追い越しを許可):
--「予約通番」を用いて追い越しを許可 → 同時実行性 高
--ロックが長くなり同時実行性の低下が問題になる場合は、~
「予約通番」を用いて追い越しを許可した連番採番を行う~
(初めに予約採番し、確定時に連番採番し、予約通番を実際の...
**レコード更新履歴の記録 [#jfea50d0]
”Open棟梁”では直接サポートしていないが、~
「[[ベースクラス2]]」(データアクセス親クラス2)上に共通...
方式は色々あるので、プロジェクト毎に方式を決めること。
***履歴情報 [#l6b78144]
全テーブル共通項目などを用意して、
-ユーザ名、データ追加日時
-ユーザ名、データ更新日時
-ユーザ名、データ削除日時(論理削除 → [[論理削除方式>#]]...
の情報を保持するなど(このような処理はDaoで共通化できる)。
***SQL(DML)の記録 [#ge2d9817]
プロジェクト対応で、「[[ベースクラス2]]」(データアクセス...
***更新前データの記録 [#h147b9fa]
また、DBMSのトリガを使用することで更新前のデータを別テー...
*データアクセス標準化 [#f6f1713f]
**CRUD図 [#na122b84]
-機能の過不足はCRUD図から読み取ることが出来る(特に削除処...
-また、後述の[[デッドロック防止>#wa1ecf6c]]のためのロック...
**[[デッドロック防止>http://techinfoofmicrosofttech.ossco...
**DBMS側機能の使用 [#yda5b107]
***デメリット [#m7e6626d]
DBMS側機能を使用すると
-「[[複数DBMSサポート>#g99bba06]]」が難しくなることがある。
-ビジネス・ルール実装箇所の分散(業務UP側 ⇔ DBのDDL・DML...
--[[ストアド>#s9531f5c]]
--[[トリガ>#jd014ebc]]
--[[外部参照制約>#cfeff855]]
--[[SQL CLR>#vc0a26d2]]
-開発スキルセットの増加。
-上記に伴う保守性の低下。
***[[ストアド・プロシージャ>FAQ - D層フレームワーク#c3901...
データアクセス速度が速いので大量データの処理がある場合は...
***トリガ [#jd014ebc]
トリガのイベントドリブンの問題
イベントドリブンでの頻繁なデータアクセスにより、~
パフォーマンス・保守性の低下、トリガ連鎖のリスクがある。
***外部参照制約 [#cfeff855]
データのインサートやデリートの処理順番を考慮する必要があ...
***[[SQL CLR>https://techinfoofmicrosofttech.osscons.jp/i...
*大量データの処理 [#le45aab5]
参考:[[大量データの処理>http://techinfoofmicrosofttech.o...
**結果セットの肥大化の軽減 [#hd2ab68b]
***SQLの「SELECT * FROM]を使用しない。 [#e07bfc98]
必要なカラムの射影を取得するようにする。
***[[一覧ページ制御方式]] [#l5710e1d]
ページングにより結果セットを分割する。
**ラウンドトリップの軽減 [#yb060e67]
***イテレータの様に主キーでのDBアクセスをしない [#s9375a3a]
-範囲検索をする。
-SQLのWHERE句でIN句やBETWEEN演算子を使用する。
***プログラムでデータを結合しない [#y75416a9]
-結合処理をする。
-SQLのJOIN句を使用する。
***その他、PG <---> DB間のラウンドトリップを防止 [#m2a72e...
-[[バッチクエリ作成支援機能]]
-ストアドプロシージャ、SQL CLRなどを使用する。
**[[バッチ処理方式>バッチ処理方式#x39e878c]] [#q86996d5]
前述の
-[[結果セットの肥大化の軽減>#hd2ab68b]]
-[[ラウンドトリップの軽減>#yb060e67]]
を考慮した実装を行う。
***[[大量データの取扱>バッチ処理方式#be271701]] [#df4dad53]
***[[DataSet、DataTableを使用したバッチ更新方式>バッチ処...
***[[性能を考慮した動的パラメタライズド・クエリの連続実行...
***[[オンラインバッチ>バッチ処理方式#j8248c0c]] [#h73b209a]
*複数DBMSサポート方式 [#g99bba06]
-参考:クロスDB対応 - マイクロソフト系技術情報 Wiki~
http://techinfoofmicrosofttech.osscons.jp/index.php?%E3%8...
**Dam Factory [#ic066f91]
「業務コード親クラス2」のコネクション接続メソッド(MyBas...
GoFデザインパターンのFactory Method パターン的にデータ ア...
DBMS(データプロバイダ)毎に用意された指定の型で選択的に...
なお、このコネクション接続メソッドでは、
-「[[コネクション管理方式>#ce589a30]]」
-「[[トランザクション制御方式>#v184ccf0]]」
の処理を実装する。
以降の処理ではDamをベースの型で扱うようにして~
DBMS(データプロバイダ)固有型(機能)の使用を局所化する...
**DBMS排他制御 [#d7932767]
「[[トランザクション制御方式>#v184ccf0]]」の「[[排他制御...
**[[レコード更新履歴の記録>#jfea50d0]] [#o98616a2]
「[[レコード更新履歴の記録>#jfea50d0]]」の方法を検討して...
**[[ID採番方式>#ne94d048]] [#ve945efd]
「[[ID採番方式>#ne94d048]]」の方法を検討しておく。
**[[一覧ページ制御方式]] [#va5ee1e9]
「[[一覧ページ制御方式]]」の方法を検討しておく。
**.NET型とDBMS型のマッピング [#j6131d15]
引数と戻り値に既定の型のマッピング(.NET型 <---> DB型)が...
-引数は、パラメタに対するDB型を指定することで程度、制御で...
-戻り値は、SQL上でのDB型を任意の型にキャストすることで程...
*トラブルシュート [#w8b821b2]
**SQLで暗黙の型変換が発生し、検索処理性能が大幅に劣化する...
***概要 [#td06c5ce]
-検索条件に指定した「パラメタのデータ型」と「DBの列のデー...
-これを「暗黙の型変換」と言い、この「暗黙の型変換」が発生...
-Open棟梁の[[動的パラメタライズド・クエリ]]の実行時、
--「SetParameter」メソッドからパラメタのデータ型を指定で...
--このため、通常は、データ型を明示せず、性能劣化が確認さ...
***対策例 [#z696163d]
以下に、パラメタライズド・クエリを使用して、AAAテーブルの...
@P1パラメタの検索条件を指定した際に発生した「暗黙の型変換...
-暗黙の型変換の発生例~
.NETから、@P1パラメタにSystem.Stringのデータを設定した場...
この場合、「パラメタのデータ型」と「DBの列のデータ型」が...
BBB列の全データが「varchar ⇒ nvarchar」と変換されるため、...
-暗黙の型変換の抑止~
前述のとおり、@P1パラメタのデータ型はnvarchar型であるが、~
@P1パラメタは、その後、SQL ServerのTransact-SQLの変換関数...
このため、「パラメタのデータ型」と「DBの列のデータ型」は...
-参考
--SQL Server > Transact-SQL関数 > 変換関数~
http://msdn.microsoft.com/ja-jp/library/ms175509.aspx
***補足 [#rdf45945]
-なお、[[動的パラメタライズド・クエリ]]の「LISTタグ」を使...
ArrayListに指定したパラメタの数に合わせて、パラメタが自動...
上記の外出しのSQLファイルを編集するという方法で対策するこ...
-この場合は、
--APIからパラメタのデータ型を明示する方法を採るか、
--「LISTタグ」ではなく「VALタグ」を使い、
>各DBMSの変換関数を仕掛けたパラメタを必要な数だけ埋め込む...
**[[SQL Server 大量データ処理時の性能問題>https://techinf...
*その他 [#uc52f4b4]
**[[D層(Dao)毎のデータアクセス例>D層(Dao)の種類]] [#q...
**[[動的パラメタライズド・クエリとEF・Dapperの使い分けに...
終了行:
「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「...
-戻る
--[[FAQ - D層フレームワーク]]
--[[アプリケーション設計のポイント]]
---データアクセス
---[[バッチ処理方式]]
*目次 [#t1163486]
#contents
*概要 [#q91aa2c1]
データアクセス関連の処理方式についてまとめる。
*コネクション & トランザクション管理 [#o703aabb]
**コネクション管理方式 [#ce589a30]
***ConnectionのOpen/Close [#f9106cce]
ConnectionのOpen/Close処理の実装は、”Open棟梁”のB層の「[[...
-メソッド毎に共通処理の動作を変更する場合は、「メソッド属...
-[[例外的に「B層業務処理」内部で手動トランザクション処理...
***Connection Pooling [#e1eb068b]
コネクション プーリングに関しては、通常データ プロバイダ...
**トランザクション制御方式 [#v184ccf0]
***自動トランザクション [#e3777e4f]
-TransactionのBeginとCommit/Rollback処理の実装は、”Open棟...
-このため、APサーバを用いた処理方式の場合、DBMSトランザク...
***手動トランザクション [#r047062c]
1回のB層呼び出しに対して、複数のコネクション、トランザク...
手動トランザクションを検討する(”Open棟梁”は[[手動トラン...
**サンプル・コード [#q7358e77]
-例えば、
--手動のトランザクション管理や、
--2層C/Sで2本目のコネクションを
>必要とする場合など、
-データアクセス制御クラス(Dam)を手動で生成して、~
コネクション、トランザクションの手動管理をする事でこれを...
-以下は、B層のサンプル コードである。
/// <summary>業務処理を実装</summary>
/// <param name="testParameter">引数クラス</param>
private void UOC_メソッド名(TestParameterValue testParam...
{ //メソッド引数にBaseParameterValueの派生の型を定義可能。
// 戻り値クラスを生成して、事前に戻り地に設定しておく。
TestReturnValue testReturn = new TestReturnValue();
this.ReturnValue = testReturn;
// ↓業務処理------------------------------------------...
// データアクセス制御クラス(Dam)
// SQL Server / SQL Client用のDamを手動で生成
BaseDam dam = new DamSqlSvr();
// 接続文字列をロード
string connstring = GetConfigParameter.GetConnectionSt...
// コネクションをオープンする。
dam.ConnectionOpen(connstring);
// 手動トランザクション(規定の分離レベル)
dam.BeginTransaction(DbEnum.IsolationLevelEnum.ReadCom...
// 個別Dao
LayerD myDao = new LayerD(dam);
//myDao.xxxx(testParameter, ref testReturn);
// 汎用Dao
CmnDao cmnDao = new CmnDao(dam);
cmnDao.ExecSelectScalar();
// トランザクション、コネクションの解放
dam.CommitTransaction();
dam.ConnectionClose();
// ↑業務処理------------------------------------------...
}
>トランザクション、コネクションの解放処理(CommitTransact...
通常GCにより解放される場合、トランザクションはロールバッ...
*排他制御方式 [#ze68b1c1]
HTTPリクエストなど、通信処理(リクエスト)を跨いだ排他制...
通信処理(リクエスト)を跨いでDBMSトランザクションを持続...
リクエストを跨いで排他(ロック)を掛けるには、[[楽観排他...
**DBMSトランザクションの範囲の排他制御方式 [#i0ace1b4]
DBMSトランザクションの範囲は、DBMSの分離レベルに従った排...
必要に応じて更新ロック(OracleであればFor Update Wait・No...
-参考:[[DBMSのロック・分離戦略と同時実行制御 - マイクロ...
**楽観排他方式 [#pae80218]
***全列比較方式 [#a1d85e92]
.NETでは、DataTableがサポートするDataRowVersionを使用した...
-具体的には、Where句で全列のAnd = DataRowVersion.Original...
--行の状態とバージョン~
https://msdn.microsoft.com/ja-jp/library/ww3k31w0.aspx
が一般的であるが、クエリが無用に長くなる等の問題もあるの...
***タイムスタンプ方式 [#u9c92f1b]
楽観排他方式(タイムスタンプを使用する)は、
-データの取得時に、タイムスタンプを取得し、
-データの更新時に、Where句に主キーとタイムスタンプ列を指...
排他方式である。
#ref(timestamp.png,left,nowrap,タイムスタンプ)
SQL ServerやOracleにはタイムスタンプ型がある。
-SQL ServerのTimeStamp型は、Insert・Update時に更新が自動...
-Oracleでは、Insert、Update時にOracle埋め込み関数である、...
***D層自動生成ツール [#h2bda0d8]
なお、”Open棟梁”の[[D層自動生成ツール]]では、
楽観排他(ロック)対応のDao生成が可能で、
-タイムスタンプ更新の自動化
-タイムスタンプ指定の強制
などが可能である。
**悲観排他方式(ロック管理テーブル) [#l9f989c5]
以下のケースで、ロック管理テーブルなどを使用して悲観排他...
-DBMSトランザクションを維持できない、サーバアプリケーショ...
タイムスタンプを使用した楽観排他(ロック)ではなく、悲観...
-若しくは、業務的に子レコードの更新の際に親レコードの悲観...
行単位の悲観排他(ロック)を必要とするテーブル毎に「行ロ...
***行ロック管理テーブル [#qac4dfe6]
「行ロック管理テーブル」は次のように設計すると良い。
|キー(ユニーク)|ロック ユーザ|ロック取得時間|h
|aaa|User1|yyyy/MM/dd HH:mm:ss.SSS|
|bbb|User2|yyyy/MM/dd HH:mm:ss.SSS|
|ccc|User3|yyyy/MM/dd HH:mm:ss.SSS|
***処理シーケンス [#wdc4b91c]
行単位の悲観排他(ロック)方式の処理シーケンスを以下に示...
+トランザクションを開始して更新先テーブルを参照し、更新ロ...
+同一トランザクション内で「行ロック管理テーブル」に、上記...
追加の際、主キーは「キー(ユニーク)」列へ、ユーザ名は「...
--追加に失敗した場合は、悲観排他(ロック)取得に失敗した...
--追加に成功した場合は、悲観排他(ロック)取得に成功した...
+取得した更新対象データ行をクライアントにレスポンス、画面...
+トランザクションを開始して
--更新先テーブルを参照し、更新ロックをかける。
--「行ロック管理テーブル」の更新対象データに対応するレコ...
+上記の2つのレコードのうち、
--どちらか一方 or 双方が存在しない場合は、処理に失敗し...
--双方が存在する場合は、処理に成功したものとし、処理を続...
+「行ロック管理テーブル」に更新ロックをかけた状態で、更新...
+同一トランザクション内で「行ロック管理テーブル」のレコー...
--テーブル単位に管理テーブルを分割するため、負荷は軽減で...
--ログアウトの際に「行ロック管理テーブル」のロック ユーザ...
--必要であれば、他のロック解除を忘れた場合にもユーザが悲...
ロック取得時間にタイムアウトを儲けるか、「行ロック管理テ...
*テーブル設計 [#x54bcb93]
**コード設計 [#j928029b]
コードには以下の種類がある。
***採番コード [#ife2f343]
-非正規化マッピングにてID化したトランザクションデータの主...
-採番方法については、本ドキュメントの「[[ID採番方式>#ne94...
***リストコード [#mafbff09]
-可変リストコード
--変更可能であり、PG埋め込み不可能なコード。
--非正規化マッピングにてID化したマスタテーブルの主キー。
-非可変リストコード
--変更不可能であり、PG埋め込み可能なコード。
--区分やステータスなど。
**削除方式 [#mf26f840]
物理削除か?論理削除か?を検討する。
***物理削除 [#z2c81374]
-DELETEでデータを削除する。
-データが履歴として残らない、~
バックアップなどからしか復元できない。
-データ量を削減できる。
***論理削除 [#od85031a]
-UPDATEで削除フラグを立てる。
-データが履歴として残る。~
削除フラグを変更してデータを復元できる。
-データ量を削減できない。
***データのアーカイブ方法 [#se145aad]
増え続けるトランザクションデータは性能やメンテナンス上の...
-インサート → デリートの削除バッチでアーカイブ・テーブル...
-必要であれば[[パーティション化>http://techinfoofmicrosof...
スライディング・ウィンドウ方式もある(こちらの方がトラン...
**マスタ・データ [#r997ed93]
***有効期限付きデータを利用する場合 [#l55f9a01]
-メリット~
オン中の自動切り替えが可能であるため、運用が容易。
-デメリット~
データ取得に工夫が必要になる~
(Where句に有効期限と現在日付の比較を含めるなど)。
-必要な列
--「ID(PK)」
--「業務キー(unique)」
--「業務キーに対応する情報」
--「有効期限」
***システム共通定数テーブル [#r6076991]
-メリット~
テーブルを纏められるため、管理が容易になる。
-デメリット
--データ取得に工夫が必要になる(Where句に定数区分を含める...
--外部参照制約は利用できない(主キーで無いため)。
--テーブル名が無く、汎用のテーブル名列名なので仕様が見え...
例えば、「定数区分キー」に対応する「業務キー」の業務的な...
--列長等も所謂「十分な大きさ」になるため、テーブル側仕様...
-必要な列
--「ID(PK)」
--「定数区分キー」+「業務キー」(unique)
--「「定数区分キー」+「業務キー」に対応する情報」
(有効期限付きデータの併用可能)。
**ID採番方式 [#ne94d048]
***SEQUENCE・IDENTITY [#g471542d]
必ず、連番にならなくても良ければ、~
DBMSに実装されているSEQUENCEやIDENTITYを使用する。
以下、主要DBMSの採番機構を表に纏めた。
|項番|DBMS|採番機構|確認方法|h
|1|Oracle|SEQUENCEオブジェクト|SEQUENCE.CURRVALを確認する...
|2|SQL Server|オート インクリメント列(IDENTITYプロパティ...
|3|DB2|SEQUENCEオブジェクト|・・・|
|4|MySQL|オート インクリメント列(AUTO_INCREMENT属性)|・...
|5|PostgreSQL|SEQUENCEオブジェクト|・・・|
|6|HiRDB|SEQUENCEオブジェクト|・・・|
Windows Server 2008 R2から、SEQUENCEオブジェクトがサポー...
-Microsoft SQL Server: シーケンスによるソリューション~
https://technet.microsoft.com/ja-jp/magazine/hh407114.aspx
>Microsoft SQL Server では、待望の新機能 "シーケンス" が...
***連番採番方式 [#fcbec90b]
必ず連番にする連番採番方式は、要件に合わせて個別に設計す...
-連番採番(追い越しを不許可):
--採番テーブルをテーブルロック → 同時実行性 低
--例えば、採番テーブルにはテーブルロックをかけて業務トラ...
-連番採番(追い越しを許可):
--「予約通番」を用いて追い越しを許可 → 同時実行性 高
--ロックが長くなり同時実行性の低下が問題になる場合は、~
「予約通番」を用いて追い越しを許可した連番採番を行う~
(初めに予約採番し、確定時に連番採番し、予約通番を実際の...
**レコード更新履歴の記録 [#jfea50d0]
”Open棟梁”では直接サポートしていないが、~
「[[ベースクラス2]]」(データアクセス親クラス2)上に共通...
方式は色々あるので、プロジェクト毎に方式を決めること。
***履歴情報 [#l6b78144]
全テーブル共通項目などを用意して、
-ユーザ名、データ追加日時
-ユーザ名、データ更新日時
-ユーザ名、データ削除日時(論理削除 → [[論理削除方式>#]]...
の情報を保持するなど(このような処理はDaoで共通化できる)。
***SQL(DML)の記録 [#ge2d9817]
プロジェクト対応で、「[[ベースクラス2]]」(データアクセス...
***更新前データの記録 [#h147b9fa]
また、DBMSのトリガを使用することで更新前のデータを別テー...
*データアクセス標準化 [#f6f1713f]
**CRUD図 [#na122b84]
-機能の過不足はCRUD図から読み取ることが出来る(特に削除処...
-また、後述の[[デッドロック防止>#wa1ecf6c]]のためのロック...
**[[デッドロック防止>http://techinfoofmicrosofttech.ossco...
**DBMS側機能の使用 [#yda5b107]
***デメリット [#m7e6626d]
DBMS側機能を使用すると
-「[[複数DBMSサポート>#g99bba06]]」が難しくなることがある。
-ビジネス・ルール実装箇所の分散(業務UP側 ⇔ DBのDDL・DML...
--[[ストアド>#s9531f5c]]
--[[トリガ>#jd014ebc]]
--[[外部参照制約>#cfeff855]]
--[[SQL CLR>#vc0a26d2]]
-開発スキルセットの増加。
-上記に伴う保守性の低下。
***[[ストアド・プロシージャ>FAQ - D層フレームワーク#c3901...
データアクセス速度が速いので大量データの処理がある場合は...
***トリガ [#jd014ebc]
トリガのイベントドリブンの問題
イベントドリブンでの頻繁なデータアクセスにより、~
パフォーマンス・保守性の低下、トリガ連鎖のリスクがある。
***外部参照制約 [#cfeff855]
データのインサートやデリートの処理順番を考慮する必要があ...
***[[SQL CLR>https://techinfoofmicrosofttech.osscons.jp/i...
*大量データの処理 [#le45aab5]
参考:[[大量データの処理>http://techinfoofmicrosofttech.o...
**結果セットの肥大化の軽減 [#hd2ab68b]
***SQLの「SELECT * FROM]を使用しない。 [#e07bfc98]
必要なカラムの射影を取得するようにする。
***[[一覧ページ制御方式]] [#l5710e1d]
ページングにより結果セットを分割する。
**ラウンドトリップの軽減 [#yb060e67]
***イテレータの様に主キーでのDBアクセスをしない [#s9375a3a]
-範囲検索をする。
-SQLのWHERE句でIN句やBETWEEN演算子を使用する。
***プログラムでデータを結合しない [#y75416a9]
-結合処理をする。
-SQLのJOIN句を使用する。
***その他、PG <---> DB間のラウンドトリップを防止 [#m2a72e...
-[[バッチクエリ作成支援機能]]
-ストアドプロシージャ、SQL CLRなどを使用する。
**[[バッチ処理方式>バッチ処理方式#x39e878c]] [#q86996d5]
前述の
-[[結果セットの肥大化の軽減>#hd2ab68b]]
-[[ラウンドトリップの軽減>#yb060e67]]
を考慮した実装を行う。
***[[大量データの取扱>バッチ処理方式#be271701]] [#df4dad53]
***[[DataSet、DataTableを使用したバッチ更新方式>バッチ処...
***[[性能を考慮した動的パラメタライズド・クエリの連続実行...
***[[オンラインバッチ>バッチ処理方式#j8248c0c]] [#h73b209a]
*複数DBMSサポート方式 [#g99bba06]
-参考:クロスDB対応 - マイクロソフト系技術情報 Wiki~
http://techinfoofmicrosofttech.osscons.jp/index.php?%E3%8...
**Dam Factory [#ic066f91]
「業務コード親クラス2」のコネクション接続メソッド(MyBas...
GoFデザインパターンのFactory Method パターン的にデータ ア...
DBMS(データプロバイダ)毎に用意された指定の型で選択的に...
なお、このコネクション接続メソッドでは、
-「[[コネクション管理方式>#ce589a30]]」
-「[[トランザクション制御方式>#v184ccf0]]」
の処理を実装する。
以降の処理ではDamをベースの型で扱うようにして~
DBMS(データプロバイダ)固有型(機能)の使用を局所化する...
**DBMS排他制御 [#d7932767]
「[[トランザクション制御方式>#v184ccf0]]」の「[[排他制御...
**[[レコード更新履歴の記録>#jfea50d0]] [#o98616a2]
「[[レコード更新履歴の記録>#jfea50d0]]」の方法を検討して...
**[[ID採番方式>#ne94d048]] [#ve945efd]
「[[ID採番方式>#ne94d048]]」の方法を検討しておく。
**[[一覧ページ制御方式]] [#va5ee1e9]
「[[一覧ページ制御方式]]」の方法を検討しておく。
**.NET型とDBMS型のマッピング [#j6131d15]
引数と戻り値に既定の型のマッピング(.NET型 <---> DB型)が...
-引数は、パラメタに対するDB型を指定することで程度、制御で...
-戻り値は、SQL上でのDB型を任意の型にキャストすることで程...
*トラブルシュート [#w8b821b2]
**SQLで暗黙の型変換が発生し、検索処理性能が大幅に劣化する...
***概要 [#td06c5ce]
-検索条件に指定した「パラメタのデータ型」と「DBの列のデー...
-これを「暗黙の型変換」と言い、この「暗黙の型変換」が発生...
-Open棟梁の[[動的パラメタライズド・クエリ]]の実行時、
--「SetParameter」メソッドからパラメタのデータ型を指定で...
--このため、通常は、データ型を明示せず、性能劣化が確認さ...
***対策例 [#z696163d]
以下に、パラメタライズド・クエリを使用して、AAAテーブルの...
@P1パラメタの検索条件を指定した際に発生した「暗黙の型変換...
-暗黙の型変換の発生例~
.NETから、@P1パラメタにSystem.Stringのデータを設定した場...
この場合、「パラメタのデータ型」と「DBの列のデータ型」が...
BBB列の全データが「varchar ⇒ nvarchar」と変換されるため、...
-暗黙の型変換の抑止~
前述のとおり、@P1パラメタのデータ型はnvarchar型であるが、~
@P1パラメタは、その後、SQL ServerのTransact-SQLの変換関数...
このため、「パラメタのデータ型」と「DBの列のデータ型」は...
-参考
--SQL Server > Transact-SQL関数 > 変換関数~
http://msdn.microsoft.com/ja-jp/library/ms175509.aspx
***補足 [#rdf45945]
-なお、[[動的パラメタライズド・クエリ]]の「LISTタグ」を使...
ArrayListに指定したパラメタの数に合わせて、パラメタが自動...
上記の外出しのSQLファイルを編集するという方法で対策するこ...
-この場合は、
--APIからパラメタのデータ型を明示する方法を採るか、
--「LISTタグ」ではなく「VALタグ」を使い、
>各DBMSの変換関数を仕掛けたパラメタを必要な数だけ埋め込む...
**[[SQL Server 大量データ処理時の性能問題>https://techinf...
*その他 [#uc52f4b4]
**[[D層(Dao)毎のデータアクセス例>D層(Dao)の種類]] [#q...
**[[動的パラメタライズド・クエリとEF・Dapperの使い分けに...
ページ名: