2012-05-04 43 views
2

我有一种情况,我必须从Oracle ResultSet中检索时间戳时使用Calendar对象。我想在类级别定义Calendar对象,以便它可以由多个线程以这种方式使用它的单个实例。我知道Calendar本身不是线程安全的,但我不清楚Oracle是如何在Oracle的ResultSet.getTimestamp(String,Calendar)实现中使用它的。查看MySQL的源代码,日历严格用于拉动TimeZone对象(它看起来不会被改变),所以对于MySQL来说它似乎是线程安全的。任何人都可以阐明一个Calendar的单个实例是否可以安全地与Oracle在多线程环境中实现此方法一起使用?ResultSet.getTimestamp(String,Calendar)是否使用Calendar对象线程安全?

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
Timestamp ts = rs.getTimestamp("example",cal); 

回答

3

由于Oracle驱动程序不是开源的,所以很难说。我想,你可以反编译驱动程序来查看它的功能,但我不会冒险。首先,我会对您的应用程序进行基准测试,以确定创建Calendar的成本有多高。它可能够便宜,你不必担心它 - 只需要创建一个。如果你仍然认为它太贵,那么使用ThreadLocal来保存它们。假设你使用线程池,那么你可以重用Calendar对象,而不用担心线程安全问题。

+2

是的,我在想同样的事情。即使我发现它是线程安全的(从反编译它),也不能保证它在后续的驱动程序版本中保持这种状态。 –