You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mi...@apache.org on 2009/03/23 13:42:42 UTC
svn commit: r757387 [5/5] - in /openjpa/branches/1.2.x:
openjpa-examples/src/main/java/ openjpa-examples/src/main/java/META-INF/
openjpa-examples/src/main/java/hellojpa/
openjpa-examples/src/main/java/relations/
openjpa-jdbc/src/main/resources/org/apac...
Propchange: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_mapping.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_meta.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_optimization.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_pc.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_remote.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_runtime.xml
------------------------------------------------------------------------------
svn:eol-style = native
Modified: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_slice.xml
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_slice.xml?rev=757387&r1=757386&r2=757387&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_slice.xml (original)
+++ openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_slice.xml Mon Mar 23 12:42:37 2009
@@ -1,543 +1,543 @@
-<?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>
- Distributed Persistence
- </title>
- <para>
- The standard JPA runtime environment works with a <emphasis>single</emphasis>
- database instance. OpenJPA can be extended via plug-in to work with
- multiple databases within the same transaction without any change to the
- existing application. This capability of OpenJPA for distributed
- database environment is called <emphasis>Slice</emphasis> and is explained in
- the following sections.
- </para>
-
- <section id="slice_overview">
- <title>Overview</title>
- <para>
- Enterprise applications are increasingly deployed for distributed database
- environments. The reasons for distributed, often horizontally-partitioned
- database environment can be to counter massive data growth, to
- support multiple external clients on a hosted platform or many other
- practical scenarios that can benefit from data partitioning.
- </para>
-
- <para>
- Any JPA-based user application has to address serious technical and conceptual
- challenges to directly interact with a set of physical databases
- within a single transaction.
- Slice encapsulates the complexity of distributed database environment
- via the abstraction of <emphasis>virtual</emphasis> database which internally
- manages multiple physical databases. We refer each physical database instance
- 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 existing application or the persistent domain model requires
- <emphasis>no change</emphasis> to upgrade from a single database
- to a distributed database environment.
- </para>
- </section>
-
- <section><title>Custom Distribution Policy</title>
- <para>
- User application decides how the newly persistent instances be
- distributed across the database slices. The data
- distribution policy across the slices 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.
- </para>
- <para>
- This custom data distribution policy is specified by implementing
- <classname>org.apache.openjpa.slice.DistributionPolicy</classname>
- interface by the user application.
- </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. This tracking is important as subsequent
- update to any of these instances is committed to the appropriate
- original database slice.
- </para>
-
- <note>
- <para>
- You can find the original slice of an instance <code>pc</code> by
- the static utility method
- <methodname>SlicePersistence.getSlice(pc)</methodname>.
- This method returns the slice identifier string 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>
-
- <para>
- <warning>Currently, there is no provision for migrating an
- existing instance from one slice to another.
- </warning>
- </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>Parallel Execution</title>
- <para>
- All database operations such as query, commit or flush operates
- in parallel across the database slices. The execution threading
- policy is configurable.
- </para>
- </section>
-
- <section><title>Distributed Query</title>
- <para>
- The queries are executed across all slices and the results are
- merged into a single list. The query result that includes
- <code>ORDER BY</code> clause are sorted correctly by merging
- results from each individual slice.
- </para>
- The queries that specify an aggregate projection such as
- <code>COUNT()</code>, <code>MAX()</code>, <code>MIN()</code>
- and <code>SUM()</code>
- are correctly evaluated <emphasis>only if</emphasis> they
- return a single result.
- <para>
- </para>
- <para>
- <warning>
- The aggregate operation <code>AVG()</code> is not supported.
- </warning>
- </para>
-
- </section>
-
- <section><title>Targeted Query</title>
- <para>
- You can target the query only to a subset of slices rather than
- all slices by setting a <emphasis>hint</emphasis>. The hint key
- <code>openjpa.hint.slice.Target</code> is set on any query and
- hint value is
- comma-separated list of slice identifiers. The following
- example shows how to target a query only to slice <code>"One"</code>
-
- <programlisting>
- <![CDATA[EntityManager em = ...;
- em.getTransaction().begin();
- String hint = "openjpa.hint.slice.Target";
- Query query = em.createQuery("SELECT p FROM PObject").setHint(hint, "One");
- List result = query.getResultList();
- // verify that each instance is originaing from the given slice
- for (Object pc : result) {
- String sliceOrigin = SlicePersistence.getSlice(pc);
- assertTrue ("One", sliceOrigin);
- }
- ]]>
- </programlisting>
- </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 <code>RESOURCE_LOCAL</code>
- transaction.
- </para>
- <para>
- <warning>
- If any of the configured slices is not XA-compliant <emphasis>and</emphasis>
- the persistence unit is configured for <code>RESOURCE_LOCAL</code>
- 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 closure of an object graph must be
- <emphasis>collocated</emphasis> in the same database.
- For example, consider a domain model where Person relates to Adress.
- 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 factory class aliased
- as <code>slice</code> to create 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
- <code>openjpa.slice.Names</code> property.
- For example, specify three slices named <code>"One"</code>,
- <code>"Two"</code> and <code>"Three"</code> 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
- <code>"abc"</code> of the form <code>openjpa.slice.XYZ.abc</code> will
- register a slice with logical
- name <code>"XYZ"</code>.
- </para>
- <para>
- The order of the names is significant when no <code>openjpa.slice.Master</code>
- property is not specified. Then the persistence unit is 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
- <code>One</code> and <code>Two</code>.
- <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 <code>One</code> and <code>Two</code>.
- <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, <code>Three</code> will use slice-specific
- <code>oracle.jdbc.Driver</code> driver while slice
- <code>One</code> and <code>Two</code> will use
- the driver <code>com.mysql.jdbc.Driver</code> as
- specified by <code>openjpa.ConnectionDriverName</code>
- property value.
- </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 <code>One</code>,
- all the rest goes to slice <code>Two</code>). This is why
- the application has to implement
- <code>org.apache.openjpa.slice.DistributionPolicy</code> and
- specify the implementation class in configuration
- <programlisting>
- <![CDATA[ <property name="openjpa.slice.DistributionPolicy" value="com.acme.foo.MyOptimialDistributionPolicy"/>]]>
- </programlisting>
- </para>
-
- <para>
- The interface <code>org.apache.openjpa.slice.DistributionPolicy</code>
- 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 gets persisted by cascade
- is 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>
- </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 <code>true</code>, the unreachable slices are ignored. If
- <code>false</code> then any unreachable slice will raise an exception
- during startup.
- </para>
- <para>
- By default this value is set to <code>false</code> i.e. all configured
- slices must be available.
- </para>
- </section>
-
- <section>
- <title>openjpa.slice.Master</title>
- <para>
- This plug-in property can be used to identify the name of the master slice.
- Master slice is used when a primary key is to be generated from a database sequence.
- </para>
- <para>
- 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 database 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> receives
- 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://java.sun.com/j2se/1.5.0/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
- <code>fixed</code> or <code>cached</code>.
- </para>
- <para>
- The pre-defined alias <code>cached</code> activates a
- <ulink url="http://java.sun.com/j2se/1.5.0/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 <code>cached</code> is the default
- value for this plug-in property.
- </para>
- <para>
- The <code>fixed</code> alias activates a
- <ulink url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int)">fixed thread pool</ulink>.
- The fixed thread pool can be further parameterized with
- <code>CorePoolSize</code>, <code>MaximumPoolSize</code>,
- <code>KeepAliveTime</code> and <code>RejectedExecutionHandler</code>.
- The meaning of these parameters are described in
- <ulink url="http://java.sun.com/j2se/1.5.0/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 <code>10</code>, maximum pool size is
- also <code>10</code>, keep alive time is <code>60</code> seconds and
- rejected execution is
- <ulink url="http://java.sun.com/j2se/1.5.0/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://java.sun.com/j2se/1.5.0/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://java.sun.com/j2ee/sdk_1.3/techdocs/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 <code>default</code>,
- <code>xa</code> and <code>jndi</code>.
- </para>
- <para>
- The <code>default</code> 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 <code>xa</code> 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 <code>jndi</code> 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 <code>openjpa.slice.[Logical slice name].[OpenJPA Property Name]</code>.
- For example, <code>openjpa.slice.One.ConnectionURL</code> where <code>One</code>
- is the logical slice name and <code>ConnectionURL</code> 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 <code>openjpa.*</code> property.
- </para>
- </section>
-
-</chapter>
+<?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>
+ Distributed Persistence
+ </title>
+ <para>
+ The standard JPA runtime environment works with a <emphasis>single</emphasis>
+ database instance. OpenJPA can be extended via plug-in to work with
+ multiple databases within the same transaction without any change to the
+ existing application. This capability of OpenJPA for distributed
+ database environment is called <emphasis>Slice</emphasis> and is explained in
+ the following sections.
+ </para>
+
+ <section id="slice_overview">
+ <title>Overview</title>
+ <para>
+ Enterprise applications are increasingly deployed for distributed database
+ environments. The reasons for distributed, often horizontally-partitioned
+ database environment can be to counter massive data growth, to
+ support multiple external clients on a hosted platform or many other
+ practical scenarios that can benefit from data partitioning.
+ </para>
+
+ <para>
+ Any JPA-based user application has to address serious technical and conceptual
+ challenges to directly interact with a set of physical databases
+ within a single transaction.
+ Slice encapsulates the complexity of distributed database environment
+ via the abstraction of <emphasis>virtual</emphasis> database which internally
+ manages multiple physical databases. We refer each physical database instance
+ 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 existing application or the persistent domain model requires
+ <emphasis>no change</emphasis> to upgrade from a single database
+ to a distributed database environment.
+ </para>
+ </section>
+
+ <section><title>Custom Distribution Policy</title>
+ <para>
+ User application decides how the newly persistent instances be
+ distributed across the database slices. The data
+ distribution policy across the slices 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.
+ </para>
+ <para>
+ This custom data distribution policy is specified by implementing
+ <classname>org.apache.openjpa.slice.DistributionPolicy</classname>
+ interface by the user application.
+ </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. This tracking is important as subsequent
+ update to any of these instances is committed to the appropriate
+ original database slice.
+ </para>
+
+ <note>
+ <para>
+ You can find the original slice of an instance <code>pc</code> by
+ the static utility method
+ <methodname>SlicePersistence.getSlice(pc)</methodname>.
+ This method returns the slice identifier string 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>
+
+ <para>
+ <warning>Currently, there is no provision for migrating an
+ existing instance from one slice to another.
+ </warning>
+ </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>Parallel Execution</title>
+ <para>
+ All database operations such as query, commit or flush operates
+ in parallel across the database slices. The execution threading
+ policy is configurable.
+ </para>
+ </section>
+
+ <section><title>Distributed Query</title>
+ <para>
+ The queries are executed across all slices and the results are
+ merged into a single list. The query result that includes
+ <code>ORDER BY</code> clause are sorted correctly by merging
+ results from each individual slice.
+ </para>
+ The queries that specify an aggregate projection such as
+ <code>COUNT()</code>, <code>MAX()</code>, <code>MIN()</code>
+ and <code>SUM()</code>
+ are correctly evaluated <emphasis>only if</emphasis> they
+ return a single result.
+ <para>
+ </para>
+ <para>
+ <warning>
+ The aggregate operation <code>AVG()</code> is not supported.
+ </warning>
+ </para>
+
+ </section>
+
+ <section><title>Targeted Query</title>
+ <para>
+ You can target the query only to a subset of slices rather than
+ all slices by setting a <emphasis>hint</emphasis>. The hint key
+ <code>openjpa.hint.slice.Target</code> is set on any query and
+ hint value is
+ comma-separated list of slice identifiers. The following
+ example shows how to target a query only to slice <code>"One"</code>
+
+ <programlisting>
+ <![CDATA[EntityManager em = ...;
+ em.getTransaction().begin();
+ String hint = "openjpa.hint.slice.Target";
+ Query query = em.createQuery("SELECT p FROM PObject").setHint(hint, "One");
+ List result = query.getResultList();
+ // verify that each instance is originaing from the given slice
+ for (Object pc : result) {
+ String sliceOrigin = SlicePersistence.getSlice(pc);
+ assertTrue ("One", sliceOrigin);
+ }
+ ]]>
+ </programlisting>
+ </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 <code>RESOURCE_LOCAL</code>
+ transaction.
+ </para>
+ <para>
+ <warning>
+ If any of the configured slices is not XA-compliant <emphasis>and</emphasis>
+ the persistence unit is configured for <code>RESOURCE_LOCAL</code>
+ 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 closure of an object graph must be
+ <emphasis>collocated</emphasis> in the same database.
+ For example, consider a domain model where Person relates to Adress.
+ 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 factory class aliased
+ as <code>slice</code> to create 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
+ <code>openjpa.slice.Names</code> property.
+ For example, specify three slices named <code>"One"</code>,
+ <code>"Two"</code> and <code>"Three"</code> 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
+ <code>"abc"</code> of the form <code>openjpa.slice.XYZ.abc</code> will
+ register a slice with logical
+ name <code>"XYZ"</code>.
+ </para>
+ <para>
+ The order of the names is significant when no <code>openjpa.slice.Master</code>
+ property is not specified. Then the persistence unit is 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
+ <code>One</code> and <code>Two</code>.
+ <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 <code>One</code> and <code>Two</code>.
+ <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, <code>Three</code> will use slice-specific
+ <code>oracle.jdbc.Driver</code> driver while slice
+ <code>One</code> and <code>Two</code> will use
+ the driver <code>com.mysql.jdbc.Driver</code> as
+ specified by <code>openjpa.ConnectionDriverName</code>
+ property value.
+ </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 <code>One</code>,
+ all the rest goes to slice <code>Two</code>). This is why
+ the application has to implement
+ <code>org.apache.openjpa.slice.DistributionPolicy</code> and
+ specify the implementation class in configuration
+ <programlisting>
+ <![CDATA[ <property name="openjpa.slice.DistributionPolicy" value="com.acme.foo.MyOptimialDistributionPolicy"/>]]>
+ </programlisting>
+ </para>
+
+ <para>
+ The interface <code>org.apache.openjpa.slice.DistributionPolicy</code>
+ 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 gets persisted by cascade
+ is 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>
+ </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 <code>true</code>, the unreachable slices are ignored. If
+ <code>false</code> then any unreachable slice will raise an exception
+ during startup.
+ </para>
+ <para>
+ By default this value is set to <code>false</code> i.e. all configured
+ slices must be available.
+ </para>
+ </section>
+
+ <section>
+ <title>openjpa.slice.Master</title>
+ <para>
+ This plug-in property can be used to identify the name of the master slice.
+ Master slice is used when a primary key is to be generated from a database sequence.
+ </para>
+ <para>
+ 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 database 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> receives
+ 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://java.sun.com/j2se/1.5.0/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
+ <code>fixed</code> or <code>cached</code>.
+ </para>
+ <para>
+ The pre-defined alias <code>cached</code> activates a
+ <ulink url="http://java.sun.com/j2se/1.5.0/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 <code>cached</code> is the default
+ value for this plug-in property.
+ </para>
+ <para>
+ The <code>fixed</code> alias activates a
+ <ulink url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int)">fixed thread pool</ulink>.
+ The fixed thread pool can be further parameterized with
+ <code>CorePoolSize</code>, <code>MaximumPoolSize</code>,
+ <code>KeepAliveTime</code> and <code>RejectedExecutionHandler</code>.
+ The meaning of these parameters are described in
+ <ulink url="http://java.sun.com/j2se/1.5.0/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 <code>10</code>, maximum pool size is
+ also <code>10</code>, keep alive time is <code>60</code> seconds and
+ rejected execution is
+ <ulink url="http://java.sun.com/j2se/1.5.0/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://java.sun.com/j2se/1.5.0/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://java.sun.com/j2ee/sdk_1.3/techdocs/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 <code>default</code>,
+ <code>xa</code> and <code>jndi</code>.
+ </para>
+ <para>
+ The <code>default</code> 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 <code>xa</code> 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 <code>jndi</code> 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 <code>openjpa.slice.[Logical slice name].[OpenJPA Property Name]</code>.
+ For example, <code>openjpa.slice.One.ConnectionURL</code> where <code>One</code>
+ is the logical slice name and <code>ConnectionURL</code> 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 <code>openjpa.*</code> property.
+ </para>
+ </section>
+
+</chapter>
\ No newline at end of file
Propchange: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_slice.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/samples_guide.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/supported_databases.xml
------------------------------------------------------------------------------
svn:eol-style = native
Modified: openjpa/branches/1.2.x/openjpa-slice/src/main/ant/enhancer.xml
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-slice/src/main/ant/enhancer.xml?rev=757387&r1=757386&r2=757387&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-slice/src/main/ant/enhancer.xml (original)
+++ openjpa/branches/1.2.x/openjpa-slice/src/main/ant/enhancer.xml Mon Mar 23 12:42:37 2009
@@ -1,82 +1,82 @@
-<?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.
--->
-<project name="enhance" basedir=".">
- <!--
- This build file executes the PCEnhancer on the test entities. It's in a
- separate file instead of nested in pom.xml to make some conditional
- processing easier.
-
- Test classes will not be compiled if maven is invoked with
- -Dmaven.tests.skip=true.
- -->
-
- <condition property="maven.test.skip.istrue">
- <istrue value="${maven.test.skip}" />
- </condition>
-
- <condition property="test.isfalse">
- <equals arg1="${test}" arg2="false" />
- </condition>
-
- <!-- =================================
- target: enhance
- ================================= -->
- <target name="enhance"
- description="--> run the enhancer unless test=false"
- unless="test.isfalse">
- <antcall target="enhance.all.entities"
- inheritall="true"
- inheritrefs="true" />
- </target>
-
- <!-- =================================
- target: enhance.all.entities
- ================================= -->
- <target name="enhance.all.entities"
- description="--> enhance the test entities"
- unless="maven.test.skip.istrue">
- <echo> running enhancer</echo>
- <!--
- Inherited references won't be present until the task is called.
- Therefore the path definition needs to stay inside the task.
- -->
- <path id="cp">
- <path refid="maven.test.classpath" />
- </path>
-
- <taskdef name="openjpac"
- classname="org.apache.openjpa.ant.PCEnhancerTask">
- <classpath refid="cp" />
- </taskdef>
-
- <fileset id="enhance.path.ref"
- dir="${project.build.testOutputDirectory}">
- <include name="**/Address.class" />
- <include name="**/Person.class" />
- <include name="**/PObject.class" />
- <exclude name="**/Test*.class" />
- </fileset>
- <openjpac>
- <classpath refid="cp" />
- <fileset refid="enhance.path.ref" />
- <config log="DefaultLevel=${openjpa.loglevel}" />
- </openjpac>
- </target>
+<?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.
+-->
+<project name="enhance" basedir=".">
+ <!--
+ This build file executes the PCEnhancer on the test entities. It's in a
+ separate file instead of nested in pom.xml to make some conditional
+ processing easier.
+
+ Test classes will not be compiled if maven is invoked with
+ -Dmaven.tests.skip=true.
+ -->
+
+ <condition property="maven.test.skip.istrue">
+ <istrue value="${maven.test.skip}" />
+ </condition>
+
+ <condition property="test.isfalse">
+ <equals arg1="${test}" arg2="false" />
+ </condition>
+
+ <!-- =================================
+ target: enhance
+ ================================= -->
+ <target name="enhance"
+ description="--> run the enhancer unless test=false"
+ unless="test.isfalse">
+ <antcall target="enhance.all.entities"
+ inheritall="true"
+ inheritrefs="true" />
+ </target>
+
+ <!-- =================================
+ target: enhance.all.entities
+ ================================= -->
+ <target name="enhance.all.entities"
+ description="--> enhance the test entities"
+ unless="maven.test.skip.istrue">
+ <echo> running enhancer</echo>
+ <!--
+ Inherited references won't be present until the task is called.
+ Therefore the path definition needs to stay inside the task.
+ -->
+ <path id="cp">
+ <path refid="maven.test.classpath" />
+ </path>
+
+ <taskdef name="openjpac"
+ classname="org.apache.openjpa.ant.PCEnhancerTask">
+ <classpath refid="cp" />
+ </taskdef>
+
+ <fileset id="enhance.path.ref"
+ dir="${project.build.testOutputDirectory}">
+ <include name="**/Address.class" />
+ <include name="**/Person.class" />
+ <include name="**/PObject.class" />
+ <exclude name="**/Test*.class" />
+ </fileset>
+ <openjpac>
+ <classpath refid="cp" />
+ <fileset refid="enhance.path.ref" />
+ <config log="DefaultLevel=${openjpa.loglevel}" />
+ </openjpac>
+ </target>
</project>
\ No newline at end of file
Propchange: openjpa/branches/1.2.x/openjpa-slice/src/main/ant/enhancer.xml
------------------------------------------------------------------------------
svn:eol-style = native
Modified: openjpa/branches/1.2.x/openjpa-slice/src/test/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-slice/src/test/resources/META-INF/persistence.xml?rev=757387&r1=757386&r2=757387&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-slice/src/test/resources/META-INF/persistence.xml (original)
+++ openjpa/branches/1.2.x/openjpa-slice/src/test/resources/META-INF/persistence.xml Mon Mar 23 12:42:37 2009
@@ -1,125 +1,125 @@
-<?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.
--->
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
- <persistence-unit name="enhance">
- <class>org.apache.openjpa.slice.PObject</class>
- <class>org.apache.openjpa.slice.Person</class>
- <class>org.apache.openjpa.slice.Address</class>
- <properties>
- <property name="openjpa.Log" value="DefaultLevel=WARN, Enhance=TRACE"/>
- </properties>
- </persistence-unit>
-
-
- <!-- ==================================================================== -->
- <!-- Configuration for testing basic per-slice configuration -->
- <!-- ==================================================================== -->
- <persistence-unit name="per-slice">
- <properties>
- <property name="openjpa.BrokerFactory" value="slice"/>
- <property name="openjpa.slice.Names" value="One,Two, Three"/>
- <property name="openjpa.slice.Master" value="One"/>
- <property name="openjpa.slice.Lenient" value="true"/>
-
- <property name="openjpa.slice.DistributionPolicy" value="org.apache.openjpa.slice.policy.UserDistributionPolicy"/>
- <property name="openjpa.slice.ThreadingPolicy" value="fixed"/>
-
- <property name="openjpa.Log" value="DefaultLevel=INFO, Enhance=TRACE, SQL=TRACE"/>
- <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
- <property name="openjpa.ConnectionUserName" value=""/>
- <property name="openjpa.ConnectionPassword" value=""/>
- <property name="openjpa.slice.One.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
- <property name="openjpa.slice.Two.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice2;create=true"/>
- <property name="openjpa.slice.Three.ConnectionURL" value="jdbc:some-bad-url"/>
-
- </properties>
- </persistence-unit>
-
- <persistence-unit name="XA">
- <class>org.apache.openjpa.slice.PObject</class>
- <properties>
- <property name="openjpa.BrokerFactory" value="slice"/>
- <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
-
- <property name="openjpa.slice.Names" value="One,Two"/>
- <property name="openjpa.slice.DistributionPolicy" value="org.apache.openjpa.slice.policy.UserDistributionPolicy"/>
-
- <property name="openjpa.ConnectionUserName" value=""/>
- <property name="openjpa.ConnectionPassword" value=""/>
- <property name="openjpa.slice.One.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
- <property name="openjpa.slice.One.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
- <property name="openjpa.slice.Two.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
- <property name="openjpa.slice.Two.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice2;create=true"/>
-
- <property name="openjpa.Multithreaded" value="false"/>
- <property name="openjpa.Log" value="DefaultLevel=INFO, Enhance=TRACE, SQL=TRACE"/>
- <property name="openjpa.jdbc.SynchronizeMappings" value="refresh"/>
- <property name="openjpa.jdbc.MappingDefaults" value="DefaultMissingInfo=true"/>
- <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
- </properties>
- </persistence-unit>
-
- <!-- ==================================================================== -->
- <!-- Configuration for testing basic CRUD operations -->
- <!-- ==================================================================== -->
- <persistence-unit name="slice">
- <class>org.apache.openjpa.slice.PObject</class>
- <class>org.apache.openjpa.slice.Person</class>
- <class>org.apache.openjpa.slice.Address</class>
- <properties>
- <property name="openjpa.BrokerFactory" value="slice"/>
- <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
- <property name="openjpa.slice.Names" value="One,Two"/>
- <property name="openjpa.slice.Master" value="Two"/>
- <property name="openjpa.slice.One.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
- <property name="openjpa.slice.Two.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice2;create=true"/>
- <property name="openjpa.ConnectionUserName" value=""/>
- <property name="openjpa.ConnectionPassword" value=""/>
- <property name="openjpa.slice.DistributionPolicy" value="org.apache.openjpa.slice.policy.UserDistributionPolicy"/>
- <property name="openjpa.slice.Lenient" value="false"/>
-
- <property name="openjpa.Connection2URL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
- <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
- <property name="openjpa.QueryCompilationCache" value="false"/>
- <property name="openjpa.Log" value="DefaultLevel=WARN, Enhance=TRACE, SQL=TRACE"/>
- <property name="openjpa.jdbc.MappingDefaults" value="DefaultMissingInfo=true"/>
- <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
- </properties>
- </persistence-unit>
-
- <persistence-unit name="ordering">
- <class>org.apache.openjpa.slice.PObject</class>
- <properties>
- <property name="openjpa.BrokerFactory" value="slice"/>
- <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
- <property name="openjpa.slice.Even.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
- <property name="openjpa.slice.Odd.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice2;create=true"/>
- <property name="openjpa.ConnectionUserName" value=""/>
- <property name="openjpa.ConnectionPassword" value=""/>
- <property name="openjpa.slice.DistributionPolicy" value="org.apache.openjpa.slice.policy.EvenOddDistributionPolicy"/>
- <property name="openjpa.slice.Lenient" value="false"/>
-
- <property name="openjpa.Connection2URL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
- <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
- <property name="openjpa.Log" value="DefaultLevel=WARN, Enhance=TRACE, SQL=TRACE"/>
- <property name="openjpa.jdbc.MappingDefaults" value="DefaultMissingInfo=true"/>
- </properties>
- </persistence-unit>
-</persistence>
+<?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.
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
+ <persistence-unit name="enhance">
+ <class>org.apache.openjpa.slice.PObject</class>
+ <class>org.apache.openjpa.slice.Person</class>
+ <class>org.apache.openjpa.slice.Address</class>
+ <properties>
+ <property name="openjpa.Log" value="DefaultLevel=WARN, Enhance=TRACE"/>
+ </properties>
+ </persistence-unit>
+
+
+ <!-- ==================================================================== -->
+ <!-- Configuration for testing basic per-slice configuration -->
+ <!-- ==================================================================== -->
+ <persistence-unit name="per-slice">
+ <properties>
+ <property name="openjpa.BrokerFactory" value="slice"/>
+ <property name="openjpa.slice.Names" value="One,Two, Three"/>
+ <property name="openjpa.slice.Master" value="One"/>
+ <property name="openjpa.slice.Lenient" value="true"/>
+
+ <property name="openjpa.slice.DistributionPolicy" value="org.apache.openjpa.slice.policy.UserDistributionPolicy"/>
+ <property name="openjpa.slice.ThreadingPolicy" value="fixed"/>
+
+ <property name="openjpa.Log" value="DefaultLevel=INFO, Enhance=TRACE, SQL=TRACE"/>
+ <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
+ <property name="openjpa.ConnectionUserName" value=""/>
+ <property name="openjpa.ConnectionPassword" value=""/>
+ <property name="openjpa.slice.One.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
+ <property name="openjpa.slice.Two.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice2;create=true"/>
+ <property name="openjpa.slice.Three.ConnectionURL" value="jdbc:some-bad-url"/>
+
+ </properties>
+ </persistence-unit>
+
+ <persistence-unit name="XA">
+ <class>org.apache.openjpa.slice.PObject</class>
+ <properties>
+ <property name="openjpa.BrokerFactory" value="slice"/>
+ <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
+
+ <property name="openjpa.slice.Names" value="One,Two"/>
+ <property name="openjpa.slice.DistributionPolicy" value="org.apache.openjpa.slice.policy.UserDistributionPolicy"/>
+
+ <property name="openjpa.ConnectionUserName" value=""/>
+ <property name="openjpa.ConnectionPassword" value=""/>
+ <property name="openjpa.slice.One.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
+ <property name="openjpa.slice.One.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
+ <property name="openjpa.slice.Two.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
+ <property name="openjpa.slice.Two.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice2;create=true"/>
+
+ <property name="openjpa.Multithreaded" value="false"/>
+ <property name="openjpa.Log" value="DefaultLevel=INFO, Enhance=TRACE, SQL=TRACE"/>
+ <property name="openjpa.jdbc.SynchronizeMappings" value="refresh"/>
+ <property name="openjpa.jdbc.MappingDefaults" value="DefaultMissingInfo=true"/>
+ <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
+ </properties>
+ </persistence-unit>
+
+ <!-- ==================================================================== -->
+ <!-- Configuration for testing basic CRUD operations -->
+ <!-- ==================================================================== -->
+ <persistence-unit name="slice">
+ <class>org.apache.openjpa.slice.PObject</class>
+ <class>org.apache.openjpa.slice.Person</class>
+ <class>org.apache.openjpa.slice.Address</class>
+ <properties>
+ <property name="openjpa.BrokerFactory" value="slice"/>
+ <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
+ <property name="openjpa.slice.Names" value="One,Two"/>
+ <property name="openjpa.slice.Master" value="Two"/>
+ <property name="openjpa.slice.One.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
+ <property name="openjpa.slice.Two.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice2;create=true"/>
+ <property name="openjpa.ConnectionUserName" value=""/>
+ <property name="openjpa.ConnectionPassword" value=""/>
+ <property name="openjpa.slice.DistributionPolicy" value="org.apache.openjpa.slice.policy.UserDistributionPolicy"/>
+ <property name="openjpa.slice.Lenient" value="false"/>
+
+ <property name="openjpa.Connection2URL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
+ <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
+ <property name="openjpa.QueryCompilationCache" value="false"/>
+ <property name="openjpa.Log" value="DefaultLevel=WARN, Enhance=TRACE, SQL=TRACE"/>
+ <property name="openjpa.jdbc.MappingDefaults" value="DefaultMissingInfo=true"/>
+ <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
+ </properties>
+ </persistence-unit>
+
+ <persistence-unit name="ordering">
+ <class>org.apache.openjpa.slice.PObject</class>
+ <properties>
+ <property name="openjpa.BrokerFactory" value="slice"/>
+ <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
+ <property name="openjpa.slice.Even.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
+ <property name="openjpa.slice.Odd.ConnectionURL" value="jdbc:derby:target/database/openjpa-slice2;create=true"/>
+ <property name="openjpa.ConnectionUserName" value=""/>
+ <property name="openjpa.ConnectionPassword" value=""/>
+ <property name="openjpa.slice.DistributionPolicy" value="org.apache.openjpa.slice.policy.EvenOddDistributionPolicy"/>
+ <property name="openjpa.slice.Lenient" value="false"/>
+
+ <property name="openjpa.Connection2URL" value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
+ <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
+ <property name="openjpa.Log" value="DefaultLevel=WARN, Enhance=TRACE, SQL=TRACE"/>
+ <property name="openjpa.jdbc.MappingDefaults" value="DefaultMissingInfo=true"/>
+ </properties>
+ </persistence-unit>
+</persistence>
Propchange: openjpa/branches/1.2.x/openjpa-slice/src/test/resources/META-INF/persistence.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: openjpa/branches/1.2.x/src/site/site.xml
------------------------------------------------------------------------------
svn:eol-style = native