日期:2014-05-18  浏览次数:20609 次

oracle.sql.TIMESTAMP 疑问
服务器为Tomcat5.0,配置好Oracle9.2的JNDI数据源,通过Context来获取javax.sql.DataSource,
然后再获取Connection。Oracle中表TEST001的字段G是TIMESTAMP类型,示例代码如下,注释为
其简单输出。
  InitialContext initCtx = ...
  Context ctx = initCtx.lookup(...);
  DataSource ds = (DataSource)ctx.lookup(...);
  Connection conn = ds.getConnection();//已经获取了Connection
  PreparedStatement ps = conn.prepareStatement("select g from test001 where a='ccc'");
  ResultSet rs = ps.executeQuery();
  
 
  while(rs.next()){
  Object obj = rs.getObject(1);
  out.println("getG:"+obj.getClass().getName()+"<BR>");//oracle.sql.TIMESTAMP
  out.println("getG:"+obj.getClass().isInstance(obj)+"<BR>");//true
  out.println("getG:"+oracle.sql.TIMESTAMP.class.isInstance(obj)+"<BR>");//false
  out.println("getG:"+oracle.sql.TIMESTAMP.class.equals(obj.getClass())+"<BR>");//false
  out.println("getG:"+oracle.sql.TIMESTAMP.class.equals(oracle.sql.TIMESTAMP.class)+"<BR>");//true
  out.println("getG:"+obj.getClass().equals(obj.getClass())+"<BR>");//true
  out.println("getG:"+obj.getClass().equals(oracle.sql.TIMESTAMP.class)+"<BR>");//false
  //out.println("getG:"+(oracle.sql.TIMESTAMP)obj+"<BR>");//该语句将抛出ClassCastException异常
  }
  conn.close();


请高手给解决一下这个问题,否则Oracle中的TIMESTAMP字段就永远无法取得正常值了。
必要说明:Connection如果是从DriverManager.getConnction(...)获取的话没有这个问题。
怀疑是commons-dbcp的问题。


------解决方案--------------------
如果类的名称一致,还出现ClassCastException异常,则表明其ClassLoader不一致的问题所致。

Tomcat服务器我不是很熟悉,猜测可能的问题是你的应用服务器和web应用都配置了不同的Oracle9.2的jdbc driver. 先将web应用的那个类路径删除试试。

DriverManager.getConnction()是好的是因为它和oracle.sql.TIMESTAMP.class使用相同的ClassLoader。