Dev@Free

          zJun's Tech Weblog

          [深入淺出Hibernate筆記] Oracle中的大字段 Blob/Clob

          數(shù)據(jù)庫中提供了兩種字段類型 Blob??和 Clob 用于存儲大型字符串或二進(jìn)制數(shù)據(jù)(如圖片)。

          Blob 采用單字節(jié)存儲,適合保存二進(jìn)制數(shù)據(jù),如圖片文件。
          Clob 采用多字節(jié)存儲,適合保存大型文本數(shù)據(jù)。

          Oracle中處理BLOB/CLOB字段的方式比較特別,所以需要特別注意下面兩點(diǎn):

          1. 在Oracle JDBC中采用流機(jī)制對 BLOB/CLOB 進(jìn)行讀寫操作,所以要注意不能在批處理中讀寫 BLOB/CLOB字段,否則將出現(xiàn)
          Stream type cannot be used in batching 異常。

          2. Oracle BLOB/CLOB 字段本身擁有一個游標(biāo)(cursor),JDBC通過游標(biāo)對Blob/Clob字段進(jìn)行操作,在Blob/Clob字段創(chuàng)建之前,無法獲取其游標(biāo)句柄,會出現(xiàn)
          Connection reset by peer: socket write error 異常。

          正確的做法是:首先創(chuàng)建一個空 Blob/Clob 字段,再從這個空 Blob/Clob字段獲取游標(biāo),例如下面的代碼:

          PreparedStatement?ps? = ?conn.prepareStatement( " insert?into?PICTURE(image,resume)?values(?,?) " );
          // ?通過oralce.sql.BLOB/CLOB.empty_lob()構(gòu)造空Blob/Clob對象

          ps.setBlob( 1 ,oracle.sql.BLOB.empty_lob());
          ps.setClob(
          2
          ,oracle.sql.CLOB.empty_lob());

          ps.excuteUpdate();
          ps.close();

          // ?再次對讀出Blob/Clob句柄

          ps? = ?conn.prepareStatement( " select?image,resume?from?PICTURE?where?id=??for?update " );
          ps.setInt(
          1 , 100
          );

          ResultSet?rs?
          =
          ?ps.executeQuery();
          rs.next();

          oracle.sql.BLOB?imgBlob?
          = ?(oracle.sql.BLOB)rs.getBlob( 1
          );
          oracle.sql.CLOB?resClob?
          = ?(oracle.sql.CLOB)rs.getClob( 2
          );

          // ?將二進(jìn)制數(shù)據(jù)寫入Blob

          FileInputStream?inStream? = ? new ?FileInputStream( " c://image.jpg " );
          OutputStream?outStream?
          =
          ?imgBlob.getBinaryOutputStream();

          byte []?buf? = ? new ? byte [ 10240
          ];
          int
          ?len;
          while (len = inStream.read(buf) > 0 )
          {
          ??outStream.write(buf,
          0
          ,len);
          }

          inStream.close();
          outStream.cloese();

          // ?將字符串寫入Clob
          resClob.putString( 1 , " this?is?a?clob " );

          // ?再將Blob/Clob字段更新到數(shù)據(jù)庫

          ps? = ?conn.prepareStatement( " update?PICTURE?set?image=??and?resume=??where?id=? " );
          ps.setBlob(
          1
          ,imgBlob);
          ps.setClob(
          2
          ,resClob);
          ps.setInt(
          3 , 100
          );

          ps.executeUpdate();
          ps.close();


          posted on 2006-08-15 16:39 zJun's帛羅閣 閱讀(5401) 評論(1)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          評論

          # re: [深入淺出Hibernate筆記] Oracle中的大字段 Blob/Clob 2010-01-14 13:53

          http://iceland1986.blog128.fc2.com/blog-entry-3.html
          作者文不對題。。用上面就可以做到。不過只有讀取。  回復(fù)  更多評論   

          導(dǎo)航

          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          博客

          文檔

          站點(diǎn)

          論壇

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 贵港市| 泸水县| 宁城县| 舟山市| 正阳县| 绥棱县| 台北市| 镇坪县| 家居| 中牟县| 林芝县| 泰兴市| 宜城市| 清远市| 华宁县| 益阳市| 鄂州市| 新密市| 巧家县| 平武县| 思茅市| 新丰县| 治县。| 化德县| 娱乐| 郴州市| 木兰县| 航空| 云安县| 巴林右旗| 辽源市| 临澧县| 江阴市| 都江堰市| 太仆寺旗| 招远市| 文山县| 高台县| 邢台县| 彰化县| 余江县|