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

毎度お騒がせしてますが,やっとこC/J側からもServer側と同じPacket Headerダンプ取れました.

50MB送信した際のPreparedStatement.execute()実行時のもの.

HEADER:[-1][-1][-1][0]
HEADER:[-1][-1][-1][1]
HEADER:[-80][-16][-6][2]

MysqlIO.sendSplitPacketsメソッドが呼ばれるとき,即ち送信クエリ長が16MB以上であるときには,PreparedStatement.executeメソッドにてnewあるいは再利用取得されたBufferオブジェクトではなく,それとは別のBufferオブジェクト(headerPacket)を作成してこっちに書き込んでOutputStream.write()しています.

なのでいくらflush直前のBufferオブジェクトをダンプさせてもsendSplitPackets時にはでなかったわけで.orz

また接続プロパティ"traceProtocol=true"を設定するとC/J自身の機能によってPacketがダンプされるわけですが,traceProtocolはsendSplitPackets時には何も出力しません(ダンプサイズが大きくなるからでしょうか).sendSplitPacketsメソッドがなぜ引数のBufferインスタンスとは別のBufferインスタンスを作るのかは,調べ中.



ああ,分かった.元のPacketオブジェクトは16MB分割する前のPacketで,変数headerPacketは分割後のPacketというわけで.System.arrayCopy()しているのもSoftReferenceを使っているのも,何度もnew byte[256*256*256]を行うのを避けるためですね.

これでやっと全て疑問解消したので,Integer.MAX_VALUEよりも大きなデータを送る実装に帰ります・・・.