Где хранятся потоковые данные BLOB до фиксации?

1

Из дедартных документов говорится, что:

Обратите внимание, что запись данных в объект OracleLob приводит к немедленной передаче данных на сервер.

Но он не упоминает, как это работает. Например, в следующем примере (из документов):

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, поэтому я немного сомневаюсь в том, как это работает на самом деле - где записаны данные? Есть ли какая-то промежуточная область памяти, в которую поступают данные, и в зависимости от того, я совершил или откатился, данные становятся доступными в конкретной записи (или удаляются при откате)?

Теги:
stream
devart

1 ответ

1
Лучший ответ

Из дедартных документов

LOB считается временным, если он не имеет ссылок на таблицы на сервере. Временные LOB используются для вставки новых данных в таблицы.

Обратите внимание, что временные LOB уничтожаются при совершении транзакции.

И затем, из документов оракула

Управление временными LOB

База данных отслеживает временные LOB в каждом сеансе и предоставляет av $ view, называемый v $ tempor_lobs. Из сеанса приложение может определить, какой пользователь владеет временным LOB. В качестве администратора базы данных вы можете использовать это представление для мониторинга и руководства по любой аварийной очистке временного пространства, используемого временными LOB.

Управление временным табличным пространством для временных LOB

Временное табличное пространство используется для хранения временных данных LOB. В качестве администратора базы данных вы управляете ресурсами хранения данных для временных данных LOB, контролируя доступ пользователей к временным табличным пространствам и создавая различные временные табличные пространства.

Итак, когда вы вставляете, вы пишете во временное табличное пространство. Когда вы совершаете транзакции, Oracle копирует эти данные в "свое место" (обычно это сегмент LOB в некотором табличном пространстве, но для коротких объектов LOB он может просто хранить его в строке с другими данными строки).

  • 0
    Спасибо, что поделились этим. В настоящее время я работаю с потоковой функциональностью от ASP.NET WebApi до Oracle, и помимо того, чтобы заставить вещи работать, я хотел бы понять, как на самом деле все работает в различных API. Это мне очень помогло - еще раз спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню