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