シス、再び受託でDB屋さんと流浪する人のブログです。Connector/J(mariadb-client-java)」があります。mariadb.comforkって書いたけど、connector/Jのソースからフォークしたのか、DB本体はforkしたけどJDBCドライバは別で作ったのかは、そのへんの歴史は正直知らないです、ごめんなさい。URLを「jdbc:mysql://」で書いても「jdbc:mariadb://」で書いても、ホストやポートが正しければ繋がる子です。Connector/J」を推す話がちらほら見かけられます。Connector/J」のバージョンが古い件jarだし、yumでいれなくても、開発したアプリで必要な他のjarと一緒にデプロイすればヨクネ?って話はともかく。1.3.6」って、2016年2月29日リリースですよ。https://mariadb.com/kb/en/library/mariadb-connector-j-136-release-notes/まあ、眼の前で必要としているシステムに組み込んで動けば何でもいいwので、動かしてみます。該当のバージョンのライブラリをmariadbのサイトから入手して、MySQL版のconnector/Jと同じスクリプトを回してみます。Javaソースの準備ほぼほぼ前回の流用です。}}コンパイル&実行こちらも前回と同じ条件で、MariaDBのConnector/J版を用意。BulkTestMariaDB実際にJDBC経由でバルクインサートを実行してみる。デフォルトの状態から。|+---------------+---------------+問題なく、動きました。max_allowed_packetを小さくしてみる1MBまで小さくして、同じソースを実行してみます。'PRIMARY'」って、主キーの重複違反!ロジック上、どうやっても主キー重複が発生しないはずなんですけど。STATUSのカウンタもリセットしてありますので、さっそくCom_insertの値を見てみます。Connector/Jと同じ挙動ならば、1,000件ずつのバルクインサートをJDBCドライバが2回に分けて発行した、その2回目にいる番号なので、そんなもんですね。2回目の531番が主キー違反で落ちるのか。Workbenchで探りを入れてみます。1回目の最後に、?519のあと、531が入っている!2回目の最初に、?521から始まってる!520はドコ?!更に進むと、531がもう1回来てる!そりゃ、主キー違反になりますがな。Connector/Jは、バルクインサート文を自動で構築してくれる機能がある。Connector/Jは、バルクインサート文自動生成機能では、max_allowed_packetの設定に合わせて、バルクインサートのSQL文の大きさを調整してくれる。ここでカラクリ前回のJavaソース読んで気づいた人がいるかも知れませんが、531だけ、わざと格納する文字列を短くしてます。通常「a」が1,000個ですが、data2列に入れる文字列を「b」1個だけにしました。コレ、531番目も同じようにdata2列に「a」を1,000個入れるロジックだと落ちないんです。いまはテストデータですが、リアルに開発するとき、バルクで取り込むデータの長さってレコードによってまちまちであることのほうが普通ですから、それを模して、長さの違うデータを意図的にインサートさせるためにやってみたものです。mariadb-connector/Jの場合バルクインサート文自動生成機能では、max_allowed_packetの設定に合わせて、バルクインサートのSQL文の大きさを調整してくれる。バルクインサート文の自動生成時、max_allowed_packet値に近づくと、より後方にあるデータで短くて詰め込めそうなものを探して「飛び級?」で入れている。飛び級?によってスキップしたレコードの一部を失ったり、飛び級したレコードを二重登録してしまう、という不具合が「1.3.6」には潜んでいる。いまはテストデータですが、リアルに開発するとき、バルクで取り込むデータの長さってレコードによってまちまちであることのほうが一般的ですから、このバグを踏む可能性ってフツーにあるわけですね。最新だとバグってない。(2018-08-17)」と、比較的あたらしいものでした。古いのと新しいのを比較して、どっちが優れているとか言っても仕方がないですね。(2018-09-07)」で試したところ、この問題は発生しませんでした。安心して新しいやつを使っていただければと思います。バグレポが見つからない。レポが見つからないので、いつFixしたのかもわからない。力技で、いつ治ったのか探してみました。1つずつ、バージョンを上げていったところ、トンデモナイやつがいた。1つ上のもの「1.3.7」を入手して、これを使って実行したら、衝撃の結末が待っていました。|+---------------+---------------+エラーが出ない!でも、件数が正しくない!細かいログは示しませんが、調べた結果、以下のことが起きていました。1~9999(4桁以下)各1~519だけ実行、520以上はINSERT文が来ていない。