From: <tk...@hy...> - 2007-10-26 04:22:41
|
Author: tkeeney Date: 2007-10-25 21:22:37 -0700 (Thu, 25 Oct 2007) New Revision: 6486 URL: http://svn.hyperic.org/?view=rev&root=Hyperic+HQ&revision=6486 Modified: trunk/src/org/hyperic/hq/measurement/server/session/DerivedMeasurementDAO.java trunk/src/org/hyperic/hq/measurement/server/session/TemplateManagerEJBImpl.java Log: [HHQ-1012] When the session is cleared during the batch measurement update, this evicts all remaining measurement objects from hibernate persistence. Instead of returning all measurement objects at once in a list, use a scrollable result set, so the objects are updated, flushed, then cleared, then more are retrieved from the database to go through that same process. Modified: trunk/src/org/hyperic/hq/measurement/server/session/DerivedMeasurementDAO.java =================================================================== --- trunk/src/org/hyperic/hq/measurement/server/session/DerivedMeasurementDAO.java 2007-10-26 04:03:54 UTC (rev 6485) +++ trunk/src/org/hyperic/hq/measurement/server/session/DerivedMeasurementDAO.java 2007-10-26 04:22:37 UTC (rev 6486) @@ -33,6 +33,7 @@ import org.hibernate.FlushMode; import org.hibernate.Query; +import org.hibernate.ScrollableResults; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; import org.hyperic.dao.DAOFactory; @@ -142,39 +143,29 @@ } List findByTemplate(Integer id) { + return createFindByTemplateQuery(id).list(); + } + + /** + * Return a scrollable result set of all the derived measurements with the + * given template id. Remember to close the result set when finished with it. + * + * @param id The template id. + * @return A result set of derived measurements. + */ + ScrollableResults scrollByTemplate(Integer id) { + return createFindByTemplateQuery(id).scroll(); + } + + private Query createFindByTemplateQuery(Integer id) { String sql = "select distinct m from DerivedMeasurement m " + "join m.template t " + "where t.id=?"; return getSession().createQuery(sql) - .setInteger(0, id.intValue()).list(); + .setInteger(0, id.intValue()); } - - /** - * Find all the derived measurements with the give template id, potentially - * allowing for the query to return a stale collection (for efficiency reasons). - * - * @param id The template id. - * @param allowStale <code>true</code> to allow the query to return stale - * values; <code>false</code> to never allow stale values, - * potentially always forcing a sync with the database. - * @return A collection of derived measurements. - */ - List findByTemplate(Integer id, boolean allowStale) { - Session session = this.getSession(); - FlushMode oldFlushMode = session.getFlushMode(); - - try { - if (allowStale) { - session.setFlushMode(FlushMode.MANUAL); - } - - return findByTemplate(id); - } finally { - session.setFlushMode(oldFlushMode); - } - } Map findByInstance(AppdefEntityID[] aeids) { Modified: trunk/src/org/hyperic/hq/measurement/server/session/TemplateManagerEJBImpl.java =================================================================== --- trunk/src/org/hyperic/hq/measurement/server/session/TemplateManagerEJBImpl.java 2007-10-26 04:03:54 UTC (rev 6485) +++ trunk/src/org/hyperic/hq/measurement/server/session/TemplateManagerEJBImpl.java 2007-10-26 04:22:37 UTC (rev 6486) @@ -46,6 +46,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.ScrollableResults; import org.hibernate.Session; import org.hibernate.id.IdentifierGenerator; import org.hibernate.impl.SessionFactoryImpl; @@ -354,14 +355,15 @@ /** * Update the default interval for a list of meas. templates + * + * @subject - the subject * @param templIds - a list of integer template ids * @param interval - the interval of collection to set to * @ejb:interface-method */ public void updateTemplateDefaultInterval(AuthzSubject subject, Integer[] templIds, - long interval) - { + long interval) { HashSet toReschedule = new HashSet(); MeasurementTemplateDAO templDao = getMeasurementTemplateDAO(); DerivedMeasurementDAO dmDao = getDerivedMeasurementDAO(); @@ -377,23 +379,32 @@ if (!template.isDefaultOn()) template.setDefaultOn(interval != 0); - List metrics = dmDao.findByTemplate(templIds[i], true); - for (Iterator it = metrics.iterator(); it.hasNext(); ) { - DerivedMeasurement dm = (DerivedMeasurement)it.next(); + ScrollableResults metricResults = null; + + try { + metricResults = dmDao.scrollByTemplate(templIds[i]); + + while (metricResults.next()) { + DerivedMeasurement dm = (DerivedMeasurement) metricResults.get(0); + + if (dm.getInterval() != interval) + dm.setInterval(interval); - if (dm.getInterval() != interval) - dm.setInterval(interval); - - if (template.isDefaultOn() != dm.isEnabled()) - dm.setEnabled(template.isDefaultOn()); - - if (++count % 100 == 0) { - getDerivedMeasurementDAO().flushAndClearSession(); + if (template.isDefaultOn() != dm.isEnabled()) + dm.setEnabled(template.isDefaultOn()); + + if (++count % 100 == 0) { + getDerivedMeasurementDAO().flushAndClearSession(); + } + + AppdefEntityID aeid = new AppdefEntityID(dm.getAppdefType(), + dm.getInstanceId()); + toReschedule.add(aeid); + } + } finally { + if (metricResults != null) { + metricResults.close(); } - - AppdefEntityID aeid = new AppdefEntityID(dm.getAppdefType(), - dm.getInstanceId()); - toReschedule.add(aeid); } } |