【问题标题】:Where is streamed blob data saved until commit?在提交之前,流式 blob 数据保存在哪里?
【发布时间】:2014-09-05 06:45:06
【问题描述】:

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 将存储在哪个“记录”中,所以我有点怀疑这实际上是如何工作的 - 数据写入哪里?是否有某种内存暂存区可供数据流式传输,并且根据我是提交还是回滚,数据在特定记录中可用(或在回滚时删除)?

【问题讨论】:

    标签: c# sql oracle stream devart


    【解决方案1】:

    来自devart docs

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

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

    然后,来自oracle docs

    管理临时 LOB

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

    管理临时 LOB 的临时表空间

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

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

    【讨论】:

    • 感谢分享。我目前正在使用从 ASP.NET WebApi 到 Oracle 的流式传输功能,除了让事情正常工作之外,我还想了解在各种 API 中的事情实际上是如何工作的。这对我帮助很大 - 再次感谢。
    猜你喜欢
    • 2013-09-02
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2013-07-23
    • 2018-02-17
    • 2017-02-22
    相关资源
    最近更新 更多