[Seasar-user:796] S2JDBCでOracleのUnicode問題とうまく付き合いたい...

B furyu.omron.co.jp Hikaru Taniguchi taniguchi
2004年 6月 7日 (月) 19:29:44 JST


tanigon こと 谷口です(ML初投稿です)

仕事でS2を便利に使わせてもらってます。
# 布教活動中です。

ちょっとOracle8iとつないでいてデータハンドリングで躓いたのでお知恵を拝借
いたしたくメールしました。

まず、前提として…
接続先データベースがOracle8.1.7EEという現状があります。
で、こいつには JDBCドライバの問題? というか OracleのUnicode変換テーブル
の問題で、 "〜" という文字をちゃんと対称に変換できないという問題がありました。
(http://otndnld.oracle.co.jp/tech/java/htdocs/javanls/javanls817.html)
# ちなみに JDBC Driver 10.1.0 でも解決されてないように見えます。。

昔々、S2JDBCもない頃は Commons DbUtilsをxml(dicon)に登録して、これを
DAOImplのコンストラクタに解決してもらってました。
で、S2JDBCがリリースされたので「これはもう使うしか、移行するしか」という
感じだったのですが…が… ちょっとしたトラブルが。

上に書いたコード問題を回避するために、Commons DbUtilsのクラスの中で
QueryRunnerというやつがあるのですが、こいつをオーバーライドしてました。
QueryRunnerはもともと 

    protected ResultSet wrap(ResultSet rs) {
        return rs;
    }

というTemplateMethodを持っています。
ここを継承した(OracleQueryRunnerみたいな…)クラスで このUnicode変換部分
を自前でOracle <-> Javaでいじるような ResultSetラッパーを作ってやり、
wrap()の中でラッピングするようにしてました。
(Commons DbUtilsではこのへんのResultSetのオーバーライドは提供されていて、
インターセプト?の仕掛けとしては java.lang.reflect.InvocationHandler
を使っています)

これをS2JDBCでやろうとすると…なかなかどこに仕掛けていいのか分からないの
です。

MapResultSetHandlerをコンテナに登録してインターセプタを作るとか…
RowHandlerにはAOPは適用できない(コンテナからインスタンシエイトしていない
はず)… そもそも、このデータ変換は ResultSetHandlerにとっての課題ではな
いような気もするし… ResultSetをインターセプトするとかで実現したい… 
などと思考のワナにハマりまくっております。
# DbUtils使えばいいんでしょうけど、なんかくやしい。S2*で固めたい!

いまのところ一番それっぽい、のはBasicSelectHandlerのexecute()をオーバー
ライドして DbUtilsみたいにwrap()してやることなのかな、と思っていますが…
どことなくスマートではない(インターセプトする仕掛けがいろいろ混在してし
まうような気がする... InvocationHandlerと、S2のAOPと。) のと、ResultSet
にAOPを仕掛けるためにはコンテナが生成しないといけないのでこれも起こり得
ない気がして…

同じ問題で悩んでいた、とか、オレはこうした、とか、そもそもオマエそこ間違っ
てますよ、とか…なにかいいアドバイス、頂けないでしょうか > 先輩方

よろしくお願いしますです。

-- 
Hikaru Taniguchi aka tanigon <[E-MAIL ADDRESS DELETED]>




Seasar-user メーリングリストの案内