Brian Lawler <[EMAIL PROTECTED]> writes:
>So at long last, here is the patch for JavaBaseFactory, for you perusal
>(again). Just to refresh the context, the problem that we ran into on
>our site is that excessive calls to Class.forName() in the
>JavaBaseFactory was bubbling up to the top of our profiler output.
>Turns out that the Base Factory was repeatedly calling Class.forName
>for the same class name. This is easily remedied by just creating a
>Map of Class instances in the JavaBaseFactory class.
Hi,
looks ok to me. I do consider applying it. Please add a patch to
xdocs/changes.xml which describes this change and the reason why.
Why are you adding the assembler == null to the for() loop? When the
assembler gets set, the following break breaks the for() loop anyway,
so this test is always true.
Regards
Henning
>Here is the patch, applied against TURBINE_2_3_BRANCH:
>Index:
>src/java/org/apache/turbine/services/assemblerbroker/util/java/
>JavaBaseFactory.java
>===================================================================
>RCS file:
>/home/cvspublic/jakarta-turbine-2/src/java/org/apache/turbine/services/
>assemblerbroker/util/java/JavaBaseFactory.java,v
>retrieving revision 1.8.2.2
>diff -u -r1.8.2.2 JavaBaseFactory.java
>---
>src/java/org/apache/turbine/services/assemblerbroker/util/java/
>JavaBaseFactory.java 20 May 2004 03:05:16 -0000 1.8.2.2
>+++
>src/java/org/apache/turbine/services/assemblerbroker/util/java/
>JavaBaseFactory.java 7 Jul 2004 18:13:17 -0000
>@@ -16,7 +16,10 @@
> * limitations under the License.
> */
>+import java.util.Collections;
>+import java.util.HashMap;
> import java.util.Iterator;
>+import java.util.Map;
> import java.util.Vector;
> import org.apache.commons.lang.StringUtils;
>@@ -35,9 +38,7 @@
> * A screen factory that attempts to load a java class from
> * the module packages defined in the TurbineResource.properties.
> *
>- * @author <a href="mailto:[EMAIL PROTECTED]">Leon Messerschmidt</a>
>- * @author <a href="mailto:[EMAIL PROTECTED]">Henning P.
>Schmiedehausen</a>
>- * @version $Id: JavaBaseFactory.java,v 1.8.2.2 2004/05/20 03:05:16
>seade Exp $
>+ * @version $Id: JavaBaseFactory.java,v 1.2 2004/07/07 17:45:05 brian
>Exp $
> */
> public abstract class JavaBaseFactory
> implements AssemblerFactory
>@@ -49,6 +50,12 @@
> /** Logging */
> protected Log log = LogFactory.getLog(this.getClass());
>+ /**
>+ * A cache for previously obtained Class instances, which we keep
>in order
>+ * to reduce the Class.forName() overhead (which can be sizable).
>+ */
>+ private Map classCache = Collections.synchronizedMap(new
>HashMap());
>+
> static
> {
> ObjectUtils.addOnce(packages, GenericLoader.getBasePackage());
>@@ -69,7 +76,7 @@
> if (StringUtils.isNotEmpty(name))
> {
>- for (Iterator it = packages.iterator(); it.hasNext();)
>+ for (Iterator it = packages.iterator(); assembler == null
>&& it.hasNext();)
> {
> StringBuffer className = new StringBuffer();
>@@ -83,7 +90,12 @@
> try
> {
>- Class servClass =
>Class.forName(className.toString());
>+ Class servClass = (Class)
>classCache.get(className);
>+ if(servClass == null)
>+ {
>+ servClass =
>Class.forName(className.toString());
>+ classCache.put(className, servClass);
>+ }
> assembler = (Assembler) servClass.newInstance();
> break; // for()
> }
>On Jun 12, 2004, at 1:37 AM, Brian Lawler wrote:
>> Henning-
>>
>> On May 9, 2004, at 4:37 PM, Henning P. Schmiedehausen wrote:
>>>
>>> You might either want to have some sort of real life cycle (which
>>> would be overkill for a point release like 2.3.1) or, if just
>>> Class.forName() is your bottleneck, simply store the Class objects and
>>> not the instance objects. This could even be a class cache, not just
>>> an instance cache, because translating
>>> "com.mycorp.modules.actions.FooAction" to a Class object describing
>>> the FooAction class is the same for all the instances.
>>>
>>
>> Great point. I have re-implemented this as a Class cache, since
>> Class.forName() is indeed our bottleneck, and I will be testing it
>> over the next few days. I will send my patched patch when satisfied
>> that it is doing the right thing...
>>
>> -B
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
--
Dipl.-Inf. (Univ.) Henning P. Schmiedehausen INTERMETA GmbH
[EMAIL PROTECTED] +49 9131 50 654 0 http://www.intermeta.de/
RedHat Certified Engineer -- Jakarta Turbine Development -- hero for hire
Linux, Java, perl, Solaris -- Consulting, Training, Development
"Fighting for one's political stand is an honourable action, but re-
fusing to acknowledge that there might be weaknesses in one's
position - in order to identify them so that they can be remedied -
is a large enough problem with the Open Source movement that it
deserves to be on this list of the top five problems."
-- Michelle Levesque, "Fundamental Issues with
Open Source Software Development"
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]