[Seasar-user:8011] Re: [S2DAO]OracleのTIMESTAMP WITH LOCAL TIME ZONE

Jundo Ishikawa [E-MAIL ADDRESS DELETED]
2007年 6月 1日 (金) 16:50:09 JST


JUNDUです。

TIMESTAMP WITH LOCAL TIME ZONEについて調べてみました。おっしゃるとおり、
利用するためにはOracleConnection#setSessionTimezoneの呼び出しが必須の
ようです。論理的にはALTER SESSION SET TIME_ZONE = '+09:00'などを実行す
れば同じはずなのですが、OracleConnectionから設定をしないと認識してくれ
ないようです。

そうなるとOracleConnection#getSessionTimezoneを呼び出すしかないのですが、
このメソッドはOracleのJDBCドライバ固有のメソッドのため、S2DaoやS2DBCPに
て対応するというのは、そのDBのJDBCドライバに依存してしまうため難しい気が
します。

無理やり実装するとしたら自分でOracleConnectionのインスタンスをデータソー
スから取得する必要があるのですが、データソースは元のコネクションをラッ
ピングしたオブジェクトを返したりするので、工夫が必要です。

Seasar2側で対応するとしたら、S2DBCPに特定のインタフェースを実装したクラ
スをコネクションの取得時に呼び出すカスタマイズポイントを設けるという案が
考えられますが、S2Containerのコミッタの方の意見を聞きたいところです。

あまりお役に立てず、申し訳ないです。


07/05/31 に WAKABAYASHI Ryoji<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 若林と申します。
> お世話になります。
>
> Oracle10gでTIMESTAMP WITH LOCAL TIME ZONEを使った表を定義して
> S2DAOでselectしたところ、以下のような結果になりました。
>
> Caused by: java.sql.SQLException: Session Time Zone not set!
>   at
> oracle.jdbc.driver.TimestampltzAccessor.getTimestamp(TimestampltzAccessor.java:271)
>   at
> oracle.jdbc.driver.OracleResultSetImpl.getTimestamp(OracleResultSetImpl.java:796)
>   at oracle.jdbc.driver.OracleResultSet.getTimestamp(OracleResultSet.java:1661)
>   at
> org.seasar.extension.jdbc.impl.ResultSetWrapper.getTimestamp(ResultSetWrapper.java:1010)
>
> 原因を調べたところ、TIMESTAMP WITH LOCAL TIME ZONEを使う場合、SQL実行前に
> OracleConnection-のsetSessionTimeZoneメソッドでTimeZoneをセットしておかない
> といけないようです(Oracle JDBC API Referenceに記載あり)。
> S2DAOで何か対処方法はありますでしょうか?
> Seasar2.3.7、S2DAO1.0.31, S2JSF1.0.15を使用しています。
>
> よろしくお願い致します。
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>


-- 
 Jundo Ishikawa <[E-MAIL ADDRESS DELETED]>
         ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄



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