我也遇到过和楼主一样的问题,但最后没管它,它自己又好了,不知道怎么回事。我用的是weblogic。
帮楼主顶一下。

解决方案 »

  1.   

    这样看不出什么,你最好把xml也粘出来.Context ctx = new InitialContext();
       if(ctx == null ) throw new Exception("Boom - No Context");
       javax.sql.DataSource ds=(javax.sql.DataSource)ctx.lookup("java:comp/env/jdbc/oracle");
       Connection conn = ds.getConnection();
       Statement stmt = conn.createStatement();
       ResultSet rst = stmt.executeQuery("select * from yuyu.test");
      

  2.   

    这是我的tomcat连接oracle的连接池你看那里和你的不一样!
    <Resource name="szf" auth="Container" type="javax.sql.DataSource"/>  
            <ResourceParams name="szf"> 
    <parameter> 
            <name>factory</name>     <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>   </parameter>   <parameter>     <name>driverClassName</name>     <value>oracle.jdbc.driver.OracleDriver</value>   </parameter>   <parameter>     <name>url</name>     <value>jdbc:oracle:thin:@192.168.70.111:1521:mydb</value>   </parameter>   <parameter>     <name>username</name>     <value>zgsx</value>   </parameter>   <parameter>     <name>password</name>     <value>zgsx</value>   </parameter>   <parameter>     <name>maxActive</name>     <value>20</value>   </parameter>   <parameter>     <name>maxIdle</name>     <value>10</value>   </parameter>   <parameter>     <name>maxWait</name>     <value>-1</value>   </parameter> </ResourceParams> 
      

  3.   

    String sSql = "INSERT INTO TEST_CLOB VALUES (?, EMPTY_CLOB())";
    ps = conn.prepareStatement(sSql);
    ps.setString(1, test_id);
    ps.executeUpdate();
    ps.close();
    ps = null;String selectSql = "SELECT CLOBCOL FROM TEST_CLOB WHERE TEST_ID=? FOR UPDATE";
    ps = conn.prepareStatement(selectSql);
    ps.setString(1,test_id);
    rs = ps.executeQuery();
    Clob clob = null;
    if (rs.next()) {
    //oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");
    clob = (Clob) rs.getClob("CLOBCOL"); Writer wr = ((oracle.sql.CLOB)clob).getCharacterOutputStream();
    wr.write("aaa");
    wr.flush();
    wr.close();
    }用jdbc连没问题,一用tomcat连接池,就出java.lang.ClassCastException: oracle.sql.CLOB错误
      

  4.   

    你的连接池里面要有一个接受数据容器的temp的文件夹
      

  5.   

    必须把Connection的setAutoCommit(false);
      

  6.   

    如果使用hibernate,要把hibernate.cfg.xml加一句配置(hibernate.jdbc.batch_size=0):    <session-factory>
            <!-- properties -->
            <property name="dialect">net.sf.hibernate.dialect.OracleDialect</property>
            <property name="show_sql">false</property>
            <property name="connection.datasource">java:comp/env/sdsbbDS</property>
            <property name="hibernate.jdbc.batch_size">0</property>
            <!-- mapping files -->
        </session-factory>
      

  7.   

    Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢? 这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正的写入blob数据了。 看下面的JDBC的demo,把oraclejdbc.jar这个二进制文件写入数据库表javatest的content字段(这是一个blob型字段) java代码:   1  import java.sql.*; 
     2  import java.io.*; 
     3  import oracle.sql.*; 
    4  public class WriteBlob {
    ...}
     5   
    6    public static void main(String[] args) {
    ...}
     7   
    8      try {
    ...}
     9        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); 
     10       Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","fankai","fankai"); 
     11       conn.setAutoCommit(false); 
     12  
     13       BLOB blob = null; 
     14  
     15       PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,content) values(?,empty_blob())"); 
     16       pstmt.setString(1,"fankai"); 
     17       pstmt.executeUpdate(); 
     18       pstmt.close(); 
     19  
     20       pstmt = conn.prepareStatement("select content from javatest where name= ? for update"); 
     21       pstmt.setString(1,"fankai"); 
     22       ResultSet rset = pstmt.executeQuery(); 
     23       if (rset.next()) blob = (BLOB) rset.getBlob(1); 
     24  
     25       String fileName = "oraclejdbc.jar"; 
     26       File f = new File(fileName); 
     27       FileInputStream fin = new FileInputStream(f); 
     28       System.out.println("file size = " + fin.available()); 
     29  
     30       pstmt = conn.prepareStatement("update javatest set content=? where name=?"); 
     31  
     32       OutputStream out = blob.getBinaryOutputStream(); 
     33  
     34       int count = -1, total = 0; 
     35       byte[] data = new byte[(int)fin.available()]; 
     36       fin.read(data); 
     37       out.write(data); 
     38       /* 
     39       byte[] data = new byte[blob.getBufferSize()];  另一种实现方法,节省内存 
     40       while ((count = fin.read(data)) != -1) { 
     41         total += count; 
     42         out.write(data, 0, count); 
     43       } 
     44       */ 
     45  
     46       fin.close(); 
     47       out.close(); 
     48  
     49       pstmt.setBlob(1,blob); 
     50       pstmt.setString(2,"fankai"); 
     51  
     52       pstmt.executeUpdate(); 
     53       pstmt.close(); 
     54  
     55       conn.commit(); 
     56       conn.close(); 
     57     } catch (SQLException e) { 
     58       System.err.println(e.getMessage()); 
     59       e.printStackTrace(); 
     60     } catch (IOException e) { 
     61       System.err.println(e.getMessage()); 
     62     }
     63   }
     64  
     65 }
     
    仔细看上例,分三步: 1、插入空blob 
    into javatest(name,content) values(?,empty_blob()); 2、获得blob的cursor 
    select content from javatest where name= ? for update; 注意!!!必须加for update,这将锁定该行,直至该行被修改完毕,保证不产生并发冲突。 3、update javatest set content=? where name= 用cursor往数据库写数据 这里面还有一点要提醒大家: JDK1.3带的JDBC2.0规范是不完善的,只有读Blob的接口,而没有写Blob的接口,JDK1.4带的JDBC3.0加入了写Blob的接口。你可以使用JDBC3.0的接口,也可以直接使用Oracle的JDBC的API,上例中使用了Oracle的JDBC的API。 另外要注意的是: java.sql.Blob 
    oracle.sql.BLOB 注意看blob的大小写,是不一样的。写程序的时候不要搞混了。 
      

  8.   

    回复人: adadbiti(小熊仔) ( ) 信誉:100  2004-10-18 18:29:00  得分: 0  
     
     
       你的连接池里面要有一个接受数据容器的temp的文件夹
      
     在那个要放在哪个文件夹下啊我是在TOMCAT的控制台下配的.环境是window2003+tomcat5.0.28+jdk1.42下面是我的源代高手帮忙,谢了
    package cn.huang;
    import oracle.sql.*;
    import java.sql.*;
    import oracle.jdbc.OraclePreparedStatement;
    import oracle.sql.DATE;
    import oracle.jdbc.*;
    import java.io.*;
    import java.util.*;
    import javax.naming.*;
    import javax.sql.DataSource;public class Intimage{
        
       
    private String error="";//用来接收出错信息
     private Connection conn=null;//连接对象
     oracle.jdbc.OracleResultSet rs=null;//oracle专用记录集对象
         oracle.jdbc.driver.OraclePreparedStatement stmt=null;//oracle专用处理带参的sql对象
          private Statement st=null;
         public Intimage(){//构造函数产生数据库连接
          getconn();
         }
         public String getError(){//返回出错信息
          return this.error;
         }
     private void getconn(){
    try{
    /* String user="testuser";
    String password="password";
    String url="jdbc:oracle:thin:@192.168.0.60:1521:ORACLEDB";
        Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
           conn=DriverManager.getConnection(url,user,password);*/
           //jdbc连接本在这里没有用到
          InitialContext ctx=new InitialContext();
        DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/myoracle");
      conn = ds.getConnection();
      //以上是连接池同时产生连接对象
      st=conn.createStatement();
        conn.setAutoCommit(false);
               
    }catch(Exception e){
    conn=null;
    error=String.valueOf(e);
    }
    }
    /*
    ***参数说明 fin 二进制图片流
    ***参数说明 path 原始文件名
    ***参数说明 len 文件大小
    */
        public boolean opentable(InputStream fin,String path,String classid,String id,String title,int len,int fty){
         try{
            
        byte a[]=null;
        a=new byte[len];
        int i=0;int itotal=0;
        for (;itotal<len;itotal=i+itotal ){ 
                          i=fin.read(a,itotal,len-itotal);
                            }
                    fin.close();
                    String filename=path;
                    int ftype=fty;
                    java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
                    java.util.Date currentTime_1 = new java.util.Date(); 
                    
        String fileid=id+formatter.format(currentTime_1);
        String sql="insert into vs_userupload (classid,content,uptime,title,fileid,fsize,ftype,userid,filename) values( ?,empty_blob(),?,?,?,?,?,?,?)";
                    stmt=(oracle.jdbc.driver.OraclePreparedStatement)conn.prepareStatement(sql);
                    stmt.setString(1,classid);
                     
                    stmt.setDate(2,new java.sql.Date(System.currentTimeMillis()));
                   
                    if(title.equals(null)||title=="")//判断传进来的参数是否为空值
                        stmt.setNull(3,java.sql.Types.VARCHAR);
                    else
                        stmt.setString(3,title);
                      
                    stmt.setString(4,fileid);
                       
                    stmt.setInt(5,len);
                         
                    stmt.setInt(6,ftype);
                         
                    stmt.setLong(7, Long.parseLong(id));
                        
                    stmt.setString(8,filename);//以上为参数传入
                     //error=classid+String.valueOf(new java.sql.Date(System.currentTimeMillis()))+title+filename+fileid+String.valueOf(len)+String.valueOf(ftype)+"路径"+filename+String.valueOf(userid);
                    stmt.executeUpdate();//执行sql语句
                    stmt.clearParameters();
                    sql="update vs_userupload set uptime=sysdate where fileid='"+fileid+"'";
        int h=st.executeUpdate(sql);
        if (ftype==2){
        sql="update vs_class set pic_size="+fsize+" where classid='"+classid+"'";
        h=st.executeUpdate(sql);
        }
                    sql="Select content from vs_userupload where fileid=? for update";
                    stmt=(oracle.jdbc.driver.OraclePreparedStatement)conn.prepareStatement(sql);
                    stmt.setString(1,fileid);
                    rs=(oracle.jdbc.OracleResultSet)stmt.executeQuery();

    if(rs.next());
       {
       BLOB blob=rs.getBLOB(1);
       
       int j=((oracle.sql.BLOB)blob).putBytes(1,a);//将字节数组写入BLOB字段           
               conn.commit();
               rs.close();
          return true;
      }
      
      
         }catch(Exception e){
         error=error+String.valueOf(e);
         conn.rollback();
         return false;
        
         }finally{
         try{
         if(!conn.isClosed())
             conn.close();
         }catch(Exception x){
         }
         }
         }
       
         }
    代码有点乱,我改了N次了还是不行代码也越来越乱了