C/JがMySQLサーバへ送ったPacketのダンプ の続き

昨夜のエントリの続き.というかもう一昨日か.昨夜は夕方から寝て今日は早朝から活動中.

とみたまさひろさんによるMySQLプロトコル解説
http://tmtm.org/hiki/hiki.cgi?MysqlProtocol

こちらを拝見させていただくに、

  • 16777215(0xFFFFFF)の場合は、継続パケットがあることを示す。

ということのようだ。

C/J側でのダンプではそれが確認できなかったわけだが,これを確認するためmy_real_read関数のendのところにprintf文を突っ込んでコンパイルしたので再度実験.

PreparedStatement.execute()で送るデータが100bytesの場合.

[mir] remain = 0 len = 39 length = 39
[mir] remain = 0 len = 17 length = 17
[mir] remain = 0 len = 33 length = 33
[mir] remain = 0 len = 15 length = 15
[mir] remain = 0 len = 15 length = 15
[mir] remain = 0 len = 17 length = 17
[mir] remain = 0 len = 146 length = 146
[mir] remain = 0 len = 1 length = 1

remainとlengthは無視して欲しい.とりあえずlenに注目.

想定通り,かつこれは一昨日C/J側のダンプでも確認済みだ.

続いて100MB分の"AAA...A"をPreparedStatement.execute()で送信した.

[mir] remain = 0 len = 39 length = 39
[mir] remain = 0 len = 17 length = 17
[mir] remain = 0 len = 33 length = 33
[mir] remain = 0 len = 15 length = 15
[mir] remain = 0 len = 15 length = 15
[mir] remain = 0 len = 17 length = 17
[mir] remain = 0 len = 16777215 length = 1859
[mir] remain = 0 len = 16777215 length = 1135
[mir] remain = 0 len = 16777215 length = 1611
[mir] remain = 0 len = 16777215 length = 2399
[mir] remain = 0 len = 16777215 length = 2219
[mir] remain = 0 len = 16113971 length = 1799
[mir] remain = 0 len = 1 length = 1

おー、でてるでてる.ちゃんと理論通り16777215の連打だ.

PreparedStatement.execute()によるPacketは全部で6つ.

16777215 * 5 + 16113971 = 1000046 bytes でこれも想定通りだ.

がしかしC/J側のダンプは"[0][0][0][0]"のままであった.なんなんだろうかねこれは.ダンプに使用しているのはflush直前のBufferインスタンスのbyte配列だから,これを使わないで直接OutputStreamにwriteしてるのかね.

現在 AM5:00.ご飯が炊けたので朝ご飯たべよー.