/** * */ package net.conselldemallorca.helium.core.helper; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.apache.commons.lang.StringEscapeUtils; import org.hibernate.SessionFactory; import org.hibernate.stat.QueryStatistics; import org.hibernate.stat.Statistics; import org.springframework.stereotype.Component; import net.conselldemallorca.helium.core.helperv26.MesuresTemporalsHelper; import net.conselldemallorca.helium.v3.core.api.dto.IntervalEventDto; import net.conselldemallorca.helium.v3.core.api.dto.MesuraTemporalDto; /** * Helper per a enviament de correus * * @author Limit Tecnologies <limit@limit.es> */ @Component public class HibernateHelper { @Resource private SessionFactory sessionFactory; public List<MesuraTemporalDto> getHibernateStatistics( String familia, boolean exportar) { Map<String,MesuraTemporalDto> resposta = new HashMap<String, MesuraTemporalDto>(); Map<String,MesuraTemporalDto> respostaDetallada = new HashMap<String, MesuraTemporalDto>(); String clauJbpm = exportar?"Consultas Jbpm":"Consultas totales de JBPM"; String clauHelium = exportar?"Consultas Helium":"Consultas totales de Helium"; Statistics stats = sessionFactory.getStatistics(); for (String sQuery: stats.getQueries()) { QueryStatistics qStats = stats.getQueryStatistics(sQuery); String clau = clauHelium; boolean pasar = true; if (!sQuery.contains("org.jbpm.") && "sql_helium".equals(familia)) { clau = sQuery; pasar = false; } else if (sQuery.contains("org.jbpm.") && "sql_jbpm".equals(familia)) { clau = sQuery; pasar = false; } else if ("".equals(familia)) { if (sQuery.contains("org.jbpm.")) { clau = clauJbpm; } pasar = false; } if (!pasar && (exportar || "".equals(familia) || qStats.getExecutionMaxTime() > 100)) { MesuraTemporalDto dto; MesuraTemporalDto dtoDetalle; if (resposta.containsKey(clau)) { dto = resposta.get(clau); if (dto.getMinima()>qStats.getExecutionMinTime()) { dto.setMinima(qStats.getExecutionMinTime()); } if (dto.getMaxima()<qStats.getExecutionMinTime()) { dto.setMaxima(qStats.getExecutionMaxTime()); } long mediaAnterior = (long) (dto.getMitja() * ((float) dto.getNumMesures()/(float) (dto.getNumMesures() + qStats.getExecutionCount()))); long mediaActual = (long) (qStats.getExecutionAvgTime() * ((float) qStats.getExecutionCount()/(float) (dto.getNumMesures() + qStats.getExecutionCount()))); dto.setNumMesures((int) (dto.getNumMesures() + qStats.getExecutionCount())); dto.setMitja(mediaAnterior+mediaActual); } else { dto = new MesuraTemporalDto(); dto.setClau(clau); dto.setMinima(qStats.getExecutionMinTime()); dto.setMaxima(qStats.getExecutionMaxTime()); dto.setNumMesures((int) qStats.getExecutionCount()); dto.setMitja(qStats.getExecutionAvgTime()); } LinkedList<IntervalEventDto> intervalEvents = new LinkedList<IntervalEventDto>(); dto.setEvents(intervalEvents); dtoDetalle = new MesuraTemporalDto(); dtoDetalle.setClau(sQuery); dtoDetalle.setMinima(qStats.getExecutionMinTime()); dtoDetalle.setMaxima(qStats.getExecutionMaxTime()); dtoDetalle.setNumMesures((int) qStats.getExecutionCount()); dtoDetalle.setMitja(qStats.getExecutionAvgTime()); LinkedList<IntervalEventDto> intervalEventsDetalle = new LinkedList<IntervalEventDto>(); dtoDetalle.setEvents(intervalEventsDetalle); respostaDetallada.put(StringEscapeUtils.escapeJavaScript(sQuery),dtoDetalle); if ("sql_helium".equals(familia)) { resposta.put(StringEscapeUtils.escapeJavaScript(sQuery),dto); } else if ("sql_jbpm".equals(familia)) { resposta.put(StringEscapeUtils.escapeJavaScript(sQuery),dto); } else if ("".equals(familia)) { resposta.put(clau,dto); } } } if (!"".equals(familia)) { if ("sql_helium".equals(familia) && resposta.containsKey(clauJbpm)) { resposta.remove(clauJbpm); } if ("sql_jbpm".equals(familia) && resposta.containsKey(clauHelium)) { resposta.remove(clauHelium); } resposta.putAll(respostaDetallada); } List<MesuraTemporalDto> ret = new ArrayList<MesuraTemporalDto>(); Long temps = MesuresTemporalsHelper.getTemps(); for (MesuraTemporalDto mesura: resposta.values()) { mesura.setPeriode((mesura.getNumMesures() * 60000.0) / temps); ret.add(mesura); } return ret; } public boolean isStatisticActive() { return sessionFactory.getStatistics().isStatisticsEnabled(); } }