You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by ta...@apache.org on 2007/12/19 21:58:04 UTC

svn commit: r605693 - in /portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE: components/prefs/src/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java etc/schema/prefs-schema.xml src/webapp/WEB-INF/assembly/prefs.xml

Author: taylor
Date: Wed Dec 19 12:58:03 2007
New Revision: 605693

URL: http://svn.apache.org/viewvc?rev=605693&view=rev
Log:
https://issues.apache.org/jira/browse/JS2-786
Addressing preferences performance with:

1. indexes: see prefs-schema.xml. With tests of 10,000 prefs, this sped up retrieval 700%
2. preload feature: see prefs.xml, ability to preload prefs into cache by Portlet App or by entities (all or none)

Modified:
    portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/components/prefs/src/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java
    portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/etc/schema/prefs-schema.xml
    portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/src/webapp/WEB-INF/assembly/prefs.xml

Modified: portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/components/prefs/src/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/components/prefs/src/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java?rev=605693&r1=605692&r2=605693&view=diff
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/components/prefs/src/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java (original)
+++ portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/components/prefs/src/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java Wed Dec 19 12:58:03 2007
@@ -17,13 +17,19 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 
 import org.apache.jetspeed.cache.CacheElement;
 import org.apache.jetspeed.cache.DistributedCacheObject;
 import org.apache.jetspeed.cache.JetspeedCache;
 import org.apache.jetspeed.components.dao.InitablePersistenceBrokerDaoSupport;
+import org.apache.jetspeed.om.common.portlet.MutablePortletApplication;
+import org.apache.jetspeed.om.common.portlet.MutablePortletEntity;
 import org.apache.jetspeed.prefs.FailedToCreateNodeException;
 import org.apache.jetspeed.prefs.NodeAlreadyExistsException;
 import org.apache.jetspeed.prefs.NodeDoesNotExistException;
@@ -162,6 +168,8 @@
     }
 
     private JetspeedCache preferenceCache;
+    private List preloadedApplications;
+    private boolean preloadEntities = false;
     
     
     /**
@@ -198,8 +206,18 @@
     {
         this(repositoryPath);
         this.preferenceCache = preferenceCache;
+        this.preloadedApplications = new LinkedList();        
     }
 
+    public PersistenceBrokerPreferencesProvider(String repositoryPath, JetspeedCache preferenceCache, List apps, boolean preloadEntities)
+    throws ClassNotFoundException
+    {
+        this(repositoryPath);
+        this.preferenceCache = preferenceCache;
+        this.preloadedApplications = apps;
+        this.preloadEntities = preloadEntities;
+    }
+    
     protected void addToCache(NodeCache content)
     {
         CacheElement cachedElement = preferenceCache.createElement(content.getCacheKey(), content);
@@ -515,4 +533,94 @@
         }
         return proxied;       
     }
+    
+    public void init() throws Exception
+    {
+        super.init();
+        Iterator apps = this.preloadedApplications.iterator();
+        while (apps.hasNext())
+        {
+            String appName = (String)apps.next();
+            preloadApplicationPreferences(appName);
+        }
+        if (preloadEntities)
+            preloadAllEntities();
+    }
+
+    public void preloadApplicationPreferences(String portletApplicationName) throws NodeDoesNotExistException
+    {
+        String portletDefPrefPath = "/" + MutablePortletApplication.PREFS_ROOT + "/" + portletApplicationName + "/";
+        long start = System.currentTimeMillis();        
+        int count = loadNodeAndAllChildren(portletDefPrefPath);
+        long elapsed = System.currentTimeMillis() - start;
+        System.out.println("++++ PREFS:PA loaded " + count + " pref nodes for app " + portletDefPrefPath + " in " + elapsed + " milliseconds.");
+    }
+    
+    protected int loadNodeAndAllChildren(String path)
+    {
+        int count = 0;
+        NodeCache root = null;
+        Criteria c = new Criteria();
+        c.addLike("fullPath", path + "%");
+        //c.addOrderBy("fullPath");
+        Query query = QueryFactory.newQuery(NodeImpl.class, c);
+        Collection result = getPersistenceBrokerTemplate().getCollectionByQuery(query);
+        // TODO: ensure that we always get the first node back first
+        if (result == null || result.isEmpty())
+        {
+            return count;           
+        }
+        Iterator ri = result.iterator();
+        if (ri.hasNext())
+        {
+            Node n = (Node)ri.next();
+            NodeImplProxy proxy = new NodeImplProxy(n);
+            root = new NodeCache(proxy);
+            addToCache(root);
+            count++;
+        }
+        else
+        {
+            return count;        
+        }
+        Map parents = new HashMap();
+        parents.put(new Long(root.getNode().getNodeId()), root);
+        while (ri.hasNext())
+        {
+            // build children and subchildren
+            Node subNode = (Node)ri.next();
+            //System.out.println("*** Preloading: " + subNode.getFullPath());
+            // add to current node
+            NodeCache nodeKey = new NodeCache(subNode.getFullPath(), subNode.getNodeType());
+            NodeCache lookup = getNode(nodeKey.getCacheKey());
+            if (lookup == null)
+            {
+                NodeImplProxy proxy = new NodeImplProxy(subNode);
+                nodeKey.setNode(proxy);
+                addToCache(nodeKey);
+                lookup = nodeKey;
+            }
+            NodeCache parent = (NodeCache)parents.get(subNode.getParentNodeId());
+            if (parent != null)
+            {
+                if (parent.getChildren() == null)
+                    parent.setChildren(new ArrayList());
+                parent.getChildren().add(lookup.getCacheKey());
+                count += parent.getChildren().size();
+            }
+            parents.put(new Long(subNode.getNodeId()), lookup);
+            count++;
+        }         
+        return count;
+    }
+    
+    public void preloadAllEntities() throws NodeDoesNotExistException
+    {
+        String entitiesRoot = "/" + MutablePortletEntity.PORTLET_ENTITY_ROOT + "/";
+        long start = System.currentTimeMillis();        
+        int count = loadNodeAndAllChildren(entitiesRoot);
+        long elapsed = System.currentTimeMillis() - start;
+        System.out.println("++++ PREFS:ENTITIES loaded " + count + " total entity pref nodes in " + elapsed + " milliseconds.");
+    }
+   
 }

Modified: portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/etc/schema/prefs-schema.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/etc/schema/prefs-schema.xml?rev=605693&r1=605692&r2=605693&view=diff
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/etc/schema/prefs-schema.xml (original)
+++ portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/etc/schema/prefs-schema.xml Wed Dec 19 12:58:03 2007
@@ -18,26 +18,6 @@
 <!-- Autogenerated by JDBCToXMLSchema! -->
 <database name="j2">
 
-    <!--
-       prefs_property_value
-    -->
-    <table name="PREFS_PROPERTY_VALUE">
-        <column name="PROPERTY_VALUE_ID" primaryKey="true" required="true" type="INTEGER"/>
-        <column name="NODE_ID" type="INTEGER"/>
-        <column name="PROPERTY_NAME" size="100" type="VARCHAR"/>
-        <column name="PROPERTY_VALUE" size="254" type="VARCHAR"/>
-        <column name="CREATION_DATE" type="TIMESTAMP"/>
-        <column name="MODIFIED_DATE" type="TIMESTAMP"/>
-        <!-- Still an issue with OJB 1.0.3 when deleting M-N. Foreign Key Violation.
-        <foreign-key foreignTable="PREFS_NODE">
-            <reference foreign="NODE_ID" local="NODE_ID"/>
-        </foreign-key>
-        -->
-    </table>
-    
-    <!--
-       pref_node
-    -->
     <table name="PREFS_NODE">
         <column name="NODE_ID" primaryKey="true" required="true" type="INTEGER"/>
         <column name="PARENT_NODE_ID" type="INTEGER"/>
@@ -46,9 +26,37 @@
         <column name="FULL_PATH" size="254" type="VARCHAR"/>
         <column name="CREATION_DATE" type="TIMESTAMP"/>
         <column name="MODIFIED_DATE" type="TIMESTAMP"/>
-        <foreign-key foreignTable="PREFS_NODE" name="FK_PREFS_NODE_1">
+        <foreign-key foreignTable="PREFS_NODE" name="FK_PREFS_NODE_1" onDelete="cascade">
             <reference foreign="NODE_ID" local="PARENT_NODE_ID"/>
-        </foreign-key>
+        </foreign-key>        
+        <index name="IX_PREFS_NODE_1">
+            <index-column name="PARENT_NODE_ID"/>
+        </index>        
+        <index name="IX_PREFS_NODE_2">
+            <index-column name="FULL_PATH"/>
+        </index>        
     </table>
+    <!--
+       prefs_property_value
+    -->
+    <table name="PREFS_PROPERTY_VALUE">
+        <column name="PROPERTY_VALUE_ID" primaryKey="true" required="true" type="INTEGER"/>
+        <column name="NODE_ID" type="INTEGER"/>
+        <column name="PROPERTY_NAME" size="100" type="VARCHAR"/>
+        <column name="PROPERTY_VALUE" size="254" type="VARCHAR"/>
+        <column name="CREATION_DATE" type="TIMESTAMP"/>
+        <column name="MODIFIED_DATE" type="TIMESTAMP"/>
+        <!-- Still an issue with OJB 1.0.3 when deleting M-N. Foreign Key Violation. 
+             2007/12/13 - DST - I've been testing with this index enabled on Oracle, MySQL
+              and experiencing no issues. I think the index on should be the default case,
+              and inferior databases will have to turn it off as part of the integration process
+         -->
+        <foreign-key foreignTable="PREFS_NODE" onDelete="cascade">
+            <reference foreign="NODE_ID" local="NODE_ID" />
+        </foreign-key>        
+        <index name="IX_FKPPV_1">
+            <index-column name="NODE_ID"/>
+        </index>        
+    </table>            
         
 </database>

Modified: portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/src/webapp/WEB-INF/assembly/prefs.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/src/webapp/WEB-INF/assembly/prefs.xml?rev=605693&r1=605692&r2=605693&view=diff
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/src/webapp/WEB-INF/assembly/prefs.xml (original)
+++ portals/jetspeed-2/branches/JETSPEED-RELEASE-2.1-POSTRELEASE/src/webapp/WEB-INF/assembly/prefs.xml Wed Dec 19 12:58:03 2007
@@ -25,6 +25,15 @@
         <constructor-arg index="1">
             <ref bean="preferencesCache" />
         </constructor-arg>
+        <!-- list of portlet applications default preferences to preload, leave list empty to not preload -->
+        <constructor-arg index='2'>
+	    <list>
+    		<value>j2-admin</value>
+        	<value>demo</value>
+        </list>
+        </constructor-arg>
+        <!--  preload ALL Entities: warning this can chew up lots of memory -->
+        <constructor-arg index='3'><value type="boolean">false</value></constructor-arg>        
     </bean>
 
     <bean id="org.apache.jetspeed.prefs.PreferencesProvider" parent="baseTransactionProxy" name="prefsProvider">



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org