org.mapdb
Interface Engine

All Known Implementing Classes:
AsyncWriteEngine, Caches.HardRef, Caches.HashTable, Caches.LRU, Caches.WeakSoftRef, EngineWrapper, EngineWrapper.CloseOnJVMShutdown, EngineWrapper.ImmutabilityCheckEngine, EngineWrapper.ReadOnlyEngine, EngineWrapper.SerializerCheckEngineWrapper, EngineWrapper.SynchronizedEngineWrapper, Store, StoreDirect, StoreHeap, StoreWAL, TxEngine, TxEngine.Tx

public interface Engine

Centerpiece for record management, `Engine` is simple key value store. Engine is low-level interface and is not meant to be used directly by user. For most operations user should use DB class. In this store key is primitive `long` number, typically pointer to index table. Value is class instance. To turn value into/from binary form serializer is required as extra argument for most operations. Unlike other DBs MapDB does not expect user to (de)serialize data before they are passed as arguments. Instead MapDB controls (de)serialization itself. This gives DB a lot of flexibility: for example instances may be held in cache to minimise number of deserializations, or modified instance can be placed into queue and asynchronously written on background thread. There is Store subinterface for raw persistence Most of MapDB features comes from EngineWrappers, which are stacked on top of each other to provide asynchronous writes, instance cache, encryption etc.. `Engine` stack is very elegant and uniform way to handle additional functionality. Other DBs need an ORM framework to achieve similar features. In default configuration MapDB runs with this `Engine` stack: * **DISK** - raw file or memory * StoreWAL - permanent record store with transactions * Caches.HashTable - instance cache * **USER** - DB and collections TODO document more examples of Engine wrappers Engine uses `recid` to identify records. There is zero error handling in case recid is invalid (random number or already deleted record). Passing illegal recid may result into anything (return null, throw EOF or even corrupt store). Engine is considered low-level component and it is responsibility of upper layers (collections) to ensure recid is consistent. Lack of error handling is trade of for speed (similar way as manual memory management in C++)

Engine must support `null` record values. You may insert, update and fetch null records. Nulls play important role in recid preallocation and asynchronous writes.

Recid can be reused after it was deleted. If your application relies on unique being unique, you should update record with null value, instead of delete. Null record consumes only 8 bytes in store and is preserved during defragmentation.

Author:
Jan Kotek

Field Summary
static long CATALOG_RECID
           
static long CHECK_RECORD
           
static long CLASS_INFO_RECID
           
static long LAST_RESERVED_RECID
           
 
Method Summary
 boolean canRollback()
           
 boolean canSnapshot()
           
 void clearCache()
          clears any underlying cache
 void close()
          Close store/cache.
 void closeListenerRegister(Runnable closeListener)
           
 void closeListenerUnregister(Runnable closeListener)
           
 void commit()
          Makes all changes made since the previous commit/rollback permanent.
 void compact()
           
<A> boolean
compareAndSwap(long recid, A expectedOldValue, A newValue, Serializer<A> serializer)
          Updates existing record in atomic (Compare And Swap) manner.
<A> void
delete(long recid, Serializer<A> serializer)
          Remove existing record from store/cache

Recid must be a number returned by 'put' method.

<A> A
get(long recid, Serializer<A> serializer)
          Get existing record.
 SerializerPojo getSerializerPojo()
          Deprecated. 
 boolean isClosed()
          Checks whether Engine was closed.
 boolean isReadOnly()
          Check if you can write into this Engine.
 long preallocate()
          Preallocates recid for not yet created record.
 void preallocate(long[] recids)
          Preallocates recids for not yet created record.
<A> long
put(A value, Serializer<A> serializer)
          Insert new record.
 void rollback()
          Undoes all changes made in the current transaction.
 Engine snapshot()
          Returns read-only snapshot of data in Engine.
<A> void
update(long recid, A value, Serializer<A> serializer)
          Update existing record with new value.
 

Field Detail

CATALOG_RECID

static final long CATALOG_RECID
See Also:
Constant Field Values

CLASS_INFO_RECID

static final long CLASS_INFO_RECID
See Also:
Constant Field Values

CHECK_RECORD

static final long CHECK_RECORD
See Also:
Constant Field Values

LAST_RESERVED_RECID

static final long LAST_RESERVED_RECID
See Also:
Constant Field Values
Method Detail

preallocate

long preallocate()
Preallocates recid for not yet created record. It does not insert any data into it.

Returns:
new recid

preallocate

void preallocate(long[] recids)
Preallocates recids for not yet created record. It does not insert any data into it. This is done in batch of given size (determied by size of array in argument)

Parameters:
recids - array to put result into

put

<A> long put(A value,
             Serializer<A> serializer)
Insert new record.

Parameters:
value - records to be added
serializer - used to convert record into/from binary form
Returns:
recid (record identifier) under which record is stored.

get

<A> A get(long recid,
          Serializer<A> serializer)
Get existing record.

Recid must be a number returned by 'put' method. Behaviour for invalid recid (random number or already deleted record) is not defined, typically it returns null or throws 'EndOfFileException'

Parameters:
recid - (record identifier) under which record was persisted
serializer - used to deserialize record from binary form
Returns:
record matching given recid, or null if record is not found under given recid.

update

<A> void update(long recid,
                A value,
                Serializer<A> serializer)
Update existing record with new value.

Recid must be a number returned by 'put' method. Behaviour for invalid recid (random number or already deleted record) is not defined, typically it throws 'EndOfFileException', but it may also corrupt store.

Parameters:
recid - (record identifier) under which record was persisted.
value - new record value to be stored
serializer - used to serialize record into binary form

compareAndSwap

<A> boolean compareAndSwap(long recid,
                           A expectedOldValue,
                           A newValue,
                           Serializer<A> serializer)
Updates existing record in atomic (Compare And Swap) manner. Value is modified only if old value matches expected value. There are three ways to match values, MapDB may use any of them:
  1. Equality check oldValue==expectedOldValue when old value is found in instance cache
  2. Deserializing oldValue using serializer and checking oldValue.equals(expectedOldValue)
  3. Serializing expectedOldValue using serializer and comparing binary array with already serialized oldValue

Recid must be a number returned by 'put' method. Behaviour for invalid recid (random number or already deleted record) is not defined, typically it throws 'EndOfFileException', but it may also corrupt store.

Parameters:
recid - (record identifier) under which record was persisted.
expectedOldValue - old value to be compared with existing record
newValue - to be written if values are matching
serializer - used to serialize record into binary form
Returns:
true if values matched and newValue was written

delete

<A> void delete(long recid,
                Serializer<A> serializer)
Remove existing record from store/cache

Recid must be a number returned by 'put' method. Behaviour for invalid recid (random number or already deleted record) is not defined, typically it throws 'EndOfFileException', but it may also corrupt store.

Parameters:
recid - (record identifier) under which was record persisted
serializer - which may be used in some circumstances to deserialize and store old object

close

void close()
Close store/cache. This method must be called before JVM exits to flush all caches and prevent store corruption. Also it releases resources used by MapDB (disk, memory..).

Engine can no longer be used after this method was called. If Engine is used after closing, it may throw any exception including NullPointerException

There is an configuration option DBMaker.closeOnJvmShutdown() which uses shutdown hook to automatically close Engine when JVM shutdowns.


isClosed

boolean isClosed()
Checks whether Engine was closed.

Returns:
true if engine was closed

commit

void commit()
Makes all changes made since the previous commit/rollback permanent. In transactional mode (on by default) it means creating journal file and replaying it to storage. In other modes it may flush disk caches or do nothing at all (check your config options)


rollback

void rollback()
              throws UnsupportedOperationException
Undoes all changes made in the current transaction. If transactions are disabled it throws UnsupportedOperationException.

Throws:
UnsupportedOperationException - if transactions are disabled

isReadOnly

boolean isReadOnly()
Check if you can write into this Engine. It may be readonly in some cases (snapshot, read-only files).

Returns:
true if engine is read-only

canRollback

boolean canRollback()
Returns:
true if engine supports rollback

canSnapshot

boolean canSnapshot()
Returns:
true if engine can create read-only snapshots

snapshot

Engine snapshot()
                throws UnsupportedOperationException
Returns read-only snapshot of data in Engine.

Throws:
UnsupportedOperationException - if snapshots are not supported/enabled
See Also:
EngineWrapper.canSnapshot()

clearCache

void clearCache()
clears any underlying cache


compact

void compact()

getSerializerPojo

@Deprecated
SerializerPojo getSerializerPojo()
Deprecated. 

Returns default serializer associated with this engine. The default serializer will be moved from Engine into DB, so it is deprecated now and this method will be removed.


closeListenerRegister

void closeListenerRegister(Runnable closeListener)

closeListenerUnregister

void closeListenerUnregister(Runnable closeListener)


Copyright © 2014. All Rights Reserved.