操作blob字段是否会产生大量redo,答案是不会。以下来做一个实验,測试数据库版本号是11.2.0.1.0:

--创建一张表做測试之用

create table test_blob

(

  id number,

  tupian blob

);

import java.io.FileInputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import oracle.sql.BLOB; public class BlobExample {
static final String driver_class = "oracle.jdbc.driver.OracleDriver";
static final String connectionURL = "jdbc:oracle:thin:@10.10.15.25:1521:orcl";
static final String userID = "test";
static final String userPassword = "test"; private void insertTestBlob() {
Connection conn=null;
Statement stm=null;
ResultSet rs=null;
BLOB blob = null;
FileInputStream fin=null;
OutputStream out=null;
try{
conn = DriverManager.getConnection(connectionURL, userID, userPassword);
stm = conn.createStatement();
conn.setAutoCommit(false);
String sql = "insert into test_blob values(1,EMPTY_BLOB())";
stm.executeUpdate(sql);
rs = stm.executeQuery("SELECT tupian FROM test_blob WHERE id=1 FOR UPDATE ");
fin = new FileInputStream("d://20130317.jpg");
byte[] blobBuf = new byte[(int)fin.available()];
fin.read(blobBuf);
fin.close(); if(rs.next()) {
blob = (oracle.sql.BLOB)rs.getBlob(1);
out = blob.getBinaryOutputStream();
out.write(blobBuf);
out.close();
conn.commit();
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
rs.close();
stm.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]){
BlobExample blobClobExample = new BlobExample();
blobClobExample.insertTestBlob();
}
}

--做非常多次

insert into test_blob  select * from test_blob;

insert into test_blob  select * from test_blob;

insert into test_blob  select * from test_blob;

.......

commit;

--准备dump block

select rowid,

       dbms_rowid.rowid_object(rowid) object_id,

       dbms_rowid.rowid_relative_fno(rowid) file_id,

       dbms_rowid.rowid_block_number(rowid) block_id,

       dbms_rowid.rowid_row_number(rowid) num

  from test_blob;

--update之前blob的状态

alter session set tracefile_identifier = 'Look_For_Me';

alter system switch logfile;

alter system switch logfile;

alter system dump datafile 5 block 3274932;

--update之后blob的状态。同一时候測试一下。此时update产生了多少redo

select name, value

  from v$mystat, v$statname

 where v$mystat.statistic# = v$statname.statistic#

   and v$statname.name = 'redo size'

update test_blob set tupian = null;

commit;

select name, value

  from v$mystat, v$statname

 where v$mystat.statistic# = v$statname.statistic#

   and v$statname.name = 'redo size'

alter system switch logfile;

alter system switch logfile;

alter session set tracefile_identifier = 'Look_For_Me1';

alter system dump datafile 5 block 3274932;

測试结果:我传的图片是5.1M,一共产生了350条数据,都把blob置为空以后,共产生了7.6M的redo,非常显然是blob的内容是没有产生redo的。

分析原理,得借助分析dump block的内容,能够看到设置blob字段为null后产生的redo仅仅是类似col  1: [84]这些信息。

blob设置为空曾经:

Block header dump:  0x0171f8b4

 Object id on Block? Y

 seg/obj: 0x17f1d  csc: 0x9a8.7256c728  itc: 2  flg: E  typ: 1 - DATA

     brn: 0  bdba: 0x171f8b0 ver: 0x01 opc: 0

     inc: 0  exflg: 0

 

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x0003.01b.000033cf  0x00c001f5.132c.39  --U-    1  fsc 0x0000.7256c775

0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

bdba: 0x0171f8b4

data_block_dump,data header at 0x2b35c4c56064

===============

tsiz: 0x1f98

hsiz: 0x14

pbl: 0x2b35c4c56064

     76543210

flag=--------

ntab=1

nrow=1

frre=-1

fsbo=0x14

fseo=0x1f12

avsp=0x1f29

tosp=0x1f29

0xe:pti[0] nrow=1
offs=0

0x12:pri[0] offs=0x1f12

block_row_dump:

tab 0, row 0, @0x1f12

tl: 91 fb: --H-FL-- lb: 0x1  cc: 2

col  0: [ 2]  c1 02

col  1: [84]

 00 54 00 01 01 0c 00 00 00 01 00 00 00 01 00 00 00 0e 48 41 00 40 05 00 00

 00 02 76 12 a0 00 00 00 00 00 02 01 71 f8 bc 01 71 f8 bd 01 71 f8 be 01 71

 f8 bf 01 71 f8 bb 01 ca 11 3d 01 ca 11 3e 01 ca 11 3f 01 ca 11 39 01 ca 11

 3a 01 ca 11 3b 01 ca 11 3c

LOB

Locator:

  Length:        84(84)

  Version:        1

  Byte Length:    1

  LobID: 00.00.00.01.00.00.00.0e.48.41

  Flags[ 0x01 0x0c 0x00 0x00 ]:

    Type: BLOB 

    Storage: BasicFile

    Enable Storage in Row 

    Characterset Format: IMPLICIT

    Partitioned Table: No

    Options: ReadWrite 

  Inode: 

    Size:     64

    Flag:     0x05 [ Valid InodeInRow(ESIR) ]

    Future:   0x00 (should be '0x00')

    Blocks:   630

    Bytes:    4768

    Version:  00000.0000000002

    DBA Array[12]:

      0x0171f8bc 0x0171f8bd 0x0171f8be 0x0171f8bf

      0x0171f8bb 0x01ca113d 0x01ca113e 0x01ca113f

      0x01ca1139 0x01ca113a 0x01ca113b 0x01ca113c

............................................................

............................................................

End dump data blocks tsn: 6 file#: 5 minblk 3274932 maxblk 3274932

blob设置为空之后:

Block header dump:  0x0171f8b4

 Object id on Block? Y

 seg/obj: 0x17f1d  csc: 0x9a8.7256c99f  itc: 2  flg: E  typ: 1 - DATA

     brn: 0  bdba: 0x171f8b0 ver: 0x01 opc: 0

     inc: 0  exflg: 0

 

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x0003.01b.000033cf  0x00c001f5.132c.39  C---    0  scn 0x09a8.7256c775

0x02   0x0001.003.0000315e  0x00c0218e.1348.3a  --U-    1  fsc 0x0052.7256c9a7

bdba: 0x0171f8b4

data_block_dump,data header at 0x2b7ad6cce464

===============

tsiz: 0x1f98

hsiz: 0x14

pbl: 0x2b7ad6cce464

     76543210

flag=--------

ntab=1

nrow=1

frre=-1

fsbo=0x14

fseo=0x1f0c

avsp=0x1f29

tosp=0x1f7b

0xe:pti[0] nrow=1
offs=0

0x12:pri[0] offs=0x1f0c

block_row_dump:

tab 0, row 0, @0x1f0c

tl: 6 fb: --H-FL-- lb: 0x2  cc: 1

col  0: [ 2]  c1 02

............................................................

............................................................

End dump data blocks tsn: 6 file#: 5 minblk 3274932 maxblk 3274932

oracle 下操作blob字段是否会产生大量redo的更多相关文章

  1. c# winform 操作oracle数据库的Blob字段,把图片存储到数据库,保存图片到数据库

    ///c# winform 操作oracle数据库的Blob字段,把图片存储到数据库,保存图片到数据库 闲话不多说,直接上代码 using System; using System.Collectio ...

  2. oracle 在操作blob该字段是否会产生很多redo

    操作blob该字段是否会产生很多redo,答案是否定的.以下来做一个实验,測试数据库版本号是11.2.0.1.0: --创建一张表做測试之用 create table test_blob (   id ...

  3. Java读取oracle数据库中blob字段数据文件保存到本地文件(转载)

    转自:https://www.cnblogs.com/forever2698/p/4747349.html package com.bo.test; import java.io.FileOutput ...

  4. C# 连接 Oracle,读取Blob字段数据,存到文件中去,包括pdf等等

    代码如下,记得引入Oracle的dll using System; using System.Collections.Generic; using System.ComponentModel; usi ...

  5. java 读写Oracle Blob字段

    许久没有分享代码了,把这段时间写的一个Java操作Blob字段,有日子没写Java了,就当作笔记记录一下.1. [代码][Java]代码     跳至 [1] [全屏预览]package com.wa ...

  6. Oracle数据库BLOB字段的存取

    述]     Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cur ...

  7. 分块读取Blob字段数据(Oracle)

    试过了MSSQL的分块读取Blob字段,又尝试在Oracle下完成,发现还是可行的. 首先建立一个存储过程: create or replace procedure PRO_GET_BLOB(     ...

  8. 【JDBC核心】操作 BLOB 类型字段

    操作 BLOB 类型字段 MySQL BLOB 类型 MySQL 中,BLOB 是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据. 插入 BLOB 类型的数据必须使用 Pre ...

  9. [oracle] Oracle存储过程里操作BLOB的字节数据的办法,例如写入32位整数

    作者: zyl910 一.缘由 BLOB是指二进制大对象,也就是英文Binary Large Object的缩写. 在很多时候,我们是通过其他编程语言(如Java)访问BLOB的字节数据,进行字节级的 ...

随机推荐

  1. JavaScript——BOM(浏览器对象模型),时间间隔和暂停

    BOM(浏览器对象模型):能够对浏览器的窗体进行訪问和操作 1.主要的BOM体系: window------------document-------------------------------- ...

  2. Linux,Docker,Jenkins No such file or directory

    你们先休息下,我先哭哭! 今天在做交接项目的bug修改的时候,在创建文件的时候报错 No such file or directory 然后跟着路径去linux中查看了该路径,但确实存在,并且权限都是 ...

  3. js接收文件流并下载

    js接收文件流并下载 标签(空格分隔): js 在此输入正文 <script type="text/javascript"> function download(fil ...

  4. js 转化为几天前,几小时前,几分钟前...

    转换标准时间为时间戳: function getDateTimeStamp(dateStr){ return Date.parse(dateStr.replace(/-/gi,"/" ...

  5. Maven 学习笔记(三)

    有时我们在项目中可能需要打包一个可执行的 jar 包,我最近也遇见了,很傻很天真的用了如下配置: <packaging>jar</packaging> 效果一如既往的好,打包成 ...

  6. Js基础知识(作用域、特殊函数---自调、回调、作为值的函数)

    15.作用域 概念: 规定变量或函数的可被访问的范围和生命周期 分类: 全局作用域 -就是指当前整个页面环境: 局部作用域(函数作用域) -就是指某个函数内部环境 l 变量的作用域 全局变量 - 定义 ...

  7. DB2报“数据库日志已满”问题解决

    用控制中心直接改会比较容易一点,在数据库名称上点右键-->配置-->日志-->日志文件大小.主日志文件数.辅助日志文件数改大一点. 也可用命令行db2cmd db2 update d ...

  8. C++_String_类字符串操作(转)

    从百度文库找的,挺详细的,跟大家分享一下. 标红的是我觉得用的比较多,并且大家不太熟悉的. string类的构造函数: string(const char *s);     //用c字符串s初始化 s ...

  9. ZBrush软件特性之Edit

    ZBrush®中的Edit调控板控制撤销和重做命令,它有一或两个命令设置将根据Tool工具调控板当前选择的工具而定,默认配置的命令仅有文档编辑,不过当激活一个3D工具,只针对这个工具的两个按钮设置变成 ...

  10. CF #487 (Div. 2) D. A Shade of Moonlight 构造_数形结合

    题意: 给 nnn个长度为 lll 且互不相交的开区间 (xi,xi+l)(x_{i}, x_{i}+l)(xi​,xi​+l) ,每个区间有一个移动速度 vvv,v∈1,−1v∈1,-1v∈1,−1 ...