Java ResultSet.getTimestamp使用Calendar&线程安全

时间:2013-07-30 14:06:17

标签: java multithreading calendar thread-safety jodatime

我的要求: 从数据库ResultSet获取时间戳(以UTC格式存储)并以线程安全的方式执行。

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

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

......按预期工作;但是,为每个查询创建一个新的Calendar对象似乎相当昂贵(它们非常频繁)。

我一直在寻找Joda-time作为可能的替代品,但无法弄清楚如何用Joda-time线程安全对象替换Calendar。最理想的是创建一个静态的最终Joda-Time线程安全日历替换,所有查询都可以使用。

对于成本较低的结果集迭代的任何想法?由于Calendar不是线程安全的,因此我无法使用单个共享实例。

2 个答案:

答案 0 :(得分:0)

使用synchronized关键字?

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

答案 1 :(得分: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());
    ...
}

也就是说,与执行SQL查询所需的时间相比,我不确定每次创建新日历的成本是多少。我的猜测是,如果有的话,你可以获得微不足道的性能提升。