
DataNucleus is developed as a plugin-driven framework and one of the components that is pluggable is the Level 2 caching of objects (between PM/EMs for the same PMF/EMF). DataNucleus provides a large selection of Level 2 caches (builtin-map-based, Coherence, EHCache, OSCache, others) but is structured so that you can easily add your own variant and have it usable within your DataNucleus usage.
DataNucleus is able to support third party Level 2 Cache products. There are provided plugins for EHCache, SwarmCache, OSCache, and others. You can extend DataNucleuss capabilities using the plugin extension org.datanucleus.cache_level2.
| Plugin extension-point | Key | Description | Location |
|---|---|---|---|
| org.datanucleus.cache_level2 | default | Level 2 Cache (default) | datanucleus-core |
| org.datanucleus.cache_level2 | soft | Level 2 Cache using Soft maps | datanucleus-core |
| org.datanucleus.cache_level2 | ehcache | Level 2 Cache using EHCache | datanucleus-cache |
| org.datanucleus.cache_level2 | ehcacheclassbased | Level 2 Cache using EHCache (based on classes) | datanucleus-cache |
| org.datanucleus.cache_level2 | jcache | Level 2 Cache using JCache (early javax.cache) | datanucleus-cache |
| org.datanucleus.cache_level2 | javax.cache | Level 2 Cache using javax.cache | datanucleus-core |
| org.datanucleus.cache_level2 | cacheonix | Level 2 Cache using Cacheonix | datanucleus-cache |
| org.datanucleus.cache_level2 | xmemcached | Level 2 Cache using Xmemcached | datanucleus-cache |
| org.datanucleus.cache_level2 | spymemcached | Level 2 Cache using Spymemcached | datanucleus-cache |
| org.datanucleus.cache_level2 | coherence | Level 2 Cache using Oracle Coherence | datanucleus-cache |
| org.datanucleus.cache_level2 | oscache | Level 2 Cache using OSCache | datanucleus-cache |
| org.datanucleus.cache_level2 | swarmcache | Level 2 Cache using SwarmCache | datanucleus-cache |
The following sections describe how to create your own Level 2 cache plugin for DataNucleus.
If you have your own Level2 cache you can easily use it with DataNucleus. DataNucleus defines a Level2Cache interface and you need to implement this.
.
package org.datanucleus.cache;
public interface Level2Cache
{
void close();
void evict (Object oid);
void evictAll ();
void evictAll (Object[] oids);
void evictAll (Collection oids);
void evictAll (Class pcClass, boolean subclasses);
void pin (Object oid);
void pinAll (Collection oids); void pinAll (Object[] oids); void pinAll (Class pcClass, boolean subclasses);
void unpin(Object oid);
void unpinAll(Collection oids);
void unpinAll(Object[] oids);
void unpinAll(Class pcClass, boolean subclasses);
int getNumberOfPinnedObjects();
int getNumberOfUnpinnedObjects();
int getSize();
CachedPC get(Object oid);
CachedPC put(Object oid, CachedPC pc);
boolean isEmpty();
void clear();
boolean containsOid(Object oid);
}
Lets suppose your want to implement your own Level 2 cache MyLevel2Cache
package mydomain;
import org.datanucleus.OMFContext;
import org.datanucleus.cache.Level2Cache;
public class MyLevel2Cache implements Level2Cache
{
/**
* Constructor.
* @param omfCtx OMF Context
*/
public MyLevel2Cache(OMFContext omfCtx)
{
...
}
... (implement the interface)
}
Once you have this implementation you then need to make the class available as a DataNucleus plugin. You do this by putting a file plugin.xml in your JAR at the root of the CLASSPATH. The file plugin.xml will look like this
<?xml version="1.0"?>
<plugin id="mydomain" name="DataNucleus plug-ins" provider-name="My Company">
<extension point="org.datanucleus.cache_level2">
<cache name="MyCache" class-name="mydomain.MyLevel2Cache"/>
</extension>
</plugin>
Note that you also require a MANIFEST.MF file as per the Extensions Guide.