我的要求: 从数据库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不是线程安全的,因此我无法使用单个共享实例。
答案 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查询所需的时间相比,我不确定每次创建新日历的成本是多少。我的猜测是,如果有的话,你可以获得微不足道的性能提升。