org.apache.ojb.broker.cache
Class ObjectCacheDefaultImpl

java.lang.Object
  extended by org.apache.ojb.broker.cache.ObjectCacheDefaultImpl
All Implemented Interfaces:
ObjectCache, ObjectCacheInternal, PBListener, PBStateListener

public class ObjectCacheDefaultImpl
extends java.lang.Object
implements ObjectCacheInternal, PBStateListener

This global ObjectCache stores all Objects loaded by the PersistenceBroker from a DB using a static Map. This means each ObjectCache instance associated with all PersistenceBroker instances use the same Map to cache objects. This could lead in "dirty-reads" (similar to read-uncommitted mode in DB) when a concurrent thread look up same object modified by another thread.
When the PersistenceBroker tries to get an Object by its Identity. It first lookups the cache if the object has been already loaded and cached.

NOTE: By default objects cached via SoftReference which allows objects (softly) referenced by the cache to be reclaimed by the Java Garbage Collector when they are not longer referenced elsewhere, so lifetime of cached object is limited by
- the lifetime of the cache object - see property timeout.
- the garabage collector used memory settings - see property useSoftReferences.
- the maximum capacity of the cache - see property maxEntry.

Implementation configuration properties:

Property Key Property Values
timeout Lifetime of the cached objects in seconds. If expired the cached object was not returned on lookup call (and removed from cache). Default timeout value is 900 seconds. When set to -1 the lifetime of the cached object depends only on GC and do never get timed out.
autoSync If set true all cached/looked up objects within a PB-transaction are traced. If the the PB-transaction was aborted all traced objects will be removed from cache. Default is false.

NOTE: This does not prevent "dirty-reads" (more info see above).

It's not a smart solution for keeping cache in sync with DB but should do the job in most cases.
E.g. if you lookup 1000 objects within a transaction and modify one object and then abort the transaction, 1000 objects will be passed to cache, 1000 objects will be traced and all 1000 objects will be removed from cache. If you read these objects without tx or in a former tx and then modify one object in a tx and abort the tx, only one object was traced/removed.

cachingKeyType Determines how the key was build for the cached objects:
0 - Identity object was used as key, this was the default setting.
1 - Idenity + jcdAlias name was used as key. Useful when the same object metadata model (DescriptorRepository instance) are used for different databases (JdbcConnectionDescriptor)
2 - Identity + model (DescriptorRepository) was used as key. Useful when different metadata model (DescriptorRepository instance) are used for the same database. Keep in mind that there was no synchronization between cached objects with same Identity but different metadata model.
3 - all together (1+2)
useSoftReferences If set true this class use SoftReference to cache objects. Default value is true.

Version:
$Id: ObjectCacheDefaultImpl.java 365268 2005-12-31 19:02:50Z arminw $
Author:
Thomas Mahler

Field Summary
static java.lang.String AUTOSYNC_PROP
           
static java.lang.String CACHING_KEY_TYPE_PROP
           
static java.lang.String SOFT_REFERENCES_PROP
           
static java.lang.String TIMEOUT_PROP
           
 
Fields inherited from interface org.apache.ojb.broker.cache.ObjectCacheInternal
TYPE_CACHED_READ, TYPE_NEW_MATERIALIZED, TYPE_TEMP, TYPE_UNKNOWN, TYPE_WRITE
 
Constructor Summary
ObjectCacheDefaultImpl(PersistenceBroker broker, java.util.Properties prop)
           
 
Method Summary
 void afterBegin(PBStateEvent event)
          Called after a transaction was started.
 void afterCommit(PBStateEvent event)
          Called after a transaction was comitted.
 void afterOpen(PBStateEvent event)
          Called after the PersistenceBroker instance was obtained from the pool.
 void afterRollback(PBStateEvent event)
          Called after a transaction was rolled back.
 void beforeBegin(PBStateEvent event)
          Called before a transaction was started.
 void beforeClose(PBStateEvent event)
          Called before the PersistenceBroker instance will be returned to the pool.
 void beforeCommit(PBStateEvent event)
          Called before a transaction will be comitted.
 void beforeRollback(PBStateEvent event)
          Called before a transaction will be rolled back.
 void cache(Identity oid, java.lang.Object obj)
          Makes object persistent to the Objectcache.
 boolean cacheIfNew(Identity oid, java.lang.Object obj)
          For internal use within ObjectCache implementations or to build two-level caches.
 void clear()
          Clear ObjectCache.
 void doInternalCache(Identity oid, java.lang.Object obj, int type)
          For internal use.
 java.lang.Object lookup(Identity oid)
          Lookup object with Identity oid in objectTable.
 void remove(Identity oid)
          Removes an Object from the cache.
 java.lang.String toString()
           
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

TIMEOUT_PROP

public static final java.lang.String TIMEOUT_PROP
See Also:
Constant Field Values

AUTOSYNC_PROP

public static final java.lang.String AUTOSYNC_PROP
See Also:
Constant Field Values

CACHING_KEY_TYPE_PROP

public static final java.lang.String CACHING_KEY_TYPE_PROP
See Also:
Constant Field Values

SOFT_REFERENCES_PROP

public static final java.lang.String SOFT_REFERENCES_PROP
See Also:
Constant Field Values
Constructor Detail

ObjectCacheDefaultImpl

public ObjectCacheDefaultImpl(PersistenceBroker broker,
                              java.util.Properties prop)
Method Detail

clear

public void clear()
Clear ObjectCache. I.e. remove all entries for classes and objects.

Specified by:
clear in interface ObjectCache

doInternalCache

public void doInternalCache(Identity oid,
                            java.lang.Object obj,
                            int type)
Description copied from interface: ObjectCacheInternal
For internal use. This method have to be used by all OJB classes to cache objects. It allows to decide if an object should be cached or not. Useful for two level caches to reduce object copy costs.

Specified by:
doInternalCache in interface ObjectCacheInternal

cache

public void cache(Identity oid,
                  java.lang.Object obj)
Makes object persistent to the Objectcache. I'm using soft-references to allow gc reclaim unused objects even if they are still cached.

Specified by:
cache in interface ObjectCache
Parameters:
oid - Identity of the object to cache.
obj - The object to cache.

cacheIfNew

public boolean cacheIfNew(Identity oid,
                          java.lang.Object obj)
Description copied from interface: ObjectCacheInternal
For internal use within ObjectCache implementations or to build two-level caches. Handle with care.

Used to cache new objects (not already cached) by it's Identity. This method was used to cache new materialized objects and should work as a "atomic" method (the check and the put of the object should be atomic) to avoid concurrency problems.

Currently it's not mandatory that all ObjectCache implementations support this method, so in some cases it's allowed to delegate this method call to the standard cache.

Specified by:
cacheIfNew in interface ObjectCacheInternal
Parameters:
oid - Identity of the object to cache.
obj - The object to cache.
Returns:
If object was added true, else false.

lookup

public java.lang.Object lookup(Identity oid)
Lookup object with Identity oid in objectTable. Returns null if no matching id is found

Specified by:
lookup in interface ObjectCache
Parameters:
oid - Identity of the object to search for.
Returns:
The cached object or null if no matching object for specified Identity is found.

remove

public void remove(Identity oid)
Removes an Object from the cache.

Specified by:
remove in interface ObjectCache
Parameters:
oid - Identity of the object to be removed.

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object

beforeRollback

public void beforeRollback(PBStateEvent event)
Description copied from interface: PBStateListener
Called before a transaction will be rolled back.

Specified by:
beforeRollback in interface PBStateListener
Parameters:
event - The event object

beforeCommit

public void beforeCommit(PBStateEvent event)
Description copied from interface: PBStateListener
Called before a transaction will be comitted.

Specified by:
beforeCommit in interface PBStateListener
Parameters:
event - The event object

beforeClose

public void beforeClose(PBStateEvent event)
Description copied from interface: PBStateListener
Called before the PersistenceBroker instance will be returned to the pool.

Specified by:
beforeClose in interface PBStateListener
Parameters:
event - The event object

afterRollback

public void afterRollback(PBStateEvent event)
Description copied from interface: PBStateListener
Called after a transaction was rolled back.

Specified by:
afterRollback in interface PBStateListener
Parameters:
event - The event object

afterCommit

public void afterCommit(PBStateEvent event)
Description copied from interface: PBStateListener
Called after a transaction was comitted.

Specified by:
afterCommit in interface PBStateListener
Parameters:
event - The event object

afterBegin

public void afterBegin(PBStateEvent event)
Description copied from interface: PBStateListener
Called after a transaction was started.

Specified by:
afterBegin in interface PBStateListener
Parameters:
event - The event object

beforeBegin

public void beforeBegin(PBStateEvent event)
Description copied from interface: PBStateListener
Called before a transaction was started.

Specified by:
beforeBegin in interface PBStateListener
Parameters:
event - The event object

afterOpen

public void afterOpen(PBStateEvent event)
Description copied from interface: PBStateListener
Called after the PersistenceBroker instance was obtained from the pool.

Specified by:
afterOpen in interface PBStateListener
Parameters:
event - The event object


(C) 2002 - 2006 Apache Software Foundation
All rights reserved. Published under the Apache License 2.0.
http://db.apache.org/ojb
Version: 1.0.4, 2005-12-30