|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.apache.ojb.broker.cache.ObjectCacheDefaultImpl
public class ObjectCacheDefaultImpl
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.
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
timeout
.
useSoftReferences
.
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.
|
Nested Class Summary | |
---|---|
(package private) static interface |
ObjectCacheDefaultImpl.CacheEntry
|
(package private) static class |
ObjectCacheDefaultImpl.CacheEntryHard
|
(package private) static class |
ObjectCacheDefaultImpl.CacheEntrySoft
|
(package private) static class |
ObjectCacheDefaultImpl.OrderedTuple
Implements equals() and hashCode() for an ordered tuple of constant(!) objects |
Field Summary | |
---|---|
static String |
AUTOSYNC_PROP
|
protected PersistenceBroker |
broker
|
static String |
CACHING_KEY_TYPE_PROP
|
private int |
cachingKeyType
Determines how the key was build for the cached objects: 0 - Identity object was used as key 1 - Idenity + jcdAlias name was used as key 2 - Identity + model (DescriptorRepository) was used as key 3 - all together (1+2) |
private static long |
failCount
|
private static long |
gcCount
|
private static long |
hitCount
|
private List |
identitiesInWork
|
private Logger |
log
|
protected static Map |
objectTable
static Map held all cached objects |
private static ReferenceQueue |
queue
|
static String |
SOFT_REFERENCES_PROP
|
private long |
timeout
Timeout of the cached objects. |
static String |
TIMEOUT_PROP
|
private boolean |
useAutoSync
|
private boolean |
useSoftReferences
|
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,
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. |
private ObjectCacheDefaultImpl.CacheEntry |
buildEntry(Object obj,
Identity oid)
|
private Object |
buildKey(Identity oid)
|
void |
cache(Identity oid,
Object obj)
Makes object persistent to the Objectcache. |
boolean |
cacheIfNew(Identity oid,
Object obj)
For internal use within ObjectCache implementations or to build two-level caches. |
void |
clear()
Clear ObjectCache. |
void |
doInternalCache(Identity oid,
Object obj,
int type)
For internal use. |
Object |
lookup(Identity oid)
Lookup object with Identity oid in objectTable. |
private void |
processQueue()
|
void |
remove(Identity oid)
Removes an Object from the cache. |
private void |
removeTracedIdentity(Identity oid)
|
private void |
synchronizeWithTracedObjects()
|
String |
toString()
|
private void |
traceIdentity(Identity oid)
|
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Field Detail |
---|
private Logger log
public static final String TIMEOUT_PROP
public static final String AUTOSYNC_PROP
public static final String CACHING_KEY_TYPE_PROP
public static final String SOFT_REFERENCES_PROP
protected static final Map objectTable
private static final ReferenceQueue queue
private static long hitCount
private static long failCount
private static long gcCount
protected PersistenceBroker broker
private List identitiesInWork
private long timeout
private boolean useAutoSync
private int cachingKeyType
private boolean useSoftReferences
Constructor Detail |
---|
public ObjectCacheDefaultImpl(PersistenceBroker broker, Properties prop)
Method Detail |
---|
public void clear()
clear
in interface ObjectCache
public void doInternalCache(Identity oid, Object obj, int type)
ObjectCacheInternal
doInternalCache
in interface ObjectCacheInternal
public void cache(Identity oid, Object obj)
cache
in interface ObjectCache
oid
- Identity of the object to cache.obj
- The object to cache.public boolean cacheIfNew(Identity oid, Object obj)
ObjectCacheInternal
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
.
cacheIfNew
in interface ObjectCacheInternal
oid
- Identity of the object to cache.obj
- The object to cache.
public Object lookup(Identity oid)
lookup
in interface ObjectCache
oid
- Identity of the object to search for.
Identity
is found.public void remove(Identity oid)
remove
in interface ObjectCache
oid
- Identity of the object to be removed.public String toString()
toString
in class Object
private void traceIdentity(Identity oid)
private void removeTracedIdentity(Identity oid)
private void synchronizeWithTracedObjects()
public void beforeRollback(PBStateEvent event)
PBStateListener
beforeRollback
in interface PBStateListener
event
- The event objectpublic void beforeCommit(PBStateEvent event)
PBStateListener
beforeCommit
in interface PBStateListener
event
- The event objectpublic void beforeClose(PBStateEvent event)
PBStateListener
PersistenceBroker
instance will be returned to the pool.
beforeClose
in interface PBStateListener
event
- The event objectpublic void afterRollback(PBStateEvent event)
PBStateListener
afterRollback
in interface PBStateListener
event
- The event objectpublic void afterCommit(PBStateEvent event)
PBStateListener
afterCommit
in interface PBStateListener
event
- The event objectpublic void afterBegin(PBStateEvent event)
PBStateListener
afterBegin
in interface PBStateListener
event
- The event objectpublic void beforeBegin(PBStateEvent event)
PBStateListener
beforeBegin
in interface PBStateListener
event
- The event objectpublic void afterOpen(PBStateEvent event)
PBStateListener
PersistenceBroker
instance was
obtained from the pool.
afterOpen
in interface PBStateListener
event
- The event objectprivate ObjectCacheDefaultImpl.CacheEntry buildEntry(Object obj, Identity oid)
private void processQueue()
private Object buildKey(Identity oid)
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |