<?xml version="1.0" encoding="UTF-8"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at
 
 http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.   
-->
<chapter id="ref_guide_slice">
  <title>
    Slice: Distributed Persistence
  </title>
  <para>
  The standard JPA runtime environment works with a <emphasis>single</emphasis>
  database instance. <emphasis>Slice</emphasis> is a plug-in module for OpenJPA  
  to work with <emphasis>multiple</emphasis> databases within the same  
  transaction. Following sections describe the features and usage of Slice for 
  distributed database environment.
  </para>
  
  <section id="slice_overview">
    <title>Overview</title>
    <para>
    Enterprise applications are increasingly deployed in distributed database
    environment. A distributed, horizontally-partitioned 
    database environment can be an effective scaling strategy for growing data 
	volume, to support multiple clients on a multi-tenant hosting platform and 
	many other practical scenarios that can benefit from data partitioning.
    </para>
    
    <para>
    Any JPA-based user application has to address demanding technical and 
    conceptual challenges to interact with multiple physical databases
    within a single transaction. 
    OpenJPA Slice encapsulates the complexity of distributed database environment 
    via the abstraction of <emphasis>virtual</emphasis> database which internally 
    manages multiple physical database instances referred  
    as <emphasis>slice</emphasis>. 
    <emphasis>Virtualization</emphasis> of distributed databases makes OpenJPA 
	object management kernel and the user application to work in the same way as 
	in the case of a single physical database.
    </para>
  </section>
  
    <section id="features_and_limitations">
       <title>Salient Features</title>
         <section><title>Transparency</title>
            <para>
			  The primary design objective for Slice is to make the user 
			  application transparent to the change in storage strategy where 
			  data resides in multiple (possibly heterogeneous) databases instead
			  of a single database. Slice achieves this transparency by 
			  virtualization of multiple databases as a single database such 
			  that OpenJPA object management kernel continues to interact in
			  exactly the same manner with storage layer. Similarly, 
              the existing application or the persistent domain model requires 
              <emphasis>no change</emphasis> to upgrade from a single database 
              to a distributed database environment. 
            </para>
			<para>
			  An existing application developed for a single database can be 
			  adapted to work with multiple databases purely by configuring
			  a persistence unit via <classname>META-INF/persistence.xml</classname>. 
			</para>
         </section>
         
		<section><title>Scaling</title>
			<para>
			The primary performance characteristics for Slice is to scale against
			growing data volume by <emphasis>horizontal</emphasis> partitioning data 
			across many databases.  
			</para>
			<para>
			Slice executes the database operations such as query or flush <emphasis>in
			parallel</emphasis> across each physical database. Hence, scaling characteristics 
			against data volume are bound by the size of the maximum data 
			partition instead of the size of the entire data set. The use cases
			where the data is naturally amenable to horizontal partitions, 
			for example, by temporal interval (e.g. Purchase Orders per month) 
			or by geographical regions (e.g. Customer by Zip Code) can derive
			significant performance benefit and favorable scaling behavior by 
			using Slice.     
			</para>
		</section>
		
        <section><title>Distributed Query</title>
            <para>
            The queries are executed in parallel across one or more slices and the 
			individual query results are merged into a single list before being
			returned to the caller application. The <emphasis>merge</emphasis> operation is
			more complex for the queries that involve sorting and/or specify a 
			range. Slice supports both sorting and range queries. 
            </para>
			<para>
            Slice also supports aggregate queries where the aggregate operation 
			is <emphasis>commutative</emphasis> to partitioning such as 
			<classname>COUNT()</classname> or <classname>MAX()</classname> but not <classname>AVG()</classname>. 
            </para>
         
            <para>
            By default, any query is executed against all available slices. 
			However, the application can target the query only to a subset of 
			slices by setting <emphasis>hint</emphasis> on <classname>javax.persistence.Query</classname>. 
			The hint key is  <classname>openjpa.hint.slice.Target</classname> and 
            hint value is an array of slice identifiers. The following 
            example shows how to target a query only to a pair of slices 
			with logical identifier <classname>"One"</classname> and <classname>"Two"</classname>.
                          
            <programlisting>
              <![CDATA[EntityManager em = ...;
              em.getTransaction().begin();
              String hint = "openjpa.hint.slice.Target";
              Query query = em.createQuery("SELECT p FROM PObject")
				              .setHint(hint, new String[]{"One", "Two"});
              List result = query.getResultList();
              // verify that each instance is originating from the hinted slices
              for (Object pc : result) {
                 String sliceOrigin = SlicePersistence.getSlice(pc);
                 assertTrue ("One".equals(sliceOrigin) || "Two".equals(sliceOrigin));
              }
              ]]>
            </programlisting> 
            </para>
            
            <para>
            To confine queries to a subset of slices via setting query hints can be considered
            intrusive to existing application. The alternative means of targeting queries is to 
            configure a <emphasis>Query Target Policy</emphasis>. This policy is configured 
            via plug-in property <classname>openjpa.slice.QueryTargetPolicy</classname>. The
            plug-in property is fully-qualified class name of an implementation
            for <classname>org.apache.openjpa.slice.QueryTargetPolicy</classname> interface.
            This interface contract allows a user application to target a query to a subset 
            of slices based on the query and its bound parameters. The query target policy is consulted
            only when no explicit target hint is set on the query. By default, the policy 
            executes a query on all available slices.  
            </para>
            
            <para>
            A similar policy interface <classname>org.apache.openjpa.slice.FinderTargetPolicy</classname>
            is available to target queries that originate from <classname>find()</classname>
            by primary key. This finder target policy is consulted
            only when no explicit target hint is set on the current fetch plan. By default, the policy 
            executes a query on all available slices to find an instance by its primary key.    
            </para>
         </section>
		
         <section><title>Data Distribution</title>
            <para>
             The user application decides how the newly persistent instances be 
             distributed across the slices. The user application specifies the 
			 data distribution policy by implementing  
             <classname>org.apache.openjpa.slice.DistributionPolicy</classname>.
			
			 The  <classname>DistributionPolicy</classname> interface
			 is simple with a single method. The complete listing of the
			 documented interface follows:
		   <programlisting> 
		   <![CDATA[ 
			public interface DistributionPolicy {
			/**
			 * Gets the name of the slice where the given newly persistent 
			 * instance will be stored.
			 *  
			 * @param pc The newly persistent or to-be-merged object. 
			 * @param slices name of the configured slices.
			 * @param context persistence context managing the given instance.
			 * 
			 * @return identifier of the slice. This name must match one of the
			 * configured slice names. 
			 * @see DistributedConfiguration#getSliceNames()
			 */
			String distribute(Object pc, List<String> slices, Object context);
			}
		]]>
       </programlisting>
        </para>
			 
		 <para>
			 Slice runtime invokes this user-supplied method for the newly
			 persistent instance that is explicit argument of the 
			 <classname>javax.persistence.EntityManager.persist(Object pc)</classname>
			 method. The user application must return a valid slice name from
			 this method to designate the target slice for the given instance.
			 The data distribution policy may be based on the attribute 
			 of the data itself. For example, all Customer whose first name 
			 begins with character 'A' to 'M' will be stored in one slice 
			 while names beginning with 'N' to 'Z' will be stored in another 
			 slice. The noteworthy aspect of such policy implementation is 
			 the attribute values that participate in 
			 the distribution policy logic should be set before invoking 
			 <classname>EntityManager.persist()</classname> method.
		 </para>
             
		<para>
			The user application needs to specify the target slice <emphasis>only</emphasis>
			for the <emphasis>root</emphasis> instance i.e. the explicit argument for the
			<classname>EntityManager.persist(Object pc)</classname> method. Slice computes
			the transitive closure of the graph i.e. the set of all instances 
			directly or indirectly reachable from the root instance and stores
			them in the same target slice.  
		</para>
			
		 <para> 
		 Slice tracks the original database for existing instances. When
		 an application issues a query, the resultant instances can be loaded 
		 from different slices. As Slice tracks the original slice for each
		 instance, any subsequent update to an instance is committed to the 
		 appropriate original database slice. 
		</para>
            
            <note>
            <para>
            You can find the original slice of an instance <classname>pc</classname> by 
            the static utility method  
            <methodname>SlicePersistence.getSlice(pc)</methodname>.
            This method returns the slice identifier associated with the
            given <emphasis>managed</emphasis> instance. If the instance is not
            being managed then the method return null because any unmanaged or
            detached instance is not associated with any slice. 
            </para>
            </note>
         </section>
         
		<section><title>Data Replication</title>
			<para>
			While Slice ensures that the transitive closure is stored in the 
			same slice, there can be data elements that are commonly referred by
			many instances such as Country or Currency code. Such quasi-static 
			master data can be stored as identical copies in multiple slices. 
			The user application must enumerate the replicated entity type names in
			<classname>openjpa.slice.ReplicatedTypes</classname> as a comma-separated list
			and implement a <classname>org.apache.openjpa.slice.ReplicationPolicy</classname> 
			interface. The <classname>ReplicationPolicy</classname> interface 
			is quite similar to <classname>DistributionPolicy</classname> 
			interface except it returns an array of target slice names instead
			of a single slice. 
			<programlisting> 
           <![CDATA[  
			 String[] replicate(Object pc, List<String> slices, Object context);
        ]]>
       </programlisting>
		</para>
			<para>
				The default implementation assumes that replicated instances are
				stored in all available slices. If any such replicated instance
				is modified then the modification is updated to all target slices
				to maintain the critical assumption that the state of a replicated 
				instance is identical across all its target slices. 
			</para>
		</section>
		
         <section><title>Heterogeneous Database</title>
            <para> 
              Each slice can be configured independently with its own JDBC 
              driver and other connection parameters. Hence the target database 
              environment can constitute of heterogeneous databases. 
            </para>
        </section>         
         
         <section><title>Distributed Transaction</title>
            <para> 
            The database slices participate in a global transaction provided
            each slice is configured with a XA-compliant JDBC driver, even
            when the persistence unit is configured for <classname>RESOURCE_LOCAL</classname>
            transaction.
            </para>
            <para>
            <warning>
            If any of the configured slices is not XA-compliant <emphasis>and</emphasis> 
            the persistence unit is configured for <classname>RESOURCE_LOCAL</classname>
            transaction then each slice is committed without any two-phase
            commit protocol. If commit on any slice fails, then atomic nature of
            the transaction is not ensured.
            </warning>
            </para>
          </section>
        
         <section id="collocation_constraint"><title>Collocation Constraint</title>
            <para> 
            No relationship can exist across database slices. In O-R mapping parlance,
            this condition translates to the limitation that the transitive closure of an object graph must be 
            <emphasis>collocated</emphasis> in the same database.
            For example, consider a domain model where Person relates to Address.
            Person X refers to Address A while Person Y refers to Address B. 
            Collocation Constraint means that <emphasis>both</emphasis> X and A 
            must be stored in the same
            database slice. Similarly Y and B must be stored in a single slice.
            </para>
            <para>
            Slice, however, helps to maintain collocation constraint automatically.
            The instances in the closure set of any newly persistent instance 
            reachable via cascaded relationship is stored in the same slice.
            The user-defined distribution policy requires to supply the slice 
            for the root instance only.
            </para>
         </section>
    </section>
  
  <section id="slice_configuration">
    <title>Usage</title>
    <para>
     Slice is activated via the following property settings:
    </para>
    <section>
      <title>How to activate Slice Runtime?</title>
      <para>
       The basic configuration property is 
       <programlisting> 
        <![CDATA[ <property name="openjpa.BrokerFactory" value="slice"/>]]>
       </programlisting> 
       This critical configuration activates a specialized object management 
	   kernel that can work against multiple databases.  
      </para>
    </section> 
    
    <section>
      <title>How to configure each database slice?</title>
      <para>
      Each database slice is identified by a logical name unique within a
      persistent unit. The list of the slices is specified by 
      <classname>openjpa.slice.Names</classname> property.
      For example, specify three slices named <classname>"One"</classname>, 
      <classname>"Two"</classname> and <classname>"Three"</classname> as follows:
      <programlisting>
      <![CDATA[ <property name="openjpa.slice.Names" value="One, Two, Three"/>]]>
      </programlisting>
      </para>
      <para>
      This property is not mandatory. If this property is not specified then
      the configuration is scanned for logical slice names. Any property
      <classname>"abc"</classname> of the form <classname>openjpa.slice.XYZ.abc</classname> will 
      register a slice with logical
      name <classname>"XYZ"</classname>.
      </para>
      <para>
      The order of the names is significant when no <classname>openjpa.slice.Master</classname> 
      property is not specified. The persistence unit is then scanned to find
      all configured slice names and they are ordered alphabetically.  
      </para>
      
      <para>
       Each database slice properties can be configured independently. 
       For example, the
       following configuration will register two slices with logical name 
       <classname>One</classname> and <classname>Two</classname>.
       <programlisting> 
        <![CDATA[<property name="openjpa.slice.One.ConnectionURL" value="jdbc:mysql:localhost//slice1"/>
        <property name="openjpa.slice.Two.ConnectionURL" value="jdbc:mysql:localhost//slice2"/>]]>
       </programlisting> 
      </para>
      
      <para>
       Any OpenJPA specific property can be configured per slice basis. 
       For example, the following configuration will use two different JDBC 
       drivers for slice <classname>One</classname> and <classname>Two</classname>.
       <programlisting> 
        <![CDATA[<property name="openjpa.slice.One.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
        <property name="openjpa.slice.Two.ConnectionDriverName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>]]>
       </programlisting> 
      </para>
      
      <para>
        Any property if unspecified for a particular slice will be defaulted by
        corresponding OpenJPA property. For example, consider following three slices
        <programlisting> 
         <![CDATA[<property name="openjpa.slice.One.ConnectionURL"          value="jdbc:mysql:localhost//slice1"/>
         <property name="openjpa.slice.Two.ConnectionURL"          value="jdbc:mysql:localhost//slice2"/>
         <property name="openjpa.slice.Three.ConnectionURL"        value="jdbc:oracle:localhost//slice3"/>

         <property name="openjpa.ConnectionDriverName"     value="com.mysql.jdbc.Driver"/>
         <property name="openjpa.slice.Three.ConnectionDriverName" value="oracle.jdbc.Driver"/>]]>
        </programlisting> 
        In this example, <classname>Three</classname> will use slice-specific
        <classname>oracle.jdbc.Driver</classname> driver while slice
        <classname>One</classname> and <classname>Two</classname> will use
        the driver <classname>com.mysql.jdbc.Driver</classname> as 
        specified by <classname>openjpa.ConnectionDriverName</classname> 
        property value.
    </para>

        <para>
            A connection pool may also be used with Slice by using the <literal>openjpa.ConnectionProperties</literal> property.
            For example to use commons-dbcp with Derby you might use the following properties : 
            <programlisting> 
                <![CDATA[<property name="openjpa.BrokerFactory" value="slice"/>
                <property name="openjpa.ConnectionDriverName" value="org.apache.commons.dbcp.BasicDataSource"/>
                <property name="openjpa.slice.Names" value="One,Two"/>
                <property name="openjpa.slice.Master" value="Two"/>
 
                <property name="openjpa.slice.One.ConnectionProperties" value="Url=jdbc:derby:target/database/openjpa-slice1;create=true, DriverClassName=org.apache.derby.jdbc.EmbeddedDriver"/>
                <property name="openjpa.slice.Two.ConnectionProperties" value="Url=jdbc:derby:target/database/openjpa-slice2;create=true, DriverClassName=org.apache.derby.jdbc.EmbeddedDriver"/>
 
                <property name="openjpa.jdbc.DBDictionary" value="derby"/>]]>
            </programlisting>
            <note>
                <para>
                    Be aware that you need to set the DBDictionary when using commons-dbcp.
                </para>
            </note>
        </para>
    </section>
     
    <section id="distribution_policy">
       <title>Implement DistributionPolicy interface</title>
       <para>
        Slice needs to determine which slice will persist a new instance. 
        The application can only decide this policy (for example, 
        all PurchaseOrders before April 30 goes to slice <classname>One</classname>,
        all the rest goes to slice <classname>Two</classname>). This is why
        the application has to implement 
        <classname>org.apache.openjpa.slice.DistributionPolicy</classname> and
        specify the implementation class in configuration
        <programlisting> 
         <![CDATA[ <property name="openjpa.slice.DistributionPolicy" value="com.acme.foo.MyOptimialDistributionPolicy"/>]]>
        </programlisting>
       </para>
       
       <para>
        The interface <classname>org.apache.openjpa.slice.DistributionPolicy</classname>
        is simple with a single method. The complete listing of the
        documented interface follows:
       <programlisting> 
       <![CDATA[ 
public interface DistributionPolicy {
    /**
     * Gets the name of the slice where a given instance will be stored.
     *  
     * @param pc The newly persistent or to-be-merged object. 
     * @param slices name of the configured slices.
     * @param context persistence context managing the given instance.
     * 
     * @return identifier of the slice. This name must match one of the
     * configured slice names. 
     * @see DistributedConfiguration#getSliceNames()
     */
    String distribute(Object pc, List<String> slices, Object context);
}
]]>
       </programlisting>
        </para>
        
        <para>
        While implementing a distribution policy the most important thing to
        remember is <link linkend="collocation_constraint">collocation constraint</link>.
        Because Slice can not establish or query any cross-database relationship, all the
        related instances must be stored in the same database slice. 
 
        Slice can determine the closure of a root object by traversal of 
        cascaded relationships. Hence user-defined policy has to only decide the
        database for the root instance that is the explicit argument to 
        <methodname>EntityManager.persist()</methodname> call.
        Slice will ensure that all other related instances that get persisted by cascade
        are assigned to the same database slice as that of the root instance.
        However, the user-defined distribution policy must return the
        same slice identifier for the instances that are logically related but
        not cascaded for persist. 
        </para>
    </section>
    
    <section id="replication_policy">
       <title>Implement ReplicationPolicy interface</title>
		<para>
			The entities that are enumerated in <classname>openjpa.slice.ReplicatedTypes</classname>
			property can be stored in multiple slices as identical copies.
        Specify the implementation class of <classname>ReplicationPolicy</classname> in configuration as
        <programlisting> 
         <![CDATA[ <property name="openjpa.slice.ReplicationPolicy" value="com.acme.foo.MyReplicationPolicy"/>]]>
        </programlisting>
		</para>
    </section>
  </section>
	
	
  <section>
  <title>Configuration Properties</title>
    <para>
    The properties to configure Slice can be classified in two broad groups.
The <emphasis>global</emphasis> properties apply to all the slices, for example,
the thread pool used to execute the queries in parallel or the transaction 
manager used to coordinate transaction across multiple slices. 
The <emphasis>per-slice</emphasis> properties apply to individual slice, for example,
the JDBC connection URL of a slice.
   </para>
   
   <section>
     <title>Global Properties</title>
     
     <section>
        <title>openjpa.slice.DistributionPolicy</title>
        <para>
         This <emphasis>mandatory</emphasis> plug-in property determines how newly
         persistent instances are distributed across individual slices. 
         The value of this property is a fully-qualified class name that implements
         <ulink url="../javadoc/org/apache/openjpa/slice/DistributionPolicy.html">
         <classname>org.apache.openjpa.slice.DistributionPolicy</classname>
         </ulink> interface.
        </para>
     </section>
     
     <section><title>openjpa.slice.Lenient</title>
      <para>
        This boolean plug-in property controls the behavior when one or more slice 
        can not be connected or unavailable for some other reasons.
        If <classname>true</classname>, the unreachable slices are ignored. If 
        <classname>false</classname> then any unreachable slice will raise an exception
        during startup.
        </para>
        <para>
        By default this value is set to <classname>false</classname> i.e. all configured
        slices must be available.
        </para> 
     </section>

     <section>
      <title>openjpa.slice.Master</title>
		 <para>
			 The user application often directs OpenJPA to generate primary keys 
			 for persistence instances automatically or from a specific database 
			 sequence. For such primary key value generation strategy where 
			 a database instance is required, Slice uses a designated slice 
			 referred to as <emphasis>master</emphasis> slice. 
		 </para>
         <para>
			 The master slice can be specified explicitly via 
			 <classname>openjpa.slice.Master</classname> property and whose value is one
			 of the configured slice names. If this property is not explicitly
			 specified then, by default, the master slice is the first slice 
			 in the list of configured slice names. 
       </para>
       <para>
              <warning>
              Currently, there is no provision to use sequence from 
              multiple slices.
              </warning>
       </para>
     </section>
    
     <section>
        <title>openjpa.slice.Names</title>
        <para>
         This plug-in property can be used to register the logical slice names.
         The value of this property is comma-separated list of slice names. 
         The ordering of the names in this list is 
         <emphasis>significant</emphasis> because 
         <link linkend="distribution_policy">DistributionPolicy</link> and
		<link linkend="replication_policy">ReplicationPolicy</link> receive
         the input argument of the slice names in the same order.
        </para>
        <para>
        If logical slice names are not registered explicitly via this property,
        then all logical slice names available in the persistence unit are 
        registered. The ordering of the slice names in this case is alphabetical.  
        </para>
        <para>
        If logical slice names are registered explicitly via this property, then
        any logical slice that is available in the persistence unit but excluded
        from this list is ignored. 
        </para>
     </section>
    
     <section>
        <title>openjpa.slice.ThreadingPolicy</title>
        <para>
        This plug-in property determines the nature of thread pool being used 
        for database operations such as query or flush on individual slices. 
        The value of the property is a 
        fully-qualified class name that implements 
        <ulink url="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html">
        <classname>java.util.concurrent.ExecutorService</classname>
        </ulink> interface.  
        Two pre-defined pools can be chosen via their aliases namely 
        <classname>fixed</classname> or <classname>cached</classname>.
        </para>
        <para>
        The pre-defined alias <classname>cached</classname> activates a 
        <ulink url="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool()">cached thread pool</ulink>. 
        A cached thread pool creates new threads as needed, but will reuse 
        previously constructed threads when they are available. This pool 
        is suitable in scenarios that execute many short-lived asynchronous tasks.
        The way Slice uses the thread pool to execute database operations is 
        akin to such scenario and hence <classname>cached</classname> is the default 
        value for this plug-in property.  
        </para>
        <para>
        The <classname>fixed</classname> alias activates a 
        <ulink url="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int)">fixed thread pool</ulink>.
        The fixed thread pool can be further parameterized with 
        <classname>CorePoolSize</classname>, <classname>MaximumPoolSize</classname>, 
        <classname>KeepAliveTime</classname> and <classname>RejectedExecutionHandler</classname>. 
        The meaning of these parameters are described in 
        <ulink url="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html">JavaDoc</ulink>.
        The users can exercise finer control on thread pool behavior via these
        parameters.
        By default, the core pool size is <classname>10</classname>, maximum pool size is
        also <classname>10</classname>, keep alive time is <classname>60</classname> seconds and 
        rejected execution is 
        <ulink url="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.AbortPolicy.html">aborted</ulink>.
        </para>
        <para>
        Both of the pre-defined aliases can be parameterized with a fully-qualified
        class name that implements 
        <ulink url="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadFactory.html">
        <classname>java.util.concurrent.ThreadFactory</classname>
        </ulink> interface.
        </para>
     </section>
      
     <section>
      <title>openjpa.slice.TransactionPolicy</title>
      <para>
      This plug-in property determines the policy for transaction commit 
      across multiple slices. The value of this property is a fully-qualified 
      class name that implements 
      <ulink url="http://download.oracle.com/javaee/6/api/javax/transaction/TransactionManager.html">
      <classname>javax.transaction.TransactionManager</classname> 
      </ulink> interface. 
      </para>
      <para>
      Three pre-defined policies can be chosen
      by their aliases namely <classname>default</classname>,
      <classname>xa</classname> and <classname>jndi</classname>. 
      </para>
      <para>
      The <classname>default</classname> policy employs 
      a Transaction Manager that commits or rolls back transaction on individual
      slices <emphasis>without</emphasis> a two-phase commit protocol. 
      It does <emphasis>not</emphasis>
      guarantee atomic nature of transaction across all the slices because if
      one or more slice fails to commit, there is no way to rollback the transaction
      on other slices that committed successfully.
      </para>
      <para>
      The <classname>xa</classname> policy employs a Transaction Manager that that commits 
      or rolls back transaction on individual
      slices using a two-phase commit protocol. The prerequisite to use this scheme
      is, of course, that all the slices must be configured to use
      XA-compliant JDBC driver. 
      </para>
      <para>
      The <classname>jndi</classname> policy employs a Transaction Manager by looking up the
      JNDI context. The prerequisite to use this transaction
      manager is, of course, that all the slices must be configured to use
      XA-compliant JDBC driver. 
      <warning>This JNDI based policy is not available currently.</warning>
      </para>
    </section>
   </section>
   
   <section>
     <title>Per-Slice Properties</title>
     <para>
     Any OpenJPA property can be configured for each individual slice. The property name
     is of the form <classname>openjpa.slice.[Logical slice name].[OpenJPA Property Name]</classname>.
     For example, <classname>openjpa.slice.One.ConnectionURL</classname> where <classname>One</classname>
     is the logical slice name and <classname>ConnectionURL</classname> is an OpenJPA property
     name. 
     </para>
     <para>
     If a property is not configured for a specific slice, then the value for
     the property equals to the corresponding <classname>openjpa.*</classname> property.
     </para>
   </section>
      
  </section>

</chapter>
  
