[前][次][番号順一覧][スレッド一覧]

mysql:16285

From: kubo <kubo <dbflute@xxxxxxxxxx>>
Date: Tue, 10 Nov 2015 13:59:51 +0900
Subject: [mysql 16285] Re: [mysql 16284] Re: [mysql 16281] JDBCドライバの rewriteBatchedStatements を利用されていますか?

久保(jflute)です

yokuさん、わざわざヒアリングまでして頂き、
とても助かります。ありがとうございます!

なるほど、必要なアプリだけでピンポイントで使うみたいな感じですね。
しかも、OLTPだったら、あっても5件10件30件程度のことが多いので、
全然やらなくても大差ないってことなんでしょうね。
(それが問題になるくらいのアクセス数だったら、
そもそも違うところチューニングしないとですし)

非常に参考になります。ありがとうございます!


※次はJava寄りじゃないネタで何か話題探しますね(^^


2015-11-09 12:42 GMT+09:00 yoku ts. <yoku0825@xxxxxxxxxx>:
> こんにちは、yoku0825といいます。

>

> 職場で2人ほどJavaな人に聞いてみました。ひとりは存在を知らなかった。。

>

> * とあるバカでかいファイルをパースしてMySQLに入れるバッチでtrueにしてる

> * 確かに速いんだけど大量のオブジェクトを生成しては破棄しているので、必然的にGCの頻度は高い

>   * 実行環境に合わせてVMパラメータ調整しないと、GCにCPU食われて重たくなった挙句にOutOfMemoryError吐いて死ぬとかありそう

> * 手元では徐々にヒープ食っていくけど xGBで大丈夫そう(←チューニングしたらしい)

>

> だそうで。

>

>

> DBの観点から考えると、

> * OLTPなトラフィックだと、そんなにバルクインサートする機会がないんじゃないかなぁ

> * LAST_INSERT_ID関数を使ってると挙動が変わるだろうなぁ

> * MyISAMさんだとクラッシュした時中途半端に書いて大変そう…なのは1行でも一緒かなぁ

> とか思いました!

>

> ( ´-`).oO(Java使いさん少ないのかな…

>

>

> yoku0825

>

>

> 2015年10月30日 23:20 kubo <dbflute@xxxxxxxxxx>:

>> 久保(jflute)と申します。

>>

>> 勇気を出して ML に投げてみました。

>> (でも以前 READ COMMITTED の件で投げたことあります)

>>

>> Java寄りの話になってしまいますが…

>> MySQLのJDBCドライバだとバッチ登録(executeBatch())が、

>> 実質ただのループでのinsertになると認識しています。

>>

>> MySQL の PreparedStatement#executeBatch()

>> (java.sql ではなく com.mysql.jdbc の方、強気な名前...)

>> を見ると、executeBatchSerially() に到達して、

>> for文の中で executeUpdate() を呼んでいます(ぐるぐる系!?)。

>> JavaDoc を読んでも、

>> "... by executing them one-by-one"

>> とかっこよく綴られていてわけもなく納得しそうでした。

>>

>> ですが、MySQL の JDBC ドライバの設定で、

>> rewriteBatchedStatements を true にすれば、

>> Serially ではなく、executeBatchedInserts() が呼ばれ、

>> insert文が multi insert 方式にリライトされて、

>> 速くなるという話があります。

>> 実際、簡単な検証をしてみると速くなります

>>

>> 「おっ、じゃあこれいいじゃん!速くなるじゃん、

>> いっつも true にしてればいいんじゃないの!?」

>>

>> と単純に思うわけですが、ただ自分の周りの現場だと、

>> テストデータの登録とかではそのオプションは使いますが、

>> 実際の本番サービスでは使っていないという話を多く聞きます。

>> 色々と話を聞いてみると、要は、

>> 「使ってるってのあんま聞いたことないし、

>> デフォルトの挙動ではないので、なんとなく不安」

>> と...

>>

>> ということで、

>> 実際に本番運用のアプリのJDBC設定で、

>> 「いっつも rewriteBatchedStatements は true にしてるよ」

>> って方っていらっしゃいますでしょうか?

>> 逆に使わない理由があって、いざってとき以外は使わないぜっ、とか。

>>

>> また、これってJavaじゃなく他の言語でも同じ話なのでしょうかね...

>> (バッチ効かないのJDBCだけとかだったらちょっとショック)

>>

>> ってなところ、何か思い付くことあれば、

>> お気軽にコメント頂けると嬉しいです。

>>

>>

>> # もちろん、もし「よーし、使うぞ」ってなっても、

>> # しっかり自分たちで検証した上でやりますんで(^^


[前][次][番号順一覧][スレッド一覧]

     16281 2015-10-30 23:20 [kubo <dbflute@xxxxxx] JDBCドライバの rewriteBatchedStatements を利用されていますか?
     16284 2015-11-09 12:42 ┗["yoku ts." <yoku0825] Re: [mysql 16281] JDBCドライバの rewriteBatchedStatements を利用されていますか?
->   16285 2015-11-10 13:59  ┗[kubo <dbflute@xxxxxx] Re: [mysql 16284] Re: [mysql 16281] JDBCドライバの rewriteBatchedStatements を利用されていますか?