Author: jason.greene(a)jboss.com
Date: 2008-03-15 00:20:53 -0400 (Sat, 15 Mar 2008)
New Revision: 5434
Added:
pojo/trunk/src/main/release/etc/
pojo/trunk/src/main/release/etc/replSync-service.xml
Removed:
pojo/trunk/src/main/release/etc/replSync-service.xml
Modified:
pojo/trunk/pom.xml
pojo/trunk/src/main/docbook/faq/en/master.xml
Log:
Merge release fixes
Modified: pojo/trunk/pom.xml
===================================================================
--- pojo/trunk/pom.xml 2008-03-15 04:18:42 UTC (rev 5433)
+++ pojo/trunk/pom.xml 2008-03-15 04:20:53 UTC (rev 5434)
@@ -51,6 +51,26 @@
</dependencies>
<build>
<plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>javadoc</goal>
+ </goals>
+ <configuration>
+ <aggregate>${jbosscache.reports.aggregate}</aggregate>
+ <links>
+ <
link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
+ <
link>http://java.sun.com/javaee/5/docs/api/</link>
+
<
link>http://labs.jboss.org/file-access/default/members/jbosscache/free...
+ </links>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-1</version>
Modified: pojo/trunk/src/main/docbook/faq/en/master.xml
===================================================================
--- pojo/trunk/src/main/docbook/faq/en/master.xml 2008-03-15 04:18:42 UTC (rev 5433)
+++ pojo/trunk/src/main/docbook/faq/en/master.xml 2008-03-15 04:20:53 UTC (rev 5434)
@@ -4,9 +4,9 @@
<article class="faq" lang="en">
<articleinfo>
- <title>Frequently Asked Questions about PojoCache</title>
- <releaseinfo>Release 2.0.0</releaseinfo>
- <pubdate>June 2007</pubdate>
+ <title>Frequently Asked Questions about POJO Cache</title>
+ <releaseinfo>Release 2.1.0.GA</releaseinfo>
+ <pubdate>March 2008</pubdate>
<author>
<firstname>Ben</firstname>
@@ -18,21 +18,25 @@
<surname>Marlow</surname>
<email>smarlow(a)novell.com</email>
</author>
-
+ <author>
+ <firstname>Jason</firstname>
+ <surname>Greene</surname>
+ <email>jason.greene(a)jboss.com</email>
+ </author>
</articleinfo>
- <para>These are frequently asked questions regarding Pojocache.</para>
+ <para>These are frequently asked questions regarding POJO Cache.</para>
<qandaset defaultlabel="qanda">
<title>General Information</title>
<qandaentry>
<question id="a49">
- <para>What is PojoCache?</para>
+ <para>What is POJO Cache?</para>
</question>
<answer>
- <para>PojoCache is a fine-grained field-level replicated and
+ <para>POJO Cache is a fine-grained field-level replicated and
transactional POJO (plain old Java object) cache. By POJO, we mean
that the cache: 1) automatically manages object mapping and
relationship for a client under both local and replicated cache
@@ -48,12 +52,12 @@
<para>From a user perspective, once your POJO is managed by the
cache, all cache operations are transparent. Therefore, all the
usual in-VM POJO method semantics are still preserved, providing
- ease of use. For example, if a POJO has been put in PojoCache (by
+ ease of use. For example, if a POJO has been put in POJO Cache (by
calling
<literal>attach</literal>
, for example), then any POJO get/set
method will be
- intercepted by PojoCache to provide the data from the
+ intercepted by POJO Cache to provide the data from the
cache.
</para>
</answer>
@@ -61,17 +65,14 @@
<qandaentry>
<question id="a1">
- <para>What is the relationship between Cache and
PojoCache?</para>
+ <para>What is the relationship between Core Cache and POJO
Cache?</para>
</question>
<answer>
- <para>The core JBoss Cache library
- <literal>Cache</literal>
- is a traditional generic distributed cache system.
- PojoCache uses Cache as the underlying distributed state system to achieve
POJO caching. It uses Cache as
- a
- delegate. As a result, all the replication aspects are configured with the
Cache configuration XML.
- Additionally, PojoCache also has API to expose the Cache interface (via
+ <para>Cores Cache is a traditional generic distributed cache system.
+ POJO Cache uses Core Cache as the underlying distributed state system to
achieve object caching.
+ As a result, all the replication aspects are configured with the Cache
configuration XML.
+ Additionally, POJO Cache also has API to expose the Cache interface (via
<literal>getCache()</literal>
API).
</para>
@@ -80,41 +81,39 @@
<qandaentry>
<question id="a52">
- <para>What is the difference between Cache and
- PojoCache?
+ <para>What is the difference between Core Cache and
+ POJO Cache?
</para>
</question>
<answer>
- <para>Think of PojoCache as a Cache on steroids. :-)
+ <para>Think of POJO Cache as a Cache on steroids. :-)
Seriously, both are cache stores-- one is a generic cache and the other
other one POJO Cache.
However, while Cache only
provides pure object reference storage (e.g.,
<literal>put(FQN fqn,
Object key, Object value)
</literal>
- ), PojoCache goes beyond that
+ ), POJO Cache goes beyond that
and performs fine-grained field level replication object mapping and
relationship management for a user behind the scenes. As a result,
if you have complex object systems that you would like to cache, you
- can have PojoCache manage it for you. You simply treat your
+ can have POJO Cache manage it for you. You simply treat your
object systems as they are residing in-memory, e.g., use your
regular POJO methods without worrying about cache management.
- Furthermore, this is true in replication mode as well.
</para>
</answer>
</qandaentry>
<qandaentry>
<question id="a521">
- <para>How does PojoCache work then?</para>
+ <para>How does POJO Cache work then?</para>
</question>
<answer>
- <para>PojoCache uses the so-called AOP technology (aspect oriented
programming) to do field level
- interception. Currently, it uses
- <literal>JBoss Aop</literal>
- library to do it.
+ <para>POJO Cache uses the JBoss AOP project to perform field level
+ interception. This allows POJO Cache to monitor changes to your object
model, and react
+ accordingly.
</para>
</answer>
</qandaentry>
@@ -125,7 +124,7 @@
</question>
<answer>
- <para>Starting in 2.0 release, we have a separate library for
PojoCache,
+ <para>Starting in 2.0 release, we have a separate library for POJO
Cache,
<literal>pojocache.jar</literal>
that
is extra to the core
@@ -134,7 +133,7 @@
will need to have a regular xml to configure the core Cache functionality
(e.g., replication and locking
aspect). In addition, there is also the
<literal>pojocache-aop.xml</literal>
- that specifies the PojoCache
+ that specifies the POJO Cache
interceptor stack (that can be left as default).
</para>
<para>Additionally, here are the changed features:
@@ -151,14 +150,14 @@
<para>New POJO based events that a user can subscribe
to.</para>
</listitem>
<listitem>
- <para>New configuration pojocache-aop.xml specifically for
PojoCache, in addition to
+ <para>New configuration pojocache-aop.xml specifically for
POJO Cache, in addition to
the regular cache-service.xml for the delegating Cache.
</para>
</listitem>
<listitem>
<para>New package namespace (
<literal>org.jboss.cache.pojo)</literal>
- for PojoCache.
+ for POJO Cache.
The previous
<literal>org.jboss.cache.aop</literal>
space has been deprecated.
@@ -171,58 +170,43 @@
<qandaentry>
<question id="a53">
- <para>What are the steps to use the PojoCache feature?</para>
+ <para>How do you use POJO Cache?</para>
</question>
<answer>
- <para>In order to use PojoCache, you will need to:</para>
+ <para>In order to use POJO Cache, you will need to:</para>
<itemizedlist>
<listitem>
- <para>prepare POJO. You can do either via xml declaration or
JDK50 annotation.
- This is the step to declare your POJO such that it will be
instrumented by
- <literal>JBoss Aop</literal>
- .
+ <para>Annotate your POJOt with @Replicable.
</para>
</listitem>
<listitem>
- <para>instrumentation. You will need to instrument your POJO
either at compile- or load-time.
- If you do it during compile-time, you use so-called an aop
pre-compiler (aopc) to do bytecode
- manipulation.
- If you do it via load-time, however, you need either a special
system class loader or, in JDK50,
- you can
- use the javaagent option. Either way,
- <literal>JBoss Aop</literal>
- will byte code manipulate your POJO
- class such that all field access can be intercepted.
+ <para>Instrument your POJO. This can be done at load-time using
special JVM arguments (prefered), or at compile time using the
+ AOP precompiler tool (aopc). See the user guide for more specific
details on instrumentation.
</para>
</listitem>
</itemizedlist>
- <para>So if you use JDK50, for example, with annotation and load-time
instrumentation, then you won't need
- any pre-processing step to use PojoCache. For a full example, please refer
to the distro examples
- directory.
- There are numerous PojoCache examples that uses different options.
- </para>
</answer>
</qandaentry>
<qandaentry>
<question id="a541">
- <para>What is the JDK version required to run PojoCache
2.x?</para>
+ <para>What is the JDK version required to run POJO Cache
2.x?</para>
</question>
<answer>
- <para>PojoCache 2.x requires JDK5.0 since it uses the annotation
extensively.</para>
+ <para>POJO Cache 2.x requires Java 5 or newer.</para>
</answer>
</qandaentry>
<qandaentry>
<question id="a542">
- <para>Can I run PojoCache as a standalone mode?</para>
+ <para>Can I run POJO Cache as a standalone mode?</para>
</question>
<answer>
- <para>Yes, same as the core Cache library, you can run PojoCache either
as a standalone or
+ <para>Yes, same as the Core Cache library, you can run POJO Cache
either as a standalone or
inside an application server.
</para>
</answer>
@@ -230,11 +214,11 @@
<qandaentry>
<question id="a543">
- <para>What is the JBoss AS recommended version to run PojoCache
2.x?</para>
+ <para>What is the JBoss AS recommended version to run POJO Cache
2.x?</para>
</question>
<answer>
- <para>PojoCache can be run either in AS4.0.5 (and up) and 5.0. But
either way, it will require
+ <para>POJO Cache can be run either in AS4.0.5 (and up) and 5.0. But
either way, it will require
JDK5.0 though.
</para>
</answer>
@@ -242,51 +226,29 @@
<qandaentry>
<question id="a56">
- <para>Can I pre-compile the aop classes such that I don't need to
- use the system classloader and jboss-aop configuration xml during
runtime?
+ <para>Can I pre-compile objects used in POJO Cache, so that I don't
have to provide an AOP descriptor?
</para>
</question>
<answer>
- <para>Yes. The latest versions of JBossCache have a pre-compiler
- option called
- <literal>aopc</literal>
- . You can use this option to
- pre-compile your "aspectized" POJO. Once the classes have been
byte
- code generated, they can be treated as regular class files, i.e.,
- you will not need to include any
- <literal>jboss-aop.xml</literal>
- that specifies the advisable POJO and to specify the JBossAop system
- class loader.
+ <para>Yes. The AOP library included with POJO Cache has a pre-compiler
called
+ <literal>aopc</literal> that can be used to instrument objects
in advance. However,
+ this is not the recommended approach, since your classes become tied to a
specific AOP version.
+ See the instrumentation chapter in the user guide for more information.
</para>
-
- <para>For an example of how to use
- <literal>aopc</literal>
- , please
- see 1)
- <literal>tools</literal>
- directory for PojoCacheTasks14.xml
- and PojoCacheTasks50.xml. Both contain Ant tasks that you can
- import to your regular project for
- <literal>aopc</literal>
- . In addition, please also check out the
- <literal>examples</literal>
- directory for concrete examples.
- </para>
</answer>
</qandaentry>
<qandaentry>
<question id="a561">
- <para>In PojoCache 2.x release, do I still need
+ <para>In POJO Cache 2.x release, do I still need
<literal>annoc</literal>
?
</para>
</question>
<answer>
- <para>The annoc precompiler is needed for JDK1.4 style annotation. For
2.x release, since
- we require the use of JDK5.0, there is no need to use annoc anymore.
+ <para>No. POJO Cache 2.x requires JDK 5, and recommends load-time
instrumentation. Alternatively the offline aopc tool may be used.
</para>
</answer>
</qandaentry>
@@ -306,15 +268,11 @@
<qandaentry>
<question id="a57a">
- <para>Does PojoCache provide POJO event subscription?</para>
+ <para>Does POJO Cache provide a listener/event model for catching
changes?</para>
</question>
<answer>
- <para>Yes, since 2.0, you can use PojoCacheListener to subscribe to
events
- such as POJO attach and detach and field updates. And if you need some
customization,
- you can also use the Obervable pattern directly. TO see an example, please
check
- out the test case:
-
<literal>org.jboss.cache.pojo.observer.LocalTest.java</literal>
+ <para>Yes. See the javadoc for PojoCache.addListener() and
@PojoCacheListener.
</para>
</answer>
</qandaentry>
@@ -322,33 +280,18 @@
<qandaentry>
<question id="a58">
<para>What's in the
- <literal>jboss-aop.xml</literal>
+ <literal>pojocaches-aop.xml</literal>
configuration?
</para>
</question>
<answer>
<para>
- <literal>jboss-aop.xml</literal>
- is needed for POJO
- instrumentation. In
- <literal>jboss-aop.xml</literal>
- , you can
- declare your POJO (e.g.,
- <literal>Person</literal>
- ) to be
- "prepared", a JBossAop term to denote that the object will be
- "aspectized" by the system. After this declaration, JBossAop
will
- invoke any interceptor that associates with this POJO. PojoCache
- will dynamically add an
-
<literal>org.jboss.cache.pojo.interceptor.dynamic.CacheFieldInterceptor</literal>
- to this POJO
- to perform object mapping and relationship management.
+ These descriptors are necessary for instrumentation. However, yyou
typically do not need to touch them since they include a rule
+ which matches the classes with an @Replicable annotation. Therefore, all
you need to do, is just
+ annotate your class with @Replicable. Advanced users may decide to
customize them with special AOP prepare statements that match
+ classes which do not have @Replicable.
</para>
-
- <para>Note that to add your POJO, you should declare all the fields
- to be "prepared" as in the example.
- </para>
</answer>
</qandaentry>
@@ -367,7 +310,7 @@
is essentially a
<literal>jboss-aop.xml</literal>
,
- except it is used specifically for PojoCache. The analogy is similar to
JBoss' own
+ except it is used specifically for POJO Cache. The analogy is similar to
JBoss' own
MBean service file
<literal>jboss-service.xml</literal>
, for example. So in our documentation,
@@ -378,26 +321,22 @@
<qandaentry>
<question id="a59">
- <para>Can I use annotation instead of the xml
declaration?</para>
+ <para>Can I use annotations instead of editing the AOP XML
descriptors?</para>
</question>
<answer>
- <para>Yes, in release 2.0, you can use JDK5.0 annotation to
- instrument your POJO. Check the documentation for details.
+ <para>Yes, in release 2.0, we recommend you use the @Replicable
annotation, and don't bother with editing the AOP files.
</para>
</answer>
</qandaentry>
<qandaentry>
<question id="a60">
- <para>What are the pro and con of xml vs. annotation?</para>
+ <para>Is there a problem with using a custom AOP descriptor over the
provided annotations?</para>
</question>
<answer>
- <para>It really depends on your organization environment, I'd say,
since this can be turned into a
- hot debate. Having said that, I feel strongly that POJO annotation is well
suited for PojoCache. This is
- because once you specify the annotation, you'd probably change it
rarely since there is no parameters to
- tune, for example.
+ <para>The only real benefit to a custom AOP descriptor is if you
can't easily add the annotation to the class source (it's not under your
control).
</para>
</answer>
</qandaentry>
@@ -418,13 +357,13 @@
,
when applied has the same effect as declaring a field
<literal>transient</literal>
- . PojoCache
+ . POJO Cache
won't put this field under management.
</para>
<para>The second one,
<literal>(a)org.jboss.cache.pojo.Serializable</literal>
when applied,
- will cause PojoCache to
+ will cause POJO Cache to
treat the field as a Serializable object even when it is
<literal>(a)org.jboss.cache.pojo.Replicable</literal>
.
@@ -434,14 +373,14 @@
<qandaentry>
<question id="a62">
- <para>What about compile-time vs. load-time instrumentation
then?</para>
+ <para>Why do you recommend load-time over compile-time
instrumentation?</para>
</question>
<answer>
- <para>Again it depends. But my preference is to do compile-time
instrumentation via aopc. I prefer this
- approach because it is easier to debug (at least at the development
stage). In addition, once I generate
- the
- new class, there is no more steps needed.
+ <para> The major problem with compile-time instrumentation is that it
adds a binary dependency on your class files to whatever
+ version of JBoss AOP that was used to run aopc. Once this has been
done, the class may not work with a future version of
+ JBoss AOP (although the AOP team tries to ensure binary compatibility
across minor revisions). Load-time doesn't have
+ this problem since the class is instrumented only in memory, and only
when it is loaded.
</para>
</answer>
</qandaentry>
@@ -454,8 +393,8 @@
</question>
<answer>
- <para>Yes, you can use PojoCache to do that. It supports the
- notion of object reference. PojoCache manages the unique object
+ <para>Yes, you can use POJO Cache to do that. It supports the
+ notion of multiple object references. POJO Cache manages the unique
object
through association of the dynamic cache interceptor.
</para>
</answer>
@@ -463,32 +402,27 @@
<qandaentry>
<question id="a64">
- <para>Do I need to declare all my objects "prepared" in
- <literal>jboss-aop.xml</literal>
- ?
+ <para>Do I have to instrument my objects?
</para>
</question>
<answer>
- <para>Not necessarily. If there is an object that you don't need
the
- cache to manage for you, you can leave it out of the declaration.
- The cache will treat this object as a "primitive" type. However,
the
- object will need to implement
- <literal>Serializable</literal>
- interface for replication.
+ <para> You can also attach objects that implement
+ <literal>Serializable</literal>. However, you lose field-level
replication and object identity preservation.
+ This is really only supported as a compatibility measure. It is definately
worth useing instrumentation.
</para>
</answer>
</qandaentry>
<qandaentry>
<question id="a65">
- <para>Can the cache aop intercept update via reflection?</para>
+ <para>Will POJO Cache intercept changes made from Java
Reflection?</para>
</question>
<answer>
- <para>No. The update via reflection will not be intercepted in
- JBossAop and therefore PojoCache will not be able to perform the
- necessary synchronization.
+ <para>Yes and No. Since POJO Cache intercepts field changes, any method
+ of an object that has been annotated with @Replicable will be handled
properly when called with reflection.
+ However, modifying fields using reflection is not currently supported.
</para>
</answer>
</qandaentry>
@@ -501,7 +435,7 @@
</question>
<answer>
- <para>PojoCache currently will ignore the fields with these
+ <para>POJO Cache currently will ignore the fields with these
modifiers. That is, it won't put these fields into the cache (and
thus no replication either).
</para>
@@ -536,13 +470,13 @@
<para>No. Since the Collection classes such as
<literal>ArrayList</literal>
are java util classes, aop by default
- won't instrument these classes. Instead, PojoCache will generate
+ won't instrument these classes. Instead, POJO Cache will generate
a dynamic class proxy for the Collection classes (upon the
<literal>attach</literal>
call is invoked). The proxy will
delegate the operations to a cache interceptor that implements the
actual Collection classes APIs. That is, the system classes won't be
- invoked when used in PojoCache.
+ invoked when used in POJO Cache.
</para>
<para>Internally, the cache interceptor implements the APIs by
@@ -566,32 +500,29 @@
<literal>Set</literal>
,
and
- <literal>Map</literal>
- dynamic proxy?
+ <literal>Map</literal> with POJO Cache?
</para>
</question>
<answer>
- <para>PojoCache supports classes extending from
+ <para>POJO Cache supports all classes that implement
<literal>List</literal>
,
<literal>Set</literal>
, and
<literal>Map</literal>
- without users to declare them "aspectized".
- It is done via a dynamic proxy. Here is a code snippet to use an
- <literal>ArrayList</literal>
- proxy class.
+ without instrumentation. This is done using a dynamic proxy. Here is an
example using
+ <literal>ArrayList</literal>:
</para>
<programlisting role="JAVA"><![CDATA[
ArrayList list = new ArrayList();
list.add("first");
- cache.attach("list/test", list); // Put the list under the aop cache
+ cache.attach("/list/test", list); // Put the list under the cache
list.add("second"); // Won't work since AOP intercepts the dynamic proxy
not the original POJO.
- ArrayList myList = (List)cache.find("list/test"); // we are getting a
dynamic proxy instead
+ ArrayList myList = (List)cache.find("/list/test"); // we are getting a
dynamic proxy instead
myList.add("second"); // it works now
myList.add("third");
myList.remove("third");
@@ -619,12 +550,12 @@
ArrayList list = new ArrayList();
list.add("first");
- cache.attach("list", list); // Put the list under the aop cache
+ cache.attach("/list", list); // Put the list under the aop cache
- ArrayList myList = (List)cache.find("list"); // we are getting a dynamic
proxy instead
+ ArrayList myList = (List)cache.find("/list"); // we are getting a dynamic
proxy instead
myList.add("second"); // it works now
- cache.attach("list_alias", myList); // Note you will need to use the proxy
here!!
+ cache.attach("/list_alias", myList); // Note you will need to use the proxy
here!!
myList.remove("second");
]]></programlisting>
</answer>
@@ -634,36 +565,35 @@
<question id="a71">
<para>OK, so I know I am supposed to use proxy when manipulating the
Collection classes once they are managed by the cache. But what
- happens to Pojos that share the Collection objects, e.g., a
+ happens to POJOs that share the Collection objects, e.g., a
<literal>List</literal>
- instance that is shared by 2 Pojos?
+ instance that is shared by two objects??
</para>
</question>
<answer>
- <para>Pojos that share Collection instance references will be
+ <para>POJOss that share Collection instance references will be
handled by the cache automatically. That is, when you ask the Cache
to manage it, the Cache will dynamically swap out the regular
Collection references with the dynamic proxy ones. As a result, it
- is transparent to the users.
+ is transparent to you.
</para>
</answer>
</qandaentry>
<qandaentry>
<question id="a72">
- <para>What happens when my "aspectized" POJO has field
members that
- are of Collection class ?
+ <para>What happens when my instrumented object contains collections?
</para>
</question>
<answer>
- <para>When a user puts a POJO into the cache through the call
+ <para>When an object is passed to
<literal>attach</literal>
, it will recursively map the field
- members into the cache store as well. When the field member is of a
- Collection class (e.g., List, Set, or Map), PojoCache will first
- map the collection into cache. Then, it will swap out dynamically
+ members into the cache store as well. If the field member is of a
+ Collection class (e.g., List, Set, or Map), POJO Cache will first
+ map the collection into cache. Then, it will swap out
the field reference with an corresponding proxy reference.
</para>
@@ -676,84 +606,17 @@
<qandaentry>
<question id="a73">
- <para>What are the limitation of Collection classes in
PojoCache?</para>
+ <para>What are the limitations of using Java Collections in POJO
Cache?</para>
</question>
-
<answer>
- <para>Use of Collection class in PojoCache helps you to track
fine-grained changes
- in your collection fields automatically. However, current implementation
has the follow
- limitation that we plan to address soon.
+ <para>
+ List, Set, and Map are supported; however, these APIs do not stipulate
+ of constraints like whether a null key or value is allowed. Therefore the
behavior of an attached collection may differ
+ slightly from the originals Java implementation. The behavior implemented
by POJO Cache follows
+ java.util.HashSet for any Set type, java.util.ArrayList for any List type,
and java.util.HashMap for any Map type.s
</para>
- <para>Currently, we only support a limited implementation of Collection
classes. That is,
- we support APIs in List, Set, and Map. However, since the APIs do not
stipulate
- of constraints like NULL key or value, it makes mapping of user instance
to our proxy tricky.
- For example, ArrayList would allow NULL value and some other
implementation would not.
- The Set interface maps to java.util.HashSet implementation. The List
interface maps
- to java.util.ArrayList implementation. The Map interface maps to
java.util.HashMap
- implementation.
- </para>
- <para>Another related issue is the expected performance. For example,
the current implementation is ordered,
- so
- that makes insert/delete from the Collection slow. Performance between
Set, Map and List collections also
- vary.
- Adding items to a Set is slower than a List or Map, since Set does not
allow duplicate entries.
- </para>
</answer>
</qandaentry>
-
-
- <qandaentry>
- <question id="a74">
- <para>What are the pros and cons of PojoCache?</para>
- </question>
-
- <answer>
- <para>As mentioned in the reference doc, PojoCache has the following
advantages:</para>
- <itemizedlist>
- <listitem>
- <para>Fine-grained replication and/or persistency. If you use a
distributed PojoCache
- and once your POJO is put in the cache store, there is no need to
use another API to
- trigger your changes. Furthermore, the replication are fine-grained
field level. Note this
- also applies to persistency.
- </para>
- </listitem>
- <listitem>
- <para>Fine-grained replication can have potential performance
gain if your POJO is big and
- the changes are fine-grained, e.g., only to some selected fields.
- </para>
- </listitem>
- <listitem>
- <para>POJO can posses object relationship, e.g., multiple
referenced. Distributed
- PojoCache will handle this transparently for you.
- </para>
- </listitem>
- </itemizedlist>
- <para>And here are some cases that you may not want to use
PojoCache:</para>
- <itemizedlist>
- <listitem>
- <para>You use only cache. That is you don't need replication
or persistency. Then since
- everything is operated on the in-memory POJO reference, there is no
need for PojoCache.
- </para>
- </listitem>
- <listitem>
- <para>You have simple and small POJOs. Your POJO is small in size
and also there is no
- object relationship, then PojoCache possess not clear advantage to
plain cache.
- </para>
- </listitem>
- <listitem>
- <para>Your application is bounded by memory usage. Because
PojoCache need almost twice as much
- of memory (the original POJO in-memory space and also the additional
cache store for the
- primitive fields), you may not want to use PojoCache.
- </para>
- </listitem>
- <listitem>
- <para>Your POJO lifetime is short. That is, you need to create
and destroy your POJO often.
- Then you need to do "attach" and "detach" often,
it will be slow in performance.
- </para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
</qandaset>
@@ -761,31 +624,26 @@
<title>Passiviation and eviction</title>
<qandaentry>
<question id="a80">
- <para>Can I use eviction to evict POJO from the memory?</para>
+ <para>Can I use eviction to evict a POJO from the memory?</para>
</question>
<answer>
- <para>No. In 2.0 release, we have deprecated the POJO-based eviction
policy since it has always been
- problematic in earlier release. The main reason is that when we evict a
POJO from
- the memory, the user has no ways of knowing it. So if the POJO is accessed
after the
- eviction, there won't be any PojoCache interception (e.g., it will be
just like ordinary POJO),
- but user may still expect that it will be managed by PojoCache.
+ <para>In 2.0 release, we removed the POJO-based eviction policy since
it has always been
+ problematic in earlier release. You can, however, use the standard Core
Cache eviction system to
+ evict the data that backs the POJO.
</para>
</answer>
</qandaentry>
<qandaentry>
<question id="a81">
- <para>So what do I do now?</para>
+ <para>Is passivation supported?</para>
</question>
<answer>
- <para>In order to keep your memory from overflowing, you can use the
passivation feature that comes with
- the core Cache. Passivation uses the combination of eviction and cache
loader such that when the
+ <para>Yes, in order to reduce memory consumption, you can use the
passivation feature that comes with
+ Core Cache. Passivation uses the combination of eviction and a cache
loader such that when the
items are old, it will be evicted from memory and store in a cache store
(can be DB or file). Next time,
when the item needs to be accessed again, we will retrieve it from the
cache store.
</para>
- <para>In this sense, PojoCache level is not aware of the passivation
aspect. It is configured through
- the underlying cache xml.
- </para>
</answer>
</qandaentry>
</qandaset>
@@ -794,7 +652,7 @@
<title>Troubleshooting</title>
<qandaentry>
<question id="a90">
- <para>I am having problems getting PojoCache to work, where can I get
information on troubleshooting?</para>
+ <para>I am having problems getting POJO Cache to work, where can I get
information on troubleshooting?</para>
</question>
<answer>
<para>Troubleshooting section can be found in the following
Copied: pojo/trunk/src/main/release/etc (from rev 5433,
pojo/branches/2.1/src/main/release/etc)
Deleted: pojo/trunk/src/main/release/etc/replSync-service.xml
===================================================================
--- pojo/branches/2.1/src/main/release/etc/replSync-service.xml 2008-03-15 04:18:42 UTC
(rev 5433)
+++ pojo/trunk/src/main/release/etc/replSync-service.xml 2008-03-15 04:20:53 UTC (rev
5434)
@@ -1,175 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- ===================================================================== -->
-<!-- -->
-<!-- Sample TreeCache Service Configuration -->
-<!-- -->
-<!-- ===================================================================== -->
-
-<server>
-
- <!-- ==================================================================== -->
- <!-- Defines TreeCache configuration -->
- <!-- ==================================================================== -->
-
- <mbean code="org.jboss.cache.jmx.CacheJmxWrapper"
- name="jboss.cache:service=TreeCache">
-
- <depends>jboss:service=Naming</depends>
- <depends>jboss:service=TransactionManager</depends>
-
- <!--
- Configure the TransactionManager
- -->
- <attribute
name="TransactionManagerLookupClass">org.jboss.cache.transaction.GenericTransactionManagerLookup
- </attribute>
-
- <!--
- Isolation level : SERIALIZABLE
- REPEATABLE_READ (default)
- READ_COMMITTED
- READ_UNCOMMITTED
- NONE
- -->
- <attribute name="IsolationLevel">REPEATABLE_READ</attribute>
-
- <!--
- Valid modes are LOCAL
- REPL_ASYNC
- REPL_SYNC
- INVALIDATION_ASYNC
- INVALIDATION_SYNC
- -->
- <attribute name="CacheMode">REPL_SYNC</attribute>
-
- <!--
- Just used for async repl: use a replication queue
- -->
- <attribute name="UseReplQueue">false</attribute>
-
- <!--
- Replication interval for replication queue (in ms)
- -->
- <attribute name="ReplQueueInterval">0</attribute>
-
- <!--
- Max number of elements which trigger replication
- -->
- <attribute name="ReplQueueMaxElements">0</attribute>
-
- <!-- Name of cluster. Needs to be the same for all TreeCache nodes in a
- cluster in order to find each other.
- -->
- <attribute name="ClusterName">JBossCache-Cluster</attribute>
-
- <!--Uncomment next three statements to enable JGroups multiplexer.
-This configuration is dependent on the JGroups multiplexer being
-registered in an MBean server such as JBossAS. -->
- <!--
- <depends>jgroups.mux:name=Multiplexer</depends>
- <attribute
name="MultiplexerService">jgroups.mux:name=Multiplexer</attribute>
- <attribute
name="MultiplexerStack">fc-fast-minimalthreads</attribute>
- -->
-
- <!-- JGroups protocol stack properties.
- ClusterConfig isn't used if the multiplexer is enabled and successfully
initialized.
- -->
- <attribute name="ClusterConfig">
- <config>
- <UDP mcast_addr="228.10.10.10"
- mcast_port="45588"
- tos="8"
- ucast_recv_buf_size="20000000"
- ucast_send_buf_size="640000"
- mcast_recv_buf_size="25000000"
- mcast_send_buf_size="640000"
- loopback="false"
- discard_incompatible_packets="true"
- max_bundle_size="64000"
- max_bundle_timeout="30"
- use_incoming_packet_handler="true"
- ip_ttl="2"
- enable_bundling="false"
- enable_diagnostics="true"
-
- use_concurrent_stack="true"
-
- thread_naming_pattern="pl"
-
- thread_pool.enabled="true"
- thread_pool.min_threads="1"
- thread_pool.max_threads="25"
- thread_pool.keep_alive_time="30000"
- thread_pool.queue_enabled="true"
- thread_pool.queue_max_size="10"
- thread_pool.rejection_policy="Run"
-
- oob_thread_pool.enabled="true"
- oob_thread_pool.min_threads="1"
- oob_thread_pool.max_threads="4"
- oob_thread_pool.keep_alive_time="10000"
- oob_thread_pool.queue_enabled="true"
- oob_thread_pool.queue_max_size="10"
- oob_thread_pool.rejection_policy="Run"/>
-
- <PING timeout="2000" num_initial_members="3"/>
- <MERGE2 max_interval="30000"
min_interval="10000"/>
- <FD_SOCK/>
- <FD timeout="10000" max_tries="5"
shun="true"/>
- <VERIFY_SUSPECT timeout="1500"/>
- <pbcast.NAKACK max_xmit_size="60000"
- use_mcast_xmit="false" gc_lag="0"
- retransmit_timeout="300,600,1200,2400,4800"
- discard_delivered_msgs="true"/>
- <UNICAST timeout="300,600,1200,2400,3600"/>
- <pbcast.STABLE stability_delay="1000"
desired_avg_gossip="50000"
- max_bytes="400000"/>
- <pbcast.GMS print_local_addr="true"
join_timeout="5000"
- join_retry_timeout="2000" shun="false"
- view_bundling="true"
view_ack_collection_timeout="5000"/>
- <FRAG2 frag_size="60000"/>
- <pbcast.STREAMING_STATE_TRANSFER use_reading_thread="true"/>
- <!-- <pbcast.STATE_TRANSFER/> -->
- <pbcast.FLUSH timeout="0"/>
- </config>
- </attribute>
-
-
- <!--
- Whether or not to fetch state on joining a cluster
- NOTE this used to be called FetchStateOnStartup and has been renamed to be more
descriptive.
- -->
- <attribute name="FetchInMemoryState">true</attribute>
-
- <!--
- The max amount of time (in milliseconds) we wait until the
- state (ie. the contents of the cache) are retrieved from
- existing members in a clustered environment
- -->
- <attribute name="StateRetrievalTimeout">15000</attribute>
-
- <!--
- Number of milliseconds to wait until all responses for a
- synchronous call have been received.
- -->
- <attribute name="SyncReplTimeout">15000</attribute>
-
- <!-- Max number of milliseconds to wait for a lock acquisition -->
- <attribute name="LockAcquisitionTimeout">10000</attribute>
-
- <!--
- Indicate whether to use region based marshalling or not. Set this to true if you
are running under a scoped
- class loader, e.g., inside an application server. Default is "false".
- -->
- <attribute name="UseRegionBasedMarshalling">true</attribute>
- </mbean>
-
-
- <!-- Uncomment to get a graphical view of the TreeCache MBean above -->
- <!-- <mbean code="org.jboss.cache.TreeCacheView"
name="jboss.cache:service=TreeCacheView">-->
- <!-- <depends>jboss.cache:service=TreeCache</depends>-->
- <!-- <attribute
name="CacheService">jboss.cache:service=TreeCache</attribute>-->
- <!-- </mbean>-->
-
-
-</server>
Copied: pojo/trunk/src/main/release/etc/replSync-service.xml (from rev 5433,
pojo/branches/2.1/src/main/release/etc/replSync-service.xml)
===================================================================
--- pojo/trunk/src/main/release/etc/replSync-service.xml (rev 0)
+++ pojo/trunk/src/main/release/etc/replSync-service.xml 2008-03-15 04:20:53 UTC (rev
5434)
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- ===================================================================== -->
+<!-- -->
+<!-- Sample TreeCache Service Configuration -->
+<!-- -->
+<!-- ===================================================================== -->
+
+<server>
+
+ <!-- ==================================================================== -->
+ <!-- Defines TreeCache configuration -->
+ <!-- ==================================================================== -->
+
+ <mbean code="org.jboss.cache.jmx.CacheJmxWrapper"
+ name="jboss.cache:service=TreeCache">
+
+ <depends>jboss:service=Naming</depends>
+ <depends>jboss:service=TransactionManager</depends>
+
+ <!--
+ Configure the TransactionManager
+ -->
+ <attribute
name="TransactionManagerLookupClass">org.jboss.cache.transaction.GenericTransactionManagerLookup
+ </attribute>
+
+ <!--
+ Isolation level : SERIALIZABLE
+ REPEATABLE_READ (default)
+ READ_COMMITTED
+ READ_UNCOMMITTED
+ NONE
+ -->
+ <attribute name="IsolationLevel">REPEATABLE_READ</attribute>
+
+ <!--
+ Valid modes are LOCAL
+ REPL_ASYNC
+ REPL_SYNC
+ INVALIDATION_ASYNC
+ INVALIDATION_SYNC
+ -->
+ <attribute name="CacheMode">REPL_SYNC</attribute>
+
+ <!--
+ Just used for async repl: use a replication queue
+ -->
+ <attribute name="UseReplQueue">false</attribute>
+
+ <!--
+ Replication interval for replication queue (in ms)
+ -->
+ <attribute name="ReplQueueInterval">0</attribute>
+
+ <!--
+ Max number of elements which trigger replication
+ -->
+ <attribute name="ReplQueueMaxElements">0</attribute>
+
+ <!-- Name of cluster. Needs to be the same for all TreeCache nodes in a
+ cluster in order to find each other.
+ -->
+ <attribute name="ClusterName">JBossCache-Cluster</attribute>
+
+ <!--Uncomment next three statements to enable JGroups multiplexer.
+This configuration is dependent on the JGroups multiplexer being
+registered in an MBean server such as JBossAS. -->
+ <!--
+ <depends>jgroups.mux:name=Multiplexer</depends>
+ <attribute
name="MultiplexerService">jgroups.mux:name=Multiplexer</attribute>
+ <attribute
name="MultiplexerStack">fc-fast-minimalthreads</attribute>
+ -->
+
+ <!-- JGroups protocol stack properties.
+ ClusterConfig isn't used if the multiplexer is enabled and successfully
initialized.
+ -->
+ <attribute name="ClusterConfig">
+ <config>
+ <UDP mcast_addr="228.10.10.10"
+ mcast_port="45588"
+ tos="8"
+ ucast_recv_buf_size="20000000"
+ ucast_send_buf_size="640000"
+ mcast_recv_buf_size="25000000"
+ mcast_send_buf_size="640000"
+ loopback="false"
+ discard_incompatible_packets="true"
+ max_bundle_size="64000"
+ max_bundle_timeout="30"
+ use_incoming_packet_handler="true"
+ ip_ttl="2"
+ enable_bundling="false"
+ enable_diagnostics="true"
+
+ use_concurrent_stack="true"
+
+ thread_naming_pattern="pl"
+
+ thread_pool.enabled="true"
+ thread_pool.min_threads="1"
+ thread_pool.max_threads="25"
+ thread_pool.keep_alive_time="30000"
+ thread_pool.queue_enabled="true"
+ thread_pool.queue_max_size="10"
+ thread_pool.rejection_policy="Run"
+
+ oob_thread_pool.enabled="true"
+ oob_thread_pool.min_threads="1"
+ oob_thread_pool.max_threads="4"
+ oob_thread_pool.keep_alive_time="10000"
+ oob_thread_pool.queue_enabled="true"
+ oob_thread_pool.queue_max_size="10"
+ oob_thread_pool.rejection_policy="Run"/>
+
+ <PING timeout="2000" num_initial_members="3"/>
+ <MERGE2 max_interval="30000"
min_interval="10000"/>
+ <FD_SOCK/>
+ <FD timeout="10000" max_tries="5"
shun="true"/>
+ <VERIFY_SUSPECT timeout="1500"/>
+ <pbcast.NAKACK max_xmit_size="60000"
+ use_mcast_xmit="false" gc_lag="0"
+ retransmit_timeout="300,600,1200,2400,4800"
+ discard_delivered_msgs="true"/>
+ <UNICAST timeout="300,600,1200,2400,3600"/>
+ <pbcast.STABLE stability_delay="1000"
desired_avg_gossip="50000"
+ max_bytes="400000"/>
+ <pbcast.GMS print_local_addr="true"
join_timeout="5000"
+ join_retry_timeout="2000" shun="false"
+ view_bundling="true"
view_ack_collection_timeout="5000"/>
+ <FRAG2 frag_size="60000"/>
+ <pbcast.STREAMING_STATE_TRANSFER use_reading_thread="true"/>
+ <!-- <pbcast.STATE_TRANSFER/> -->
+ <pbcast.FLUSH timeout="0"/>
+ </config>
+ </attribute>
+
+
+ <!--
+ Whether or not to fetch state on joining a cluster
+ NOTE this used to be called FetchStateOnStartup and has been renamed to be more
descriptive.
+ -->
+ <attribute name="FetchInMemoryState">true</attribute>
+
+ <!--
+ The max amount of time (in milliseconds) we wait until the
+ state (ie. the contents of the cache) are retrieved from
+ existing members in a clustered environment
+ -->
+ <attribute name="StateRetrievalTimeout">15000</attribute>
+
+ <!--
+ Number of milliseconds to wait until all responses for a
+ synchronous call have been received.
+ -->
+ <attribute name="SyncReplTimeout">15000</attribute>
+
+ <!-- Max number of milliseconds to wait for a lock acquisition -->
+ <attribute name="LockAcquisitionTimeout">10000</attribute>
+
+ <!--
+ Indicate whether to use region based marshalling or not. Set this to true if you
are running under a scoped
+ class loader, e.g., inside an application server. Default is "false".
+ -->
+ <attribute name="UseRegionBasedMarshalling">true</attribute>
+ </mbean>
+
+
+ <!-- Uncomment to get a graphical view of the TreeCache MBean above -->
+ <!-- <mbean code="org.jboss.cache.TreeCacheView"
name="jboss.cache:service=TreeCacheView">-->
+ <!-- <depends>jboss.cache:service=TreeCache</depends>-->
+ <!-- <attribute
name="CacheService">jboss.cache:service=TreeCache</attribute>-->
+ <!-- </mbean>-->
+
+
+</server>