在提交之前,流式blob数据保存在哪里?

时间:2014-07-15 07:08:45

标签: c# sql oracle stream devart

devart docs开始说:

  

请注意,将数据写入OracleLob对象会立即将数据传输到服务器。

但它没有提到这实际上是如何运作的。例如,在以下示例中(来自the docs):

public void UploadBlob(OracleConnection myConnection) 
{ 
  FileStream fs = new FileStream("D:\\Tmp\\_Water.bmp", FileMode.Open, FileAccess.Read); 
  BinaryReader r = new BinaryReader(fs); 
  myConnection.Open(); 
  OracleLob myLob = new OracleLob(myConnection,OracleDbType.Blob); 
  int streamLength = (int)fs.Length; 
  myLob.Write(r.ReadBytes(streamLength), 0, streamLength); 
  OracleCommand myCommand = new OracleCommand("INSERT INTO Pictures (ID, PicName, Picture) VALUES(1,'Water',:Pictures)", myConnection); 
  OracleParameter myParam = myCommand.Parameters.Add("Pictures", OracleDbType.Blob); 
  myParam.OracleValue = myLob; 
  try 
  { 
    Console.WriteLine(myCommand.ExecuteNonQuery() + " rows affected."); 
  } 
  finally 
  { 
    myConnection.Close(); 
    r.Close(); 
    fs.Close(); 
  } 
} 

...然后根据文档,数据应该在myLob.Write(r.ReadBytes(streamLength), 0, streamLength);行发送到数据库服务器 - 但此时数据库不知道"记录" blob将被存储,所以我对这实际如何工作有点怀疑 - 数据写在哪里?是否存在某种内存暂存区域,数据流传输到该区域,并且根据我是否提交或回滚,数据在特定记录中可用(如果回滚则删除)?

1 个答案:

答案 0 :(得分:1)

来自devart docs

  

如果LOB没有来自服务器上的表的引用,则认为它是临时的。临时LOB用于将新数据插入表中。

     

请注意,提交事务时会销毁临时LOB。

然后,从oracle docs

  

管理临时LOB

     

数据库跟踪每个会话中的临时LOB,并提供名为v $ temporary_lobs的v $视图。从会话中,应用程序可以确定哪个用户拥有临时LOB。作为数据库管理员,您可以使用此视图来监视和指导临时LOB使用的临时空间的任何紧急清理。

     

管理临时LOB的临时表空间

     

临时表空间用于存储临时LOB数据。作为数据库管理员,您可以通过控制用户对临时表空间的访问以及创建不同的临时表空间来控制临时LOB数据的数据存储资源。

因此,在插入时,您将写入临时表空间。提交时,Oracle会将该数据复制到“它的位置”(通常是某个表空间中的LOB段,但对于简短的LOB,它可能只是将其与其他行数据一起存储)。