<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    tbwshc

    Oracle 的Blob使用小結

    Oracle 的Blob

    Oracle的Lobs的流處理方式與Long等對象的Stream方式不一樣,沒有Long的諸多限制;只要保持連接,就能通過blob對象正確讀取對象。
    有兩種方式可以讀取Blob:
    1.直接使用ps.getBinaryStream()的方法得到流對象
    2.使用getBlob得到blob,然后通過blob的方法提供的getBinaryStream(),getBytes() 訪問blob的數據。
    這兩種方法都可以在rs.close之后正確獲取數據。(在spring 的JdbcTemplet環境下,該rs理論上被JdbcTemplet自動關閉;從數據庫連接來看,連接也正確關閉了)。

    使用Blob的好處是,按需獲取Blob對象。而且可以多次通過blob.getBinaryStream得到對象。且Blob返回的對象可以使用mark/reset方法反復訪問。且連接狀態正常。
    使用blob得到InputStream,可以調用close()接口,也可以不調用該接口,tb在連接關閉時將自動關閉該連接。最好調用close()釋放資源。

    c3p0的setBlob(pos,InputStream)接口不能正常工作。

    寫入或更新Blob時,可以使用ps.setBinaryStream();調用此接口后,in對象到文件尾(在把stream寫入blob后,不能要再調用in.close()關閉文件,否則報錯)。
    也可以使用setBlob(pos,Blob)方法來寫入或更新Blob字段;但是注意的是,無論是以blob還是blob.getBinaryStream的方式,都不能自己更新自己,否則死鎖。

    使用spring讀取blob的示例程序:
                String sql = "select photo from my_photoes where id='test2' and photo is not null and rownum<2 ";
    BLOB blob= (BLOB) simpleDao.queryForObject(sql,Blob.class);       
    InputStream in = blob.getBinaryStream();
    String filename = "./test/dao/pic" + 1+ ".gif";
    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filename));

                /* 需oracle的BLOB支持。效率可能會高些,但是空間上會有些浪費
    byte[] b = new byte[blob.getBufferSize()];                //blob必須為oracle.sql.BLOB時才可調getBufferSize方法; 與java.sql.Blob區別。
    System.out.println("bufferSize="+b.length);            //32k左右,用這種方式讀取文件會有一點空間的浪費。
    int len=-1;
    while ((len = in.read(b)) != -1) {
    out.write(b);
    }
                */

                /*   純jdbc方法:
                    nt b;
         while ((b = in.read()) != -1) {
        out.write(b);
         }
                */

    in.close();
    out.close();



    http://hi.baidu.com/hexiong/blog/item/34d7b2b7f9b3e8f431add103.html  其他參考
    BLOB處理遇到的問題:
    1.用spring的模板類來處理blob時,遇到大文件時,流會異常關閉。解決辦法,使用oracle的本地連接來獲取blob流,如下:
        public boolean queryForBlobStream(String sql,OutputStream fout)
        {
            boolean flag=true;
            try {
                Connection conn = DataSourceUtils.getConnection(getJdbcTemplate().getDataSource());
                conn.setAutoCommit(false);                        //此部分ms能提高性能
                Statement st = conn.createStatement();
                ResultSet rs = st.executeQuery(sql);
                if (rs.next()) {
                    java.sql.Blob blob = rs.getBlob(1);
                    InputStream ins = blob.getBinaryStream();
                    //輸出到文件
                    //下面將BLOB數據寫入文件
                    byte[] b = new byte[1024];
                    int len = 0;
                    while ((len = ins.read(b)) != -1) {
                        fout.write(b, 0, len);
                    }
                    //依次關閉
                    fout.close();
                    ins.close();
                }
                conn.commit();
                rs.close();             //maybe not nessesary
                st.close();             //maybe not nessesary
                conn.close();
            } catch (IOException ex) {
                flag=false;
            } catch (SQLException ex) {
                flag=false;
            }
            return flag;
        }
    2.如果把blob對象放到記錄的字段中,在web開發中,通過blob.getBinaryStream()只能獲得一次blob流,第二次調用同一對象的blob流會得到null流。
    且在這種方式下,不能使用in.close()關閉流。

    posted on 2012-07-17 15:34 chen11-1 閱讀(17851) 評論(0)  編輯  收藏 所屬分類: oracle

    主站蜘蛛池模板: 男人的好免费观看在线视频| 久久精品免费视频观看| 啦啦啦在线免费视频| 亚洲精品美女在线观看播放| 日本亚洲欧洲免费天堂午夜看片女人员| 亚洲性日韩精品一区二区三区| 日韩大片免费观看视频播放 | 亚洲成人免费网站| 亚洲成人高清在线观看| 99在线精品免费视频九九视| 亚洲免费视频观看| 永久黄网站色视频免费观看| 免费人人潮人人爽一区二区| 区久久AAA片69亚洲| 久久午夜无码免费| 亚洲国产av一区二区三区丶| 四虎免费在线观看| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 好先生在线观看免费播放| 亚洲AV成人影视在线观看 | 亚洲日韩中文字幕在线播放| 日日麻批免费40分钟无码| 亚洲国产模特在线播放| 日本成人免费在线| japanese色国产在线看免费| 亚洲AV无码精品色午夜果冻不卡 | 亚洲一区二区三区偷拍女厕| 99爱免费观看视频在线| 亚洲综合小说另类图片动图| 亚洲JIZZJIZZ中国少妇中文| 日本高清高色视频免费| 中文字幕精品三区无码亚洲| 亚洲男女内射在线播放| 最近高清中文字幕免费| 亚洲精品成a人在线观看☆| 国产av无码专区亚洲av果冻传媒| 最好看最新的中文字幕免费| 在线精品自拍亚洲第一区| 亚洲第一中文字幕| 国产精品久久久久影院免费| 国产成人精品免费久久久久|