Author: pcl Date: Wed Feb 28 11:20:51 2007 New Revision: 512906 URL: http://svn.apache.org/viewvc?view=rev&rev=512906 Log: OPENJPA-160
Added: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/BrokerValue.java (with props) incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FinalizingBrokerImpl.java (with props) Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_conf.xml incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_optimization.xml incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_runtime.xml Added: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/BrokerValue.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/BrokerValue.java?view=auto&rev=512906 ============================================================================== --- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/BrokerValue.java (added) +++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/BrokerValue.java Wed Feb 28 11:20:51 2007 @@ -0,0 +1,49 @@ +package org.apache.openjpa.conf; + +import org.apache.openjpa.lib.conf.PluginValue; +import org.apache.openjpa.lib.conf.Configuration; +import org.apache.openjpa.kernel.BrokerImpl; +import org.apache.openjpa.kernel.FinalizingBrokerImpl; +import org.apache.openjpa.util.InternalException; + +/** + * Custom [EMAIL PROTECTED] PluginValue} that can efficiently create [EMAIL PROTECTED] BrokerImpl} + * instances. + * + * @since 0.9.7 + */ +public class BrokerValue + extends PluginValue { + + private BrokerImpl _templateBroker; + + public BrokerValue(String prop) { + super(prop, false); + String[] aliases = new String[] { + "default", FinalizingBrokerImpl.class.getName(), + "non-finalizing", BrokerImpl.class.getName(), + }; + setAliases(aliases); + setDefault(aliases[0]); + setString(aliases[0]); + } + + public Object newInstance(String clsName, Class type, Configuration conf, + boolean fatal) { + if (BrokerImpl.class.getName().equals(clsName)) { + // This is not synchronized. If there are concurrent invocations + // while _templateBroker is null, we'll just end up with extra + // template brokers, which will get safely garbage collected. + if (_templateBroker == null) + _templateBroker = (BrokerImpl) super.newInstance( + clsName, type, conf, fatal); + try { + return _templateBroker.clone(); + } catch (CloneNotSupportedException e) { + throw new InternalException(e); + } + } else { + return super.newInstance(clsName, type, conf, fatal); + } + } +} Propchange: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/BrokerValue.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java?view=diff&rev=512906&r1=512905&r2=512906 ============================================================================== --- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java (original) +++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java Wed Feb 28 11:20:51 2007 @@ -71,7 +71,7 @@ // openjpa properties public ObjectValue classResolverPlugin; - public ObjectValue brokerPlugin; + public BrokerValue brokerPlugin; public ObjectValue dataCachePlugin; public ObjectValue dataCacheManagerPlugin; public IntValue dataCacheTimeout; @@ -178,11 +178,8 @@ brokerFactoryPlugin = new BrokerFactoryValue(); addValue(brokerFactoryPlugin); - brokerPlugin = addPlugin("BrokerImpl", false); - aliases = new String[] { "default", BrokerImpl.class.getName() }; - brokerPlugin.setAliases(aliases); - brokerPlugin.setDefault(aliases[0]); - brokerPlugin.setString(aliases[0]); + brokerPlugin = new BrokerValue("BrokerImpl"); + addValue(brokerPlugin); dataCacheManagerPlugin = addPlugin("DataCacheManager", true); aliases = Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java?view=diff&rev=512906&r1=512905&r2=512906 ============================================================================== --- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java (original) +++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java Wed Feb 28 11:20:51 2007 @@ -96,7 +96,7 @@ * @author Abe White */ public class BrokerImpl - implements Broker, FindCallbacks { + implements Broker, FindCallbacks, Cloneable { /** * Incremental flush. @@ -155,14 +155,13 @@ private ManagedRuntime _runtime = null; private LockManager _lm = null; private InverseManager _im = null; - private final JCAHelper _jca = new JCAHelper(); + private JCAHelper _jca = null; private ReentrantLock _lock = null; private OpCallbacks _call = null; private RuntimeExceptionTranslator _extrans = null; // cache class loader associated with the broker - private ClassLoader _loader = Thread.currentThread(). - getContextClassLoader(); + private ClassLoader _loader = null; // user state private Synchronization _sync = null; @@ -225,6 +224,8 @@ private LifecycleEventManager _lifeEventManager = null; private int _lifeCallbackMode = 0; + private boolean _initializeWasInvoked = false; + /** * Set the persistence manager's authentication. This is the first * method called after construction. @@ -251,6 +252,9 @@ */ public void initialize(AbstractBrokerFactory factory, DelegatingStoreManager sm, boolean managed, int connMode) { + _initializeWasInvoked = true; + _loader = Thread.currentThread().getContextClassLoader(); + _jca = new JCAHelper(); _conf = factory.getConfiguration(); _compat = _conf.getCompatibilityInstance(); _factory = factory; @@ -295,14 +299,13 @@ beginInternal(); } - /** - * Close on finalize. - */ - protected void finalize() - throws Throwable { - super.finalize(); - if (!isClosed()) - free(); + public Object clone() + throws CloneNotSupportedException { + if (_initializeWasInvoked) + throw new CloneNotSupportedException(); + else { + return super.clone(); + } } /** Added: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FinalizingBrokerImpl.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FinalizingBrokerImpl.java?view=auto&rev=512906 ============================================================================== --- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FinalizingBrokerImpl.java (added) +++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FinalizingBrokerImpl.java Wed Feb 28 11:20:51 2007 @@ -0,0 +1,23 @@ +package org.apache.openjpa.kernel; + +/** + * Subtype of [EMAIL PROTECTED] BrokerImpl} that automatically closes itself during + * finalization. This implementation guards against potential resource leaks, + * but also incurs a scalability bottleneck as instances are enlisted in the + * finalization queue and subsequently cleaned up. + * + * @since 0.9.7 + */ +public class FinalizingBrokerImpl + extends BrokerImpl { + + /** + * Close on finalize. + */ + protected void finalize() + throws Throwable { + super.finalize(); + if (!isClosed()) + free(); + } +} Propchange: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FinalizingBrokerImpl.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_conf.xml URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_conf.xml?view=diff&rev=512906&r1=512905&r2=512906 ============================================================================== --- incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_conf.xml (original) +++ incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_conf.xml Wed Feb 28 11:20:51 2007 @@ -585,7 +585,7 @@ <xref linkend="ref_guide_conf_plugins"/>) describing the <ulink url="../javadoc/org/apache/openjpa/kernel/Broker.html"><classname> org.apache.openjpa.kernel.Broker</classname></ulink> type to use at runtime. See -<xref linkend="ref_guide_runtime_pmextension"/> on for details. +<xref linkend="ref_guide_runtime_broker_extension"/> on for details. </para> </section> <section id="openjpa.ClassResolver"> Modified: incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_optimization.xml URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_optimization.xml?view=diff&rev=512906&r1=512905&r2=512906 ============================================================================== --- incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_optimization.xml (original) +++ incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_optimization.xml Wed Feb 28 11:20:51 2007 @@ -564,6 +564,25 @@ collection of results can speed up data loading by orders of magnitude. </entry> </row> + <row> + <entry colname="name"> + <emphasis role="bold"> + Disable BrokerImpl finalization + </emphasis> + <para> +<emphasis>performance, scalability</emphasis> + </para> + </entry> + <entry colname="desc"> +By default, OpenJPA's EntityManagers use finalizers to ensure that resources +get cleaned up. If you are properly managing your resources, this finalization +is not necessary, and will introduce unneeded synchronization, leading to +scalability problems. You can disable this protective behavior by setting the +<literal>openjpa.BrokerImpl</literal> property to +<literal>non-finalizing</literal>. See <link +linkend="ref_guide_runtime_broker_finalization"/> for details. + </entry> + </row> </tbody> </tgroup> </table> Modified: incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_runtime.xml URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_runtime.xml?view=diff&rev=512906&r1=512905&r2=512906 ============================================================================== --- incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_runtime.xml (original) +++ incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_runtime.xml Wed Feb 28 11:20:51 2007 @@ -103,30 +103,47 @@ <classname>BrokerFactories</classname>, <classname>EntityManager</classname>s and <classname>Broker</classname>s. </para> - <section id="ref_guide_runtime_pmextension"> + <section id="ref_guide_runtime_broker_finalization"> <title> - Broker Customization + Broker Finalization </title> - <indexterm zone="ref_guide_runtime_pmextension"> + <indexterm zone="ref_guide_runtime_broker_finalization"> <primary> - OpenJPAEntityManager + EntityManager </primary> <secondary> - extending + finalizing + </secondary> + <secondary> + clean-up </secondary> </indexterm> <para> -Some advanced users may want to add capabilities to OpenJPA's internal -<ulink url="../javadoc/org/apache/openjpa/kernel/BrokerImpl.html"><classname> -org.apache.openjpa.kernel.BrokerImpl</classname></ulink>. You can configure -OpenJPA to use a custom subclass of <classname>BrokerImpl</classname> through -the <link linkend="openjpa.BrokerImpl"><literal>openjpa.BrokerImpl</literal> -</link> configuration property. Set this property to the full class name of your -custom subclass. +The default OpenJPAEntityManager implementation automatically closes itself +during instance finalization. This guards against accidental resource leaks +that may occur if a developer fails to explicitly close EntityManagers when +finished with them, but it also incurs a scalability bottleneck, since the +JVM must perform synchronization during instance creation, and since the +finalizer thread will have more instances to monitor. To avoid this overhead, +set the <link linkend="openjpa.BrokerImpl"><literal>openjpa.BrokerImpl</literal> +</link> configuration property to <literal>non-finalizing</literal>. </para> + </section> + <section id="ref_guide_runtime_broker_extension"> + <title> + Broker Customization and Finalization + </title> + <indexterm zone="ref_guide_runtime_broker_extension"> + <primary> + OpenJPAEntityManager + </primary> + <secondary> + extending + </secondary> + </indexterm> <para> -As a <link linkend="ref_guide_conf_plugins">plugin string</link>, you can also -use this property to configure the <classname> BrokerImpl</classname> with the +As a <link linkend="ref_guide_conf_plugins">plugin string</link>, this property +can be used to configure the <classname> BrokerImpl</classname> with the following properties: </para> <itemizedlist> @@ -147,6 +164,22 @@ <property name="openjpa.BrokerImpl" value="EvictFromDataCache=true"/> </programlisting> </example> + <para> +Additionally, some advanced users may want to add capabilities to OpenJPA's +internal <ulink url="../javadoc/org/apache/openjpa/kernel/BrokerImpl.html"> +<classname>org.apache.openjpa.kernel.BrokerImpl</classname></ulink>. You can +configure OpenJPA to use a custom subclass of <classname>BrokerImpl</classname> +with the <link linkend="openjpa.BrokerImpl"><literal>openjpa.BrokerImpl +</literal></link> configuration property. Set this property to the full class +name of your custom subclass. When implementing your subclass, consider the +finalization issues mentioned in +<link linkend="ref_guide_runtime_broker_finalization"/>. It may be appropriate +to create a subtype of both +<ulink url="../javadoc/org/apache/openjpa/kernel/BrokerImpl.html"> +<classname>org.apache.openjpa.kernel.BrokerImpl</classname></ulink> and +<ulink url="../javadoc/org/apache/openjpa/kernel/FinalizingBrokerImpl.html"> +<classname>org.apache.openjpa.kernel.FinalizingBrokerImpl</classname></ulink>. + </para> </section> </section> <section id="ref_guide_runtime_jpa">