バッチ処理方式
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「...
-戻る
--[[FAQ - D層フレームワーク]]
--[[アプリケーション設計のポイント]]
---[[データアクセス]]
---バッチ処理方式
*目次 [#m42eecfa]
#contents
*概要 [#ka1eeebb]
バッチ(EXE)の実装方式
**注意点 [#e5b79740]
バッチ処理の方式を検討する上で以下の点に注意する。
-例えば1万件の処理を行うにあたり、1万件分のデータをメモ...
すると、ページングによる性能劣化や、メモリ リーク、アウト...
-シーケンシャル アクセスの中間ファイルを使う概念が無く、...
すると、無駄なDBMSとのプロセス間通信のラウンドトリップや...
-トランザクション分割の概念がなく、1つの巨大なトランザク...
すると、(ロング トランザクションでは)ロックを長時間ホー...
-リランを行う概念がなく、1レコードでも失敗すると全ての処...
すると、リラン時に、常に最初からの開始となってしまうため、~
処理時間が長いバッチは時間内に処理を完了することができな...
-並列処理前提のプログラムと単一処理前提のプログラムの違い...
すると、後々、処理の多重化(システム リソースを使い切って...
-実行ファイルを分割する概念がなく、全て1つの実行ファイル...
すると、タスクを組み合わせて1つのジョブにすることができ...
**処理フロー [#d1cac2b3]
集計処理の場合、DBMSを使用しない場合は、コミットインター...
#ref(BatchSequence.png,left,nowrap,バッチ処理のフロー)
*詳細 [#j306ccc8]
**フレームワーク [#c9a75c63]
Spring Batch を参考に方式を参考にして、上記の問題を起こさ...
Spring Batchの多重化&リランは、オンライン側を排他で止め...
***トランザクション範囲 [#t55db9f0]
反復不可、ファントムの問題は無い前提のため、トランザクシ...
(コミット インターバル分、データを渡す)
↓
Read ────>(処理 ──> Write)
↑ │
└───────────┘loop
***多重化方法 [#mea3ddb4]
-バッチEXEを多重起動する(Javaと異なりマルチスレッド化す...
-それぞれのバッチEXEが処理する結果セットを分割する。
-これには、バッチEXE起動時に結果セット取得に使用する~
検索条件(分割キー、主キー範囲)のコマンドライン引数を変...
***リラン [#y183f3c4]
-異常終了時は、所定のディレクトリに次回、再開の行番号を出...
-多重起動することを考慮すると下記を1つのファイルで管理す...
--「結果セット取得に使用する検索条件」
--「再開の行番号(処理済みの行番号)」
***分散多重処理対応 [#r6b1c914]
複数のバッチ処理サーバ。
分散多重処理の状態の一元管理には、~
別途管理データベースなどの利用が~
必要になることがあり大掛かりになる。
***バッチ・テンプレート [#cfbc815d]
バッチ・テンプレートには上記の概念がある程度実装されてい...
-OpenTouryo/root/programs/CS/Samples/Bat_sample at develo...
https://github.com/OpenTouryoProject/OpenTouryo/tree/deve...
**大量データの取扱 [#be271701]
大凡、下記の選択肢がある。
***[[バッチクエリ作成支援機能]] [#v0b8a9bd]
***配列バインドの実行方法 [#ze851f70]
配列バインドは、ODP.NETやHiRDBなど、ごく少数のデータ・プ...
-サンプル・コード(ODP.NET)
--SQL定義
INSERT INTO XXX(AAA, BBB, CCC) VALUES(:P1, :P2, :P3);
--コード
// 配列データを作成
object[] temp1 = new string[] { "aaa", "bbb", "ccc" };
object[] temp2 = new string[] { "aaa", "bbb", "ccc" };
object[] temp3 = new string[] { "aaa", "bbb", "ccc" };
// ODP.NETの配列バインドの場合は、ArrayBindCountを指定
((DamOraOdp)this._dam).DamOracleCommand.ArrayBindCount =...
// ODP.NET配列バインドの場合は、OracleDbTypeの型情報が必要
((BaseDam)this._dam).SetParameter("P1", temp1, OracleDbT...
((BaseDam)this._dam).SetParameter("P2", temp2, OracleDbT...
((BaseDam)this._dam).SetParameter("P3", temp3, OracleDbT...
--参考
---Oracle Data Provider for .NET開発者ガイド 11g リリース...
http://otndnld.oracle.co.jp/document/products/oracle11g/1...
---How To資料 : ODP.NETデータベース・コマンドへの配列の...
http://otndnld.oracle.co.jp/tech/windows/odpnet/howto/04_...
---ODP.NETファーストステップ(1)> ODP.NETでOracle固有の...
http://www.atmarkit.co.jp/fdb/rensai/odpdotnet01/odpdotne...
また、[[動的パラメタライズド・クエリ分析ツール]]も、この...
**[[DataSet、DataTable>https://techinfoofmicrosofttech.os...
***概要 [#g606b757]
-一般的に、[[DataSet、DataTable>https://techinfoofmicroso...
--[[DataSet、DataTable>https://techinfoofmicrosofttech.os...
(「Fill」メソッドで充填した[[DataSet、DataTable>https://...
--編集結果は、DataRowの「RowState」プロパティから確認でき...
---追加:DataRowState.Added
---更新:DataRowState.Modified
---削除:DataRowState.Deleted
--楽観排他の実装をサポートするものに、以下の列挙型がある。
---DataRowVersionの「Original」列挙子(楽観排他に利用する...
dr["(列名)", DataRowVersion.Original] (drはDataRowク...
---Where句の全列に、このオリジナル データを、検索条件とし...
--RowStateを活用することで、[[DataSet、DataTable>https://...
[[DataAdapter、TableAdapter>https://techinfoofmicrosoftte...
-本フレームワークでも、この方式のバッチ更新処理をサポート...
--[[自動生成Dao>D層(Dao)の種類#t389966a]]を利用して処理...
--バッチ更新処理(C/S2層)のサンプル プログラムを参考にす...
---「~ \root\programs\C#\Samples\2CS_sample\DenDaoAndBat...
---注意点は、複数ポストバックに跨ってデータ編集を行うため...
・編集中の[[DataSet、DataTable>https://techinfoofmicrosof...
・この様な処理方式の場合、サーバ メモリの消費量などに注意...
***補足 [#rb61c5c6]
-.NETでは、CommandBuilderにより、バッチ更新用[[DataAdapte...
[[DataAdapter、TableAdapter>https://techinfoofmicrosoftte...
-しかし、CommandBuilderには以下のような問題があり、本フレ...
--SqlCommandBuilder仕組みを知らないとコードを理解し難い。~
仕組みがブラックボックス、この方式を採用している例が少な...
--テーブル単位のSELECTにしか対応していない。~
JOINのSELECTでは利用できないため、全体の方式を統一できな...
--count = dataAdapter.Update(dtClient)で、~
どの行がタイムスタンプアンマッチになったか?などが把握で...
--INSERT処理
---IDENTITY属性のあるカラムもINSERT文に含めてしまう。
---新規行を追加するだけの場合、SQLのINSERT文を発行した方...
(参照処理を伴わない、更新処理全体に対して言える。)
--楽観排他方式
---全列を旧行バージョン情報で比較する楽観排他方式
---性能的に問題(WHERE文に全カラムを含めるため)。
---SQLトレースも上記のパラメタが多くなるので分かりにくく...
---timestamp列を含んだ更新ロジックを生成する機能は、サポ...
---また、GETDATE関数などをSQLに含められないため、SQLで~
柔軟に更新日付を付与したり、タイムスタンプを更新したりで...
※ ただし、マスタメンテなど限られた範囲で、CommandBuilder...
**性能を考慮した[[動的パラメタライズド・クエリ]]の連続実...
-[[動的パラメタライズド・クエリ]]は、XML編集を伴うので、~
XMLタグの数が多くなる場合(100タグ以上が目安)、性能が劣...
--このため列数が非常に多いテーブルでは更に問題となり易い。
--このようなテーブルに大して[[動的パラメタライズド・クエ...
連続実行する場合、APサーバ側に負荷がかかり、ボトルネック...
---大量データ更新を行うバッチ処理で問題となり易い。
---自動生成されたUpdate文は、全カラム分のXMLタグを持つ。
***自作Daoで解決 [#r8d98838]
-対策~
自作Daoでは動的パラメタライズド・クエリ処理後のクエリを再...
--[[動的パラメタライズド・クエリ]]は一度実行すると、内部...
XML([[動的パラメタライズド・クエリ]])からSQL([[静的パ...
--このため、このSQL([[静的パラメタライズド・クエリ]])を...
SQL([[静的パラメタライズド・クエリ]])の連続実行となり、...
--しかし、一度パラメタライズド・クエリを実行するとCommand...
各DamのCommandオブジェクト プロパティから各データプロバイ...
Command.Parameters.Clear()メソッドを呼び出し、この後、パ...
-サンプル・コード~
なお、この処理は、Commandオブジェクトのクリアが可能な[[自...
object obj;
// 動的SQLを読み込む場合。
this.SetSqlByFile2("DaoShippers_D1_Insert.xml");
// この状態では動的SQL(IsDPQプロパティを確認)。
System.Diagnostics.Debug.WriteLine(this.GetDam().IsDPQ.T...
// 実行1回目
this.SetParameter("CompanyName", "1回目");
this.SetParameter("Phone", "1回目");
obj = this.ExecInsUpDel_NonQuery();
// 以降は静的SQLとなる(IsDPQプロパティを確認)。
System.Diagnostics.Debug.WriteLine(this.GetDam().IsDPQ.T...
// 前回の実行で設定したパラメタ(Command.Parameters)を...
((DamSqlSvr)this.GetDam()).DamSqlCommand.Parameters.Cle...
// 実行2回目
this.SetParameter("CompanyName", "2回目");
this.SetParameter("Phone", "2回目");
obj = this.ExecInsUpDel_NonQuery();
// 前回の実行で設定したパラメタ(Command.Parameters)を...
((DamSqlSvr)this.GetDam()).DamSqlCommand.Parameters.Cle...
// 実行3回目
// ・・・
***[[自動生成Daoで解決>自動生成Dao性能対策]] [#u9c20643]
-自動生成Daoにクエリを再利用するクエリ・キャッシュ機能が...
-テンプレート修正だけなので旧バージョンと互換性があり、v0...
**オンラインバッチ [#j8248c0c]
Windows NT系カーネルでは、
-コマンドライン起動で
--startコマンドを用いなければ同期実行
--startコマンドを用いれば非同期実行
>が可能である。
-Processクラスを使用する場合は、
--Startメソッドを用いれば非同期実行
--WaitForExitメソッドを用いれば同期実行
>となる。
なお、非同期実行を行う場合、連打できてしまうので、~
Semaphoreなどを使用して多重実行を防ぐ必要がある。
-参考
--MSDNライブラリ
---System.Diagnostics.Processクラス~
https://msdn.microsoft.com/ja-jp/library/system.diagnosti...
---MSDNライブラリ > System.Threading.Semaphoreクラス~
http://msdn.microsoft.com/ja-jp/library/system.threading....
***同期実行 [#l9f02e53]
ASP.NETからの同期実行 & セマフォ を使用してバッチの多重...
これではオンライン処理が待機によりスレッドを占有してしま...
***非同期実行 [#d34f3d0c]
非同期実行では上記問題は発生しないが、場合によっては、~
多重度・リトライ、結果通知などの制御・実装が必要となって...
-非同期実行で多重度・リトライなどの制御が必要になる場合は...
キュー(ディスク、RDB、MQなど)を用意して多重度・リトライ...
-実行結果の通知方法(プッシュ型通知、プル型通知)を検討し...
多重度・リトライ、結果通知などの制御・実装が必要となる場...
終了行:
「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「...
-戻る
--[[FAQ - D層フレームワーク]]
--[[アプリケーション設計のポイント]]
---[[データアクセス]]
---バッチ処理方式
*目次 [#m42eecfa]
#contents
*概要 [#ka1eeebb]
バッチ(EXE)の実装方式
**注意点 [#e5b79740]
バッチ処理の方式を検討する上で以下の点に注意する。
-例えば1万件の処理を行うにあたり、1万件分のデータをメモ...
すると、ページングによる性能劣化や、メモリ リーク、アウト...
-シーケンシャル アクセスの中間ファイルを使う概念が無く、...
すると、無駄なDBMSとのプロセス間通信のラウンドトリップや...
-トランザクション分割の概念がなく、1つの巨大なトランザク...
すると、(ロング トランザクションでは)ロックを長時間ホー...
-リランを行う概念がなく、1レコードでも失敗すると全ての処...
すると、リラン時に、常に最初からの開始となってしまうため、~
処理時間が長いバッチは時間内に処理を完了することができな...
-並列処理前提のプログラムと単一処理前提のプログラムの違い...
すると、後々、処理の多重化(システム リソースを使い切って...
-実行ファイルを分割する概念がなく、全て1つの実行ファイル...
すると、タスクを組み合わせて1つのジョブにすることができ...
**処理フロー [#d1cac2b3]
集計処理の場合、DBMSを使用しない場合は、コミットインター...
#ref(BatchSequence.png,left,nowrap,バッチ処理のフロー)
*詳細 [#j306ccc8]
**フレームワーク [#c9a75c63]
Spring Batch を参考に方式を参考にして、上記の問題を起こさ...
Spring Batchの多重化&リランは、オンライン側を排他で止め...
***トランザクション範囲 [#t55db9f0]
反復不可、ファントムの問題は無い前提のため、トランザクシ...
(コミット インターバル分、データを渡す)
↓
Read ────>(処理 ──> Write)
↑ │
└───────────┘loop
***多重化方法 [#mea3ddb4]
-バッチEXEを多重起動する(Javaと異なりマルチスレッド化す...
-それぞれのバッチEXEが処理する結果セットを分割する。
-これには、バッチEXE起動時に結果セット取得に使用する~
検索条件(分割キー、主キー範囲)のコマンドライン引数を変...
***リラン [#y183f3c4]
-異常終了時は、所定のディレクトリに次回、再開の行番号を出...
-多重起動することを考慮すると下記を1つのファイルで管理す...
--「結果セット取得に使用する検索条件」
--「再開の行番号(処理済みの行番号)」
***分散多重処理対応 [#r6b1c914]
複数のバッチ処理サーバ。
分散多重処理の状態の一元管理には、~
別途管理データベースなどの利用が~
必要になることがあり大掛かりになる。
***バッチ・テンプレート [#cfbc815d]
バッチ・テンプレートには上記の概念がある程度実装されてい...
-OpenTouryo/root/programs/CS/Samples/Bat_sample at develo...
https://github.com/OpenTouryoProject/OpenTouryo/tree/deve...
**大量データの取扱 [#be271701]
大凡、下記の選択肢がある。
***[[バッチクエリ作成支援機能]] [#v0b8a9bd]
***配列バインドの実行方法 [#ze851f70]
配列バインドは、ODP.NETやHiRDBなど、ごく少数のデータ・プ...
-サンプル・コード(ODP.NET)
--SQL定義
INSERT INTO XXX(AAA, BBB, CCC) VALUES(:P1, :P2, :P3);
--コード
// 配列データを作成
object[] temp1 = new string[] { "aaa", "bbb", "ccc" };
object[] temp2 = new string[] { "aaa", "bbb", "ccc" };
object[] temp3 = new string[] { "aaa", "bbb", "ccc" };
// ODP.NETの配列バインドの場合は、ArrayBindCountを指定
((DamOraOdp)this._dam).DamOracleCommand.ArrayBindCount =...
// ODP.NET配列バインドの場合は、OracleDbTypeの型情報が必要
((BaseDam)this._dam).SetParameter("P1", temp1, OracleDbT...
((BaseDam)this._dam).SetParameter("P2", temp2, OracleDbT...
((BaseDam)this._dam).SetParameter("P3", temp3, OracleDbT...
--参考
---Oracle Data Provider for .NET開発者ガイド 11g リリース...
http://otndnld.oracle.co.jp/document/products/oracle11g/1...
---How To資料 : ODP.NETデータベース・コマンドへの配列の...
http://otndnld.oracle.co.jp/tech/windows/odpnet/howto/04_...
---ODP.NETファーストステップ(1)> ODP.NETでOracle固有の...
http://www.atmarkit.co.jp/fdb/rensai/odpdotnet01/odpdotne...
また、[[動的パラメタライズド・クエリ分析ツール]]も、この...
**[[DataSet、DataTable>https://techinfoofmicrosofttech.os...
***概要 [#g606b757]
-一般的に、[[DataSet、DataTable>https://techinfoofmicroso...
--[[DataSet、DataTable>https://techinfoofmicrosofttech.os...
(「Fill」メソッドで充填した[[DataSet、DataTable>https://...
--編集結果は、DataRowの「RowState」プロパティから確認でき...
---追加:DataRowState.Added
---更新:DataRowState.Modified
---削除:DataRowState.Deleted
--楽観排他の実装をサポートするものに、以下の列挙型がある。
---DataRowVersionの「Original」列挙子(楽観排他に利用する...
dr["(列名)", DataRowVersion.Original] (drはDataRowク...
---Where句の全列に、このオリジナル データを、検索条件とし...
--RowStateを活用することで、[[DataSet、DataTable>https://...
[[DataAdapter、TableAdapter>https://techinfoofmicrosoftte...
-本フレームワークでも、この方式のバッチ更新処理をサポート...
--[[自動生成Dao>D層(Dao)の種類#t389966a]]を利用して処理...
--バッチ更新処理(C/S2層)のサンプル プログラムを参考にす...
---「~ \root\programs\C#\Samples\2CS_sample\DenDaoAndBat...
---注意点は、複数ポストバックに跨ってデータ編集を行うため...
・編集中の[[DataSet、DataTable>https://techinfoofmicrosof...
・この様な処理方式の場合、サーバ メモリの消費量などに注意...
***補足 [#rb61c5c6]
-.NETでは、CommandBuilderにより、バッチ更新用[[DataAdapte...
[[DataAdapter、TableAdapter>https://techinfoofmicrosoftte...
-しかし、CommandBuilderには以下のような問題があり、本フレ...
--SqlCommandBuilder仕組みを知らないとコードを理解し難い。~
仕組みがブラックボックス、この方式を採用している例が少な...
--テーブル単位のSELECTにしか対応していない。~
JOINのSELECTでは利用できないため、全体の方式を統一できな...
--count = dataAdapter.Update(dtClient)で、~
どの行がタイムスタンプアンマッチになったか?などが把握で...
--INSERT処理
---IDENTITY属性のあるカラムもINSERT文に含めてしまう。
---新規行を追加するだけの場合、SQLのINSERT文を発行した方...
(参照処理を伴わない、更新処理全体に対して言える。)
--楽観排他方式
---全列を旧行バージョン情報で比較する楽観排他方式
---性能的に問題(WHERE文に全カラムを含めるため)。
---SQLトレースも上記のパラメタが多くなるので分かりにくく...
---timestamp列を含んだ更新ロジックを生成する機能は、サポ...
---また、GETDATE関数などをSQLに含められないため、SQLで~
柔軟に更新日付を付与したり、タイムスタンプを更新したりで...
※ ただし、マスタメンテなど限られた範囲で、CommandBuilder...
**性能を考慮した[[動的パラメタライズド・クエリ]]の連続実...
-[[動的パラメタライズド・クエリ]]は、XML編集を伴うので、~
XMLタグの数が多くなる場合(100タグ以上が目安)、性能が劣...
--このため列数が非常に多いテーブルでは更に問題となり易い。
--このようなテーブルに大して[[動的パラメタライズド・クエ...
連続実行する場合、APサーバ側に負荷がかかり、ボトルネック...
---大量データ更新を行うバッチ処理で問題となり易い。
---自動生成されたUpdate文は、全カラム分のXMLタグを持つ。
***自作Daoで解決 [#r8d98838]
-対策~
自作Daoでは動的パラメタライズド・クエリ処理後のクエリを再...
--[[動的パラメタライズド・クエリ]]は一度実行すると、内部...
XML([[動的パラメタライズド・クエリ]])からSQL([[静的パ...
--このため、このSQL([[静的パラメタライズド・クエリ]])を...
SQL([[静的パラメタライズド・クエリ]])の連続実行となり、...
--しかし、一度パラメタライズド・クエリを実行するとCommand...
各DamのCommandオブジェクト プロパティから各データプロバイ...
Command.Parameters.Clear()メソッドを呼び出し、この後、パ...
-サンプル・コード~
なお、この処理は、Commandオブジェクトのクリアが可能な[[自...
object obj;
// 動的SQLを読み込む場合。
this.SetSqlByFile2("DaoShippers_D1_Insert.xml");
// この状態では動的SQL(IsDPQプロパティを確認)。
System.Diagnostics.Debug.WriteLine(this.GetDam().IsDPQ.T...
// 実行1回目
this.SetParameter("CompanyName", "1回目");
this.SetParameter("Phone", "1回目");
obj = this.ExecInsUpDel_NonQuery();
// 以降は静的SQLとなる(IsDPQプロパティを確認)。
System.Diagnostics.Debug.WriteLine(this.GetDam().IsDPQ.T...
// 前回の実行で設定したパラメタ(Command.Parameters)を...
((DamSqlSvr)this.GetDam()).DamSqlCommand.Parameters.Cle...
// 実行2回目
this.SetParameter("CompanyName", "2回目");
this.SetParameter("Phone", "2回目");
obj = this.ExecInsUpDel_NonQuery();
// 前回の実行で設定したパラメタ(Command.Parameters)を...
((DamSqlSvr)this.GetDam()).DamSqlCommand.Parameters.Cle...
// 実行3回目
// ・・・
***[[自動生成Daoで解決>自動生成Dao性能対策]] [#u9c20643]
-自動生成Daoにクエリを再利用するクエリ・キャッシュ機能が...
-テンプレート修正だけなので旧バージョンと互換性があり、v0...
**オンラインバッチ [#j8248c0c]
Windows NT系カーネルでは、
-コマンドライン起動で
--startコマンドを用いなければ同期実行
--startコマンドを用いれば非同期実行
>が可能である。
-Processクラスを使用する場合は、
--Startメソッドを用いれば非同期実行
--WaitForExitメソッドを用いれば同期実行
>となる。
なお、非同期実行を行う場合、連打できてしまうので、~
Semaphoreなどを使用して多重実行を防ぐ必要がある。
-参考
--MSDNライブラリ
---System.Diagnostics.Processクラス~
https://msdn.microsoft.com/ja-jp/library/system.diagnosti...
---MSDNライブラリ > System.Threading.Semaphoreクラス~
http://msdn.microsoft.com/ja-jp/library/system.threading....
***同期実行 [#l9f02e53]
ASP.NETからの同期実行 & セマフォ を使用してバッチの多重...
これではオンライン処理が待機によりスレッドを占有してしま...
***非同期実行 [#d34f3d0c]
非同期実行では上記問題は発生しないが、場合によっては、~
多重度・リトライ、結果通知などの制御・実装が必要となって...
-非同期実行で多重度・リトライなどの制御が必要になる場合は...
キュー(ディスク、RDB、MQなど)を用意して多重度・リトライ...
-実行結果の通知方法(プッシュ型通知、プル型通知)を検討し...
多重度・リトライ、結果通知などの制御・実装が必要となる場...
ページ名: