org.h2.store
Class LobStorageBackend

java.lang.Object
  extended by org.h2.store.LobStorageBackend
All Implemented Interfaces:
LobStorageInterface

public class LobStorageBackend
extends java.lang.Object
implements LobStorageInterface

This class stores LOB objects in the database. This is the back-end i.e. the server side of the LOB storage.

Using the system session

Why do we use the system session to store the data? Some LOB operations can take a very long time. If we did them on a normal session, we would be locking the LOB tables for long periods of time, which is extremely detrimental to the rest of the system. Perhaps when we shift to the MVStore engine, we can revisit this design decision (using the StreamStore, that is, no connection at all).

Locking

Normally, the locking order in H2 is: first lock the Session object, then lock the Database object. However, in the case of the LOB data, we are using the system session to store the data. If we locked the normal way, we see deadlocks caused by the following pattern:

  Thread 1:
     locks normal session
     locks database
     waiting to lock system session
  Thread 2:
      locks system session
      waiting to lock database.
 
So, in this class alone, we do two things: we have our very own dedicated session, the LOB session, and we take the locks in this order: first the Database object, and then the LOB session. Since we own the LOB session, no-one else can lock on it, and we are safe.


Nested Class Summary
static class LobStorageBackend.CountingReaderInputStream
          An input stream that reads the data from a reader.
 class LobStorageBackend.LobInputStream
          An input stream that reads from a LOB.
 
Field Summary
static java.lang.String LOB_DATA_TABLE
          The name of the lob data table.
 
Constructor Summary
LobStorageBackend(Database database)
           
 
Method Summary
 ValueLobDb copyLob(int type, long oldLobId, int tableId, long length)
          Copy a lob.
 Value createBlob(java.io.InputStream in, long maxLength)
          Create a BLOB object.
 Value createClob(java.io.Reader reader, long maxLength)
          Create a CLOB object.
 java.io.InputStream getInputStream(long lobId, byte[] hmac, long byteCount)
          Get the input stream for the given lob.
 void init()
          Initialize the lob storage.
 void removeAllForTable(int tableId)
          Remove all LOBs for this table.
 void removeLob(long lob)
          Delete a LOB from the database.
 void setTable(long lobId, int table)
          Set the table reference of this lob.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

LOB_DATA_TABLE

public static final java.lang.String LOB_DATA_TABLE
The name of the lob data table. If this table exists, then lob storage is used.

See Also:
Constant Field Values
Constructor Detail

LobStorageBackend

public LobStorageBackend(Database database)
Method Detail

init

public void init()
Initialize the lob storage.


removeAllForTable

public void removeAllForTable(int tableId)
Remove all LOBs for this table.

Parameters:
tableId - the table id

removeLob

public void removeLob(long lob)
Description copied from interface: LobStorageInterface
Delete a LOB from the database.

Specified by:
removeLob in interface LobStorageInterface
Parameters:
lob - the lob id

getInputStream

public java.io.InputStream getInputStream(long lobId,
                                          byte[] hmac,
                                          long byteCount)
                                   throws java.io.IOException
Description copied from interface: LobStorageInterface
Get the input stream for the given lob.

Specified by:
getInputStream in interface LobStorageInterface
Parameters:
lobId - the lob id
hmac - the message authentication code (for remote input streams)
byteCount - the number of bytes to read, or -1 if not known
Returns:
the stream
Throws:
java.io.IOException

copyLob

public ValueLobDb copyLob(int type,
                          long oldLobId,
                          int tableId,
                          long length)
Description copied from interface: LobStorageInterface
Copy a lob.

Specified by:
copyLob in interface LobStorageInterface
Parameters:
type - the type
oldLobId - the old lob id
tableId - the new table id
length - the length
Returns:
the new lob

createBlob

public Value createBlob(java.io.InputStream in,
                        long maxLength)
Description copied from interface: LobStorageInterface
Create a BLOB object.

Specified by:
createBlob in interface LobStorageInterface
Parameters:
in - the input stream
maxLength - the maximum length (-1 if not known)
Returns:
the LOB

createClob

public Value createClob(java.io.Reader reader,
                        long maxLength)
Description copied from interface: LobStorageInterface
Create a CLOB object.

Specified by:
createClob in interface LobStorageInterface
Parameters:
reader - the reader
maxLength - the maximum length (-1 if not known)
Returns:
the LOB

setTable

public void setTable(long lobId,
                     int table)
Description copied from interface: LobStorageInterface
Set the table reference of this lob.

Specified by:
setTable in interface LobStorageInterface
Parameters:
lobId - the lob
table - the table