我有一种情况,我必须在从Oracle ResultSet中检索时间戳时使用Calendar对象。我想在类级别定义Calendar对象,以便可以通过多个线程以这种方式使用它的单个实例。我知道Calendar本身不是线程安全的,但我不清楚它是如何在Oracle的ResultSet.getTimestamp(String,Calendar)实现的幕后使用它。查看MySQL的源代码,Calendar严格用于拉取TimeZone对象(它似乎也没有被更改),因此对于MySQL来说它似乎是线程安全的。任何人都可以了解单个Calendar实例是否可以安全地与Oracle在多线程环境中实现此方法一起使用?
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
Timestamp ts = rs.getTimestamp("example",cal);
答案 0 :(得分:3)
由于Oracle驱动程序不是开源的,因此很难说。我想,你可以反编译驱动程序以查看它的作用,但我不会冒险。
首先,我会对您的应用进行基准测试,以确定创建Calendar
的成本。它可能足够便宜,你不需要担心它 - 只需按需创建一个。如果您仍然认为它过于昂贵,那么请使用ThreadLocal
来保留它们。假设您使用了一个线程池,那么您将获得重用的Calendar
对象,而不必担心线程安全。