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

mysql:16281

From: kubo <kubo <dbflute@xxxxxxxxxx>>
Date: Fri, 30 Oct 2015 23:20:36 +0900
Subject: [mysql 16281] JDBCドライバの rewriteBatchedStatements を利用されていますか?

久保(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 を利用されていますか?