Java的使用的ResultSet.getTimestamp日历和线程安全(Java ResultS

2019-09-28 04:19发布

我的要求:从数据库中获取ResultSet的时间戳(存储在UTC),并做一个线程安全的方式。

我的代码目前看起来是这样的:

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

......其工作正常; 然而似乎相当昂贵,以创建为每个查询新的日历对象(他们是非常频繁的)。

我一直在看乔达时间作为一个可能的替代品,但不能完全弄清楚如何使用乔达时间线程安全的对象替换日历。 这将是理想建立一个静态的最终乔达时间线程安全的日历更换所有的查询可以使用。

任何想法了成本更低的结果集迭代? 由于日历不是线程安全的,我不能用一个单一的共享实例。

Answer 1:

使用synchronized关键字?

        synchronized (CALENDAR) {
        CALENDAR.setTimeInMillis(System.currentTimeMillis());
        while(rs.next()){
            rs.getTimestamp("utctime", CALENDAR);
            //rest of code
        } 
    }


Answer 2:

你可以使用一个ThreadLocal<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());
    ...
}

这就是说,我不知道创建一个新的日历相比,执行SQL查询所需要的时间每次都是如此昂贵。 我的猜测是,你有一个可以忽略不计的性能增益,如果有的话。



文章来源: Java ResultSet.getTimestamp using Calendar & Thread safety