1

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

我的代码目前如下所示:

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

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

我一直在将Joda-time视为可能的替代品,但不太清楚如何用 Joda-time 线程安全对象替换日历。最好创建一个所有查询都可以使用的静态最终 Joda-Time 线程安全日历替换。

对于成本更低的结果集迭代有什么想法吗?由于日历不是线程安全的,我不能使用单个共享实例。

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());
    ...
}

也就是说,与执行 SQL 查询所需的时间相比,我不确定每次创建一个新日历是否会如此昂贵。我的猜测是,如果有的话,您将获得微不足道的性能提升。

于 2013-07-30T14:30:57.207 回答