バッチ処理の方法
ハーイ
アキです。
よくないバッチ処理のやり方を見てしまったのでそれについて書こうと思います。
そもそもバッチ処理とはなんぞやって人に説明すると
なんかの処理を自動でやってくれるみたいなやつです。
例えば、毎日9:00にお客さんにメールを送るようなものを作れば、
「メール送信バッチ」なんて言います。
基本的にはメール送信よりかは、大量のデータ作成とか別システムにデータを渡したりします。
じゃあよくないやり方とはなんぞや?
先に結論
・データの処理方法を考えて作る
・無駄な処理はしない
よくないやり方の具体例ですが、こんな感じでした。
お客さんから来たcsvファイルを読み込み1件ずつインサートコミット
これはやばいです。
DBサーバへのDos攻撃かと思いました。
何がやばいのかというと、1件インサートすると1回のDBサーバへの接続が発生する
コミットするとDBサーバへの接続が発生する。
全然やばくないじゃんと思うかもしれないですが、バッチ処理は大量データを扱う場合があります。
今回のバッチ、1回につき扱うデータ数、数万あります。
つまりバッチ処理が始まってから数万回も終わるまで高速でDBサーバに接続しまくる訳ですね。
サーバ潰す気か
じゃあどうすればいいのか
方法としては2つあります。
- コミットを1件ずつではなく、最後に1回のみにする。
- csvをDBにインポートさせる
1はDB接続がほぼ半分に(パフォーマンスはそれ以上)
2はDB接続が1回に!!!
postgresならcopy句がありますね。
すごく便利です。
もし、csvのファイルの中身をチェックしたいとかなら、一旦全部チェックしてからOKのやつだけ取り込むとか、色々やりようはあるからそこは考えてね。
にしても1処理で数万回のDB接続を許容してるってセキュリティ面大丈夫なのか。。?