Open棟梁 wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

パラメタライズド・クエリ

動的パラメタライズド・クエリの仕様

パラメタライズド・クエリのバインド変数への

バインド方法は?

名前バインドにのみ対応しています。このため、どのデータプロバイダであっても、順番バインドをサポートしません。

パラメタ属性指定方法は?

ストアド プロシジャ、無名PL/SQLブロックの実行や、戻り値の取得などは可能か?

ストアド プロシジャでも動的パラメタライズド・クエリ機能を使用できます。

ストアド プロシジャの実行方法

ストアド プロシージャの実行も可能である。

汎用Dao(CmnDao)経由でのストアド実行

デッドロック、ロックタイムアウト、「ユニークキーの重複」などの例外をリトライしたい。

B層ベースクラス2の例外処理をカスタマイズして、 リトライ対象例外を業務例外に振り替え、P層に正常系の戻り値が戻るようにします。

SetUserParameter()メソッドの利用ポリシーをどのように考えるべきか?

D層自動生成ツールで楽観排他を、どのように実装するのか?

OracleのCLOBをODP.NET経由でどう扱うのか?

サンプル

参考

性能

コマンド タイムアウト値を設定するにはどうすれば良いか?

共通のコマンド タイムアウト値をconfigファイルに設定できます。

DataTable?を利用している場合に処理時間が遅い

概要

100,000件 selectの処理を調査したところ、
単体でのSQL実行(SQL Server上でのselect文発行)のレスポンスが1秒程度で、
データ取得後のDataTable?へのデータ設定で、8秒を使用しているようでした。

対策

Datatableは少々重いので、大量データには不向きかもしれません。
DataTable?ではなくDataReader?を使用するAPIを使用すると良いかと思います。

自動生成Daoで使用する場合は、テンプレートを修正すればいけると思います。
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/files/tools/DGenTemplates/DaoTemplate2.cs#L347

ODP.NET、HiRDBの配列バインドをサポートしているか?

ポイント

ODP.NET配列バインドの場合、

サンプル

以下、ODP.NETのサンプル(自作Daoクラス)。

// SQLを設定
this.SetSqlByCommand("INSERT INTO XXX(AAA, BBB, CCC) VALUES(:P1, :P2, :P3);");

// ODP.NETの配列バインドの場合は、ArrayBindCountを指定
((DamOraOdp)this._dam).DamOracleCommand.ArrayBindCount = temp.Length;

// 配列データを作成
object[] temp1 = new string[] { "aaa", "bbb", "ccc" };
object[] temp2 = new string[] { "aaa", "bbb", "ccc" };
object[] temp3 = new string[] { "aaa", "bbb", "ccc" };

// 配列データをバインド(型情報が必要)
this._dam.SetParameter("P1", temp1, OracleDbType.Varchar2);
this._dam.SetParameter("P2", temp2, OracleDbType.Varchar2);
this._dam.SetParameter("P3", temp3, OracleDbType.Varchar2);

SQLで暗黙の型変換が発生し、検索処理性能が大幅に劣化する。

対策

参考

動的パラメタライズド・クエリを記述するXMLファイルのサイズなどにより性能が劣化しないか?

概要

1つのXMLファイル中に200-300タグを超えてくると、オンライン処理でも性能が劣化が始まりますので、
不要なタグは記述しないようにお願いします(XMLファイル サイズについては、問題ないようです)。

詳細

上記のgist.github.comの性能測定の結果は、

測定

具体的な性能は、動的パラメタライズド・クエリ分析ツールで測定可能です。

解決方法

大量データ処理(バッチ更新処理)をサポートしているか?

概要

大量データ処理(バッチ更新処理)で

性能が出ません。

対策

従って、大量データ処理の場合、バッチ処理方式を参照し、

などの技法を活用して、パフォーマンスを出す必要があります。

エラー

動的パラメタライズド・クエリで、[<]、[>]などの文字が含まれると適切に実行されない。

XML内部で使用不可能な文字列は、HTMLエンコーディングが必要になります。

これらの文字列が含まれる場合は、下記の現象が発生します。

動的パラメタライズド・クエリでXMLが編集されずに、そのまま実行される。

として実行されるため、この現象は、不正なフォーマットのXMLを投げている事に起因します。

して下さい。

自動生成Daoの Update処理で「ORA-00972 "識別子が長すぎます"」が発生する。

検索条件のIN句(副問合せ)を動的化したいがエラーとなる。

検索条件のIN句(副問合せ)を動的化する場合、

動的パラメタライズド・クエリ

使用して下さい。

Daoの使い分け

更新系処理

自動生成Dao

単一テーブルからのSELECT

自動生成Dao

複数テーブルなど複雑なSELECT

汎用Dao(CmnDao)

制限事項

動的パラメタライズド・クエリのパラメタ名

アルゴリズム

含むXMLタグを「再帰的」に検索し、

としています。

結論

XMLタグの検索方法が再帰的なので、

↓↓↓

SELECT * FROM Shippers
  WHERE
    ShipperID =@p1 and ShipperID =@p1

サポート

Like句を使用した曖昧検索をサポートしているか?

LINQ や Entity Frameworkをサポートしているか?

任意のDLL(Assembly)からの埋込SQLのロードをサポートしているか?

Azureスイッチ

PaaSなど、EntryAssembly?が別になる様な場合では、Azureスイッチを指定することで対応できます。

カスタマイズ方法

Azureスイッチを使用すると、他のリソースの埋め込み先にも影響するので)
任意のDLL(Assembly)から埋込SQLリソースをロードを行う場合。

ようにします。

どのように渡すか?になりますが、この部分はプロジェクト毎に検討ください。

デバッグ

以下のサイトのコードを参考にして、対象のAssemblyを取得し、
Assembly.GetManifestResourceNames?プロパティで、
Resource一覧が取得して、リソースが埋め込まれているか確認します。

※ 環境によって、フォルダ階層が名前空間に反映されないことがある。

コード

参考

型キャスト

doc


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS