質問内容
現在時刻を取得する場合、oracle等のDBから
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD' ) AS SYS_DATE FROM DUAL
のような感じで取得する方法と、
JavaのCalendarクラスで取得する方法があるかと思いますが、
保守を考えるとどちらで
現在時刻を取得するのがいいのでしょうか?
私は、DBから取得することを考えると、
oracle->DB2リプレース等に
なった時にOracleSQL文の修正が入りそうなのでちょっと嫌かな、
と思っているのですが。DBから取得するメリットがそれ以上にあればDBからの取得を考えている状態です。
状況によって使い分けがいるんでしょうか。。。
基本的にはサーバーの時刻同期が合っていればどちらでも同じ結果になるはず、ですがたまにミスでずれている時があるので自分ならDBの時刻に合わせます。
大抵の場合アプリケーションサーバーが複数あってもDBは1台(もしくは少数)ですから、どれか一つにあわせるとなるとそうなるかと。
DBに接続するJavaクライアントが複数ある場合、NTPなどで時刻の同期が取れていないと、保存された時刻データの前後が食い違って登録されてしまうという現象が生じ、大きな問題となることがあります。その時刻を用いて楽観的ロックを行っていると、稀なタイミングで変更が上書きされてしまいます。
DBのクライアントがアプリケーションサーバなど1つに限られているのであれば、Javaの方で現在時刻を取得しても問題はないでしょう。
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/util...
なるほど、クライアントごとに時刻が微妙に違うと確かに問題がおきそうです。大抵は、アプリケーションサーバは負荷に応じて増える可能性はありますからね。。。
基本的にはサーバーの時刻同期が合っていればどちらでも同じ結果になるはず、ですがたまにミスでずれている時があるので自分ならDBの時刻に合わせます。
大抵の場合アプリケーションサーバーが複数あってもDBは1台(もしくは少数)ですから、どれか一つにあわせるとなるとそうなるかと。
やはり時刻同期に関する問題が大きいですか。。
時刻同期に関連するバグは再現性が低そうですね、DBの時刻に合わせた方がいいという考えにまとまりそうです。
SQL文はなるべくSQL92等環境非依存の記述を心がけてリプレースに備えるという意識で行こうと思います。
同じ部署に長くいると、なかなか他所のシステムがどうなっているのか分からないので参考になりました。ありがとうございます。
やはり時刻同期に関する問題が大きいですか。。
時刻同期に関連するバグは再現性が低そうですね、DBの時刻に合わせた方がいいという考えにまとまりそうです。
SQL文はなるべくSQL92等環境非依存の記述を心がけてリプレースに備えるという意識で行こうと思います。
同じ部署に長くいると、なかなか他所のシステムがどうなっているのか分からないので参考になりました。ありがとうございます。