1

私の要件: データベース ResultSet からタイムスタンプ (UTC に格納されている) を取得し、スレッドセーフな方法で実行します。

私のコードは現在次のようになっています。

Calendar utcCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
while(rs.next())
    rs.getTimestamp("utctime",utcCal);

...期待どおりに動作します。ただし、クエリごとに新しい Calendar オブジェクトを作成するのは非常にコストがかかるようです (非常に頻繁です)。

Joda-timeを代替候補として検討してきましたが、Calendar を Joda-time スレッドセーフ オブジェクトに置き換える方法がよくわかりません。すべてのクエリで使用できる静的な最終的な Joda-Time スレッドセーフな Cal​​endar の代替を作成することが理想的です。

より安価な結果セットの反復のアイデアはありますか? Calendar はスレッド セーフではないため、単一の共有インスタンスを使用することはできません。

4

2 に答える 2

0

synchronizedキーワードを使用しますか?

        synchronized (CALENDAR) {
        CALENDAR.setTimeInMillis(System.currentTimeMillis());
        while(rs.next()){
            rs.getTimestamp("utctime", CALENDAR);
            //rest of code
        } 
    }
于 2013-07-30T14:27:06.210 に答える
0

を使用できますThreadLocal<Calendar>。このようにして、各スレッドは独自の一意の Calendar インスタンスを持ちます。

public static final ThreadLocal<Calendar> RESULT_SET_CALENDAR = new ThreadLocal<Calendar>() {
    @Override 
    protected Calendar initialValue() {
        Calendar calendar = Calendar.getInstance();
        // set appropriate timezone
        return calendar;
    }
};

while (rs.next()) {
    Timestamp timestamp = rs.getTimestamp("utctime", RESULT_SET_CALENDAR.get());
    ...
}

そうは言っても、毎回新しい Calendar を作成するのが、SQL クエリを実行するのに必要な時間と比較して非常にコストがかかるかどうかはわかりません。私の推測では、パフォーマンスが向上したとしても、ごくわずかです。

于 2013-07-30T14:30:57.207 に答える