Connector/J

Connector/J 5.1とServer Side Prepared Statement

ここ数日「MySQL + Connector/J(JDBCドライバ) + プリペアードステートメント」の話題がちらほら出ています。正確に把握はしていないですがSQLインジェクション対策→PreparedStatementという流れできた話のようです。 徳丸浩の日記 - JavaとMySQLの組み合わ…

5.1.0 α版リリース

MySQLのJDBCドライバであるConnector/Jの ver5.1.0-alphaがリリースされました!!http://dev.mysql.com/downloads/connector/j/5.1.htmlver5.1系はJDBC 4.0対応が主眼のツリーなのですが、もうひとつ隠れたポイントがあります。なんと、オイラの名前がauthorと…

最新のConnector/J初期処理シーケンス

久々にC/Jの動きをMySQLのGeneral Logで観察したのですが、接続時の処理が以下のようになってました。Connector/J 3.1.13にて。 1 Connect root@localhost on test 1 Query SET NAMES latin1 1 Query SET character_set_results = NULL 1 Query SHOW VARIABL…

複数文字コードを使ったテーブルへのINSERTの件 再考

WikiにIntroducerを使って以下のようにC/Jは実行すべきと書いていたけれども, INSERT INTO t1 (c1, c2) VALUES ('ああ', _utf8 'ああ');これは間違いで,こうでなければ成らない. INSERT INTO t1 (c1, c2) VALUES ('ああ', _utf8 '縺ゅ≠');なぜかというと…

ResultSet.getNXXX() は対象Fieldのcharsetがutf8以外の場合はSQLException

投げますよ.理由 今回のNATIONAL CHARACTER SET CONVERTIONにより追加定義されたAPIは,"NATIONAL CHARACTER"型のフィールドへアクセスするために定義されたAPIである.他の文字コードを使用するフィールドへのアクセスは従来通りのAPIで十分に可能なわけで…

NATIONAL CHARACTER SET CONVERSION 実装完了

終わったー!! 実質1ヵ月半かかったw 駄目だトロ過ぎるw 最初はかなり力不足だったからなw コーディング自体はほとんど最後の1週間でやってるし.MM師匠が自分でやったら3日くらいで終わるのか? 生産性10倍の法則 orz【BLOBおよびCLOBのサポートを強化…

useUnicode=true&characterEncoding=foobar

長い間,MySQLを使う日本人ユーザはcharacterEncodingとともにuseUnicode=trueを指定してきたと思う.かく言う自分もつい今日まで指定してきたもんだ.がしかし,useUnicode=trueはもういらないってことにようやく気づいた.というかテストコード上でわざとf…

UpdatableResultSet.updateNXXX()完了

さてと,後残るは・・・ CallableStatement.setNXXX() CallableStatement.getNXXX() SQLInput.readNXXX() SQLOutput.writeNXXX() 結構あるなー.結局NATIONAL CHARACTER対応だけで手一杯,しかもギリギリ終わるかどうかってところだ.明日1日で終わらせんと.JB…

新クラスNClobの追加他

http://d.hatena.ne.jp/mir/20060219/p2 にて書いていた内容にテストコードをつけてsvnへcommit.こんなに簡単なコードでいいのだろうかと自問してしまうくらい簡単なコード.でも考えた結果,それしか要らんということになったので・・・.今回の狙いは,新ク…

PreparedStatement.setNClob()の実装

まーにょとやって終了.client-side PreparedStatementでは2GB制限が存在します. server-side PreparedStatementではsetNClob(int,Reader,long)にて文字通りストリームを渡せば理論上無限(その前にJVM/OS/HW的限界に達するけど)大のデータを送れます.次…

ResultSet.getNString()/getNCharacterStream()/getNClob()の実装

まーにょ.終了.PreparedStatement.execute系を使用するとisBinaryEncodedフラグが立つ.そこだけちょっと注意して終わりか.今日は偉い進んだな.さてお腹へったー.

NClob,Connection.createXLob()について

NYからSeattleまでの飛行中にちょこちょこ.これらについては特に難しいことはないはず.さくっと終わらせたい.詳細は以下の追加分にて http://ikda.net/fswiki/wiki.cgi?page=Connector%2FJ+5%2E0 http://ikda.net/fswiki/wiki.cgi?page=Connector%2FJ+5%2…

ServerPreparedStatementのススメ

ご存知の通りMySQLではver4.1からサーバにプリペアードステートメントが実装されました.もうここ1ヶ月くらいずっとこの件について調べたりC/Jのコード書いたりしてるわけですが,いろいろ見て見て思うことは,やっぱりこのプリペアードステートメントという…

最近思うこと

読めば読むほど,よくMark Matthews氏はこれを実装したなと思う.もともと何かのプロトコルを実装するというのは大変な作業なのかもしれないけれども.一方でやっぱりC/Jは中身がかなりごちゃごちゃしているなとも思う.JDBC APIという最上位のレイヤーとMyS…

昨日の続き

Mark Matthews氏と話したらあっさり ああ、それはドキュメントのBugだよ。以前はドキュメントの言うような実装だったんだ。その話、BugDatabaseに登録しておいてもらえる? との回答が。orzまあ、一件落着ということで。

JDBCを使ってデータベースのデータをコピーする

Google Alertにて検出。MySQL+Javaの記事だったので紹介します。http://japan.internet.com/column/developer/20060207/26.html

Server-Side PreparedStatementのパラメータがサーバへ送信されるタイミング

C/Jマニュアルfor3.1によれば ドライバは(PreparedStatementが実行されるよりも以前に)パラメータが設定された時点でこの大きなデータをサーバサイドのPreparedStatementに送ります。 ということらしい.ここで言う"大きなデータ"とはsetBinaryStream()、s…

送信可能クエリ長制限について

現時点(Connector/J 5.0)において,送信可能なクエリの長さの最大値は"sign 2^32 = 2G"です.この長さは文字数ではなく,バイトサイズです.従ってマルチバイトの文字コードを使用している場合には,送れる文字数はそのマルチバイト分だけ除算されるものと…

PreparedStatement.execute()を使ったクエリ送信のまとめ

Client-SideのPreparedStatementを実行する際,C/Jでは以下のような順に内部処理を行っていきます. 解析済みSQL文および設定済みパラメータ値を用いてBufferオブジェクトを作成. Connection.getMutex()によりSynchronizedを実行. タイムアウト処理を行う…

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

昨夜のエントリの続き.というかもう一昨日か.昨夜は夕方から寝て今日は早朝から活動中.とみたまさひろさんによるMySQLプロトコル解説 http://tmtm.org/hiki/hiki.cgi?MysqlProtocolこちらを拝見させていただくに、 16777215(0xFFFFFF)の場合は、継続パケ…

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.sendSplitPacket…

16MB超のデータ送信時の複数Packet送信

以下はmysql-5.0.18/sql/net_serv.ccのmy_net_read関数をいろいろ端折って読みやすくしたもの(Compressの部分を割愛、および整形) #define MAX_PACKET_LENGTH (256L*256L*256L-1) ulong my_net_read(NET *net) { ulong len,complen; len = my_real_read(ne…

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

アプリケーションコードがDriverManager.getConnection()を呼び出し.ユーザ名/パスワード無し. normal size=59, HEADER:[39][0][0][1] = 27 00 00 01 / BODY: 27 00 00 01 8f a2 02 00 ' . . . . . . . ff ff ff 00 08 00 00 00 . . . . . . . . 00 00 00 …

sql_mode=NO_BACKSLASH_ESCAPES対応の件

NATIONAL CHARACTER対応実装をConnector/J 5.1へ行うために,まずその橋頭堡となる"com.mysql.jdbc.PreparedStatement"クラスのsetStringメソッドを調べていたわけですが, http://ikda.net/fswiki/wiki.cgi?page=Connector%2FJ+5%2E0#p5昨日の日記で書いた…

Connector/J 5.1 ページをWikiに追加

http://ikda.net/fswiki/wiki.cgi?page=Connector%2FJ+5%2E1 追加しました.とりあえずsetNStringの実装についての話を書いてあります.

NATIONAL CHARACTER対応について

#日記の日付表示基準を変えたので4日間も経ってしまったかのような感じですが現地時間的には日曜日をはさんで2日ぶりの更新です.今はこちらは月曜日ですが今日は早朝から活動してます.さて,前回の件をMark Matthews氏に話しました.とりあえずクライアン…

RowIdのC/J実装について

【ROWIDデータ型】 java.sql.RowIdデータ型が追加されました.これによりJDBCを利用するプログラムはSQLのROWIDにアクセスすることが可能となります. Mark Matthews氏と話しましたが,このRowIdについてはやはり「MySQLサーバにROWIDが実装されていない」の…

リファレンスマニュアル翻訳

完了しました。 http://ikda.net/fswiki/wiki.cgi?page=Connector%2FJ+%A5%C9%A5%AD%A5%E5%A5%E1%A5%F3%A5%C8いざやってみるとかなり作業量があったのですが、さらに他の作業とも並行しながらやっていたこともあって時間がかかりましたねー。2ヶ月くらい?と…

ver5.0系とver5.1系

Connector/Jの5.0系について先日書きましたが、JDBC-4.0実装については5.0系ではなくその次のブランチ、5.1系に実装されることになります。従って各ブランチをまとめて簡単にいうとこんな感じです。 3.1系・・・JDBC-3.0実装、現時点でのGA版 3.2系・・・3.1にXA実…

ver5.0.0βリリース

新年あけましておめでとうございます。さて,Connector/J 5.0.0βがリリースされました。このC/Jの5.0系というのは以下のようなものです。 C/J 3.1がベース C/J 3.2で実装されていたXA機能を追加(バックポート) JDBC仕様4.0についての追加実装 C/J 3.1への…