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