org.jboss.cache.loader
Class AdjListJDBCCacheLoader

java.lang.Object
  extended by org.jboss.cache.loader.AbstractCacheLoader
      extended by org.jboss.cache.loader.AdjListJDBCCacheLoader
All Implemented Interfaces:
CacheLoader
Direct Known Subclasses:
JDBCCacheLoader, JDBCCacheLoaderOld

@ThreadSafe
public abstract class AdjListJDBCCacheLoader
extends AbstractCacheLoader

Adjacency List Model is the model of persisting trees in which each children holds a reference to its parent. An alternative model is the Nested Set Model (a.k.a. Modified Preorder Model) - this approach adds some additional indexing information to each persisted node. This indexing info is further used for optimizing operations like subtree loading, deleting etc. The indexes are update for each insertion.

Adjacency List Model proved more performance-effective for the following reason: the entire path is persisted rather than only a reference to parent. Looking up nodes heavily relies on that, and the performance is similar as in the case of Modified Preorder Model. Even more there is no costly update indexes operation.

Version:
1.0
Author:
Mircea.Markus@iquestint.com, Galder Zamarreno

Field Summary
protected  ConnectionFactory cf
           
protected  java.lang.String driverName
           
protected  StripedLock lock
           
protected static java.util.Map NULL_NODE_IN_ROW
           
 
Fields inherited from class org.jboss.cache.loader.AbstractCacheLoader
cache, regionManager
 
Constructor Summary
AdjListJDBCCacheLoader()
           
 
Method Summary
 void commit(java.lang.Object tx)
          Commits a transaction.
 void create()
          Lifecycle method, called when the cache loader is created.
 void destroy()
          Lifecycle method, called when the cache loader is destroyed.
 boolean exists(Fqn name)
          Checks that there is a row for the fqn in the database.
 java.util.Map get(Fqn name)
          Returns a map representing a node.
 java.util.Set<java.lang.String> getChildrenNames(Fqn fqn)
          Fetches child node names (not pathes).
protected  java.lang.String getDriverName(java.sql.Connection con)
           
protected abstract  org.apache.commons.logging.Log getLogger()
           
protected  void insertNode(Fqn name, java.util.Map node)
          Inserts a node into the database
protected  java.util.Map loadNode(Fqn name)
          Loads a node from the database.
protected  byte[] marshall(java.lang.Object obj)
           
 void prepare(java.lang.Object tx, java.util.List<Modification> modifications, boolean one_phase)
          First phase in transaction commit process.
protected abstract  AdjListJDBCCacheLoaderConfig processConfig(CacheLoaderConfig.IndividualCacheLoaderConfig base)
           
 java.lang.Object remove(Fqn name, java.lang.Object key)
          Removes attribute's value for a key.
 void removeData(Fqn name)
          Nullifies the node.
protected  void reportAndRethrowError(java.lang.String message, java.lang.Exception cause)
           
 void rollback(java.lang.Object tx)
          Rolls back a transaction.
protected  void safeClose(java.io.InputStream is)
           
protected  void safeClose(java.sql.ResultSet rs)
           
protected  void safeClose(java.sql.Statement st)
           
 void setConfig(CacheLoaderConfig.IndividualCacheLoaderConfig base)
          Sets the configuration.
 void start()
          Lifecycle method, called when the cache loader is started.
 void stop()
          Lifecycle method, called when the cache loader is stopped.
protected  boolean tableExists(java.lang.String tableName, java.sql.Connection con)
           
protected  java.lang.Object unmarshall(java.io.InputStream from)
           
protected  void updateNode(Fqn name, java.util.Map node)
          Updates a node in the database.
 
Methods inherited from class org.jboss.cache.loader.AbstractCacheLoader
getMarshaller, getNodeDataList, loadEntireState, loadState, loadStateHelper, put, put, setCache, setRegionManager, storeEntireState, storeState
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.jboss.cache.loader.CacheLoader
getConfig, put, put, remove
 

Field Detail

cf

protected ConnectionFactory cf

driverName

protected java.lang.String driverName

lock

protected StripedLock lock

NULL_NODE_IN_ROW

protected static final java.util.Map NULL_NODE_IN_ROW
Constructor Detail

AdjListJDBCCacheLoader

public AdjListJDBCCacheLoader()
Method Detail

setConfig

public void setConfig(CacheLoaderConfig.IndividualCacheLoaderConfig base)
Description copied from interface: CacheLoader
Sets the configuration. This is called before CacheLoader.create() and CacheLoader.start().

Parameters:
base - May be an instance of the CacheLoaderConfig.IndividualCacheLoaderConfig base class, in which case the cache loader should use the CacheLoaderConfig.IndividualCacheLoaderConfig.getProperties() method to find configuration information. Alternatively, may be a type-specific subclass of CacheLoaderConfig.IndividualCacheLoaderConfig, if there is one.

get

public java.util.Map get(Fqn name)
                  throws java.lang.Exception
Returns a map representing a node.

Parameters:
name - node's fqn
Returns:
node
Throws:
java.lang.Exception

getChildrenNames

public java.util.Set<java.lang.String> getChildrenNames(Fqn fqn)
                                                 throws java.lang.Exception
Fetches child node names (not pathes).

Parameters:
fqn - parent fqn
Returns:
a set of child node names or null if there are not children found for the fqn
Throws:
java.lang.Exception

removeData

public void removeData(Fqn name)
                throws java.lang.Exception
Nullifies the node.

Parameters:
name - node's fqn
Throws:
java.lang.Exception

prepare

public void prepare(java.lang.Object tx,
                    java.util.List<Modification> modifications,
                    boolean one_phase)
             throws java.lang.Exception
First phase in transaction commit process. The changes are committed if only one phase if requested. All the modifications are committed using the same connection.

Parameters:
tx - something representing transaction
modifications - a list of modifications
one_phase - indicates whether it's one or two phase commit transaction
Throws:
java.lang.Exception

commit

public void commit(java.lang.Object tx)
            throws java.lang.Exception
Commits a transaction.

Parameters:
tx - the tx to commit
Throws:
java.lang.Exception

rollback

public void rollback(java.lang.Object tx)
Rolls back a transaction.

Parameters:
tx - the tx to rollback

create

public void create()
            throws java.lang.Exception
Description copied from interface: CacheLoader
Lifecycle method, called when the cache loader is created.

Throws:
java.lang.Exception

start

public void start()
           throws java.lang.Exception
Description copied from interface: CacheLoader
Lifecycle method, called when the cache loader is started.

Throws:
java.lang.Exception

stop

public void stop()
Description copied from interface: CacheLoader
Lifecycle method, called when the cache loader is stopped.


destroy

public void destroy()
Description copied from interface: CacheLoader
Lifecycle method, called when the cache loader is destroyed.


exists

public boolean exists(Fqn name)
               throws java.lang.Exception
Checks that there is a row for the fqn in the database.

Parameters:
name - node's fqn
Returns:
true if there is a row in the database for the given fqn even if the node column is null.
Throws:
java.lang.Exception

remove

public java.lang.Object remove(Fqn name,
                               java.lang.Object key)
                        throws java.lang.Exception
Removes attribute's value for a key. If after removal the node contains no attributes, the node is nullified.

Parameters:
name - node's name
key - attribute's key
Returns:
removed value or null if there was no value for the passed in key
Throws:
java.lang.Exception

loadNode

protected java.util.Map loadNode(Fqn name)
Loads a node from the database.

Parameters:
name - the fqn
Returns:
non-null Map representing the node, null if there is no row with the fqn in the table, NULL_NODE_IN_ROW if there is a row in the table with the fqn but the node column contains null.

insertNode

protected void insertNode(Fqn name,
                          java.util.Map node)
Inserts a node into the database

Parameters:
name - the fqn
node - the node

updateNode

protected void updateNode(Fqn name,
                          java.util.Map node)
Updates a node in the database.

Parameters:
name - the fqn
node - new node value

getDriverName

protected java.lang.String getDriverName(java.sql.Connection con)

tableExists

protected boolean tableExists(java.lang.String tableName,
                              java.sql.Connection con)

getLogger

protected abstract org.apache.commons.logging.Log getLogger()

processConfig

protected abstract AdjListJDBCCacheLoaderConfig processConfig(CacheLoaderConfig.IndividualCacheLoaderConfig base)

reportAndRethrowError

protected void reportAndRethrowError(java.lang.String message,
                                     java.lang.Exception cause)
                              throws java.lang.IllegalStateException
Throws:
java.lang.IllegalStateException

safeClose

protected void safeClose(java.io.InputStream is)

safeClose

protected void safeClose(java.sql.Statement st)

safeClose

protected void safeClose(java.sql.ResultSet rs)

unmarshall

protected java.lang.Object unmarshall(java.io.InputStream from)
                               throws java.lang.Exception
Throws:
java.lang.Exception

marshall

protected byte[] marshall(java.lang.Object obj)
                   throws java.lang.Exception
Throws:
java.lang.Exception