2

OracleResultSetからタイムスタンプを取得するときにCalendarオブジェクトを使用する必要がある状況があります。クラスレベルでCalendarオブジェクトを定義して、その単一のインスタンスを複数のスレッドでこのように利用できるようにしたいと思います。Calendar自体がスレッドセーフではないことは知っていますが、OracleのResultSet.getTimestamp(String、Calendar)の実装によって、Calendarがバックグラウンドでどのように使用されるかについてはわかりません。MySQLのソースコードを見ると、カレンダーはTimeZoneオブジェクト(どちらも変更されていないように見えます)をプルするために厳密に使用されているため、MySQLの場合はスレッドセーフのようです。カレンダーの単一のインスタンスがマルチスレッド環境でこのメソッドのOracleの実装で安全に使用できるかどうかを誰かが明らかにすることができますか?

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
Timestamp ts = rs.getTimestamp("example",cal);
4

1 に答える 1

3

Oracleドライバーはオープンソースではないため、言うのは難しいです。おそらく、ドライバーを逆コンパイルしてその機能を確認することはできますが、リスクを冒すことはありません。

まず、アプリのベンチマークを行って、を作成するのにどれだけの費用がかかるかを判断しますCalendar。それはあなたがそれについて心配する必要がないほど十分に安いかもしれません-ただオンデマンドでそれを作成してください。それでも高すぎると思われる場合は、を使用しThreadLocalて保持します。Calendarスレッドプールを使用すると仮定すると、スレッドセーフを気にすることなく再利用されたオブジェクトを取得できます。

于 2012-05-04T20:48:21.937 に答える