服务器为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。