ORMモドキ作成 (4.5)
ORMモドキのお話は昨日で終わろうかと思っていたんですが、今日、機能追加を要望されたのでその辺の話についてです(・∀・)
前にもちょっと書いたことがありますが、ODP.NETの場合、OracleCommandにArrayBindCountというプロパティがあって、配列バインドがサポートされています。
OracleCommand.ArrayBindCountに配列のサイズをセットして、OracleParameter.Valueには1件分の値ではなくて複数件分の値を配列としてセットすることにより、1回のラウンドで複数の処理を実行できるようになります。
これを利用すると、大量にデータ処理を行うときのパフォーマンスが大きく違うんですよね(・∀・)
例えば10000件INSERTに40秒かかっていた処理が1秒未満で終わるようになったりします。
っというわけで、ICollectionとTypeを引数にして、一括処理を行うGenericDaoのメソッドを作ってみました。
public class GenericDao { int BulkInsertDto(ICollection collection, Type type); int BulkUpdateDto(ICollection collection, Type type); int BulkDeleteDto(ICollection collection, Type type); }
1件処理のメソッドとは、OracleParameterの生成のあたりが異なる処理になります。
あと、OracleHelperのメソッドもArrayBindCountに対応したりとか。
まあ、やっているのはコレだけの事なんですけど(・∀・)
private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, CommandType cmdType, string cmdText, int arrayBind, OracleParameter[] parameters) { if ( conn.State != ConnectionState.Open ) { conn.Open(); } cmd.Connection = conn; cmd.CommandText = cmdText; cmd.CommandType = cmdType; cmd.BindByName = true; cmd.ArrayBindCount = arrayBind; if ( parameters != null ) { foreach( OracleParameter param in parameters ) { cmd.Parameters.Add( param ); } } }
バッチ的な処理で大量データを処理したい場合なんかには配列バインドを利用してくださいということで(´ω`)