2016-02-23 69 views
0

商店的統計數據我有一個計算時代的一些服務被稱爲AOP方面:使用Hibernate在DB與Hibernate

@Aspect 
@Component 
public class CounterAspect { 

    private Map<Integer, Integer> gettingEventStatistics = new HashMap<>(); 

    @Pointcut("execution(Event EventService+.getById(Integer))") 
    private void gettingEvent() {} 

    @AfterReturning(pointcut = "gettingEvent()", returning = "retVal") 
    public void countGettingEvent(JoinPoint joinPoint, Object retVal) { 
     Integer id = (Integer) joinPoint.getArgs()[0]; 
     if (id != null && retVal != null) { 
      Integer currentCounterValue = gettingEventStatistics.get(id); 
      gettingEventStatistics.put(id, currentCounterValue == null ? 1 : currentCounterValue + 1); 
     } 
    } 
} 

我怎麼能存儲這樣的信息?

+0

什麼阻止您自動裝配存儲庫相關的bean並在您選擇的表中手動保存數據? – isah

回答

0

我做了以下解決方案 - 建立實體統計

@Entity 
public class GettingEventsStats { 
    @Id 
    private Integer eventId; 
    private Integer gettingCounter; 
//getters, setters, etc. 

注入DAO代表在我的方面有這樣的功能:

@Repository 
public class HibernateStatsDao implements StatsDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Override 
    public GettingEventsStats getGettingEventStats(Integer eventId) { 
     return sessionFactory.getCurrentSession().get(GettingEventsStats.class, eventId); 
    } 

    @Override 
    public void createGettingEventCounter(Integer eventId) { 
     GettingEventsStats gettingEventsStats = new GettingEventsStats(); 
     gettingEventsStats.setEventId(eventId); 
     gettingEventsStats.setGettingCounter(1); 
     sessionFactory.getCurrentSession().save(gettingEventsStats); 
    } 

    @Override 
    public void updateGettingEventCounter(Integer eventId) { 
     GettingEventsStats gettingEventStats = getGettingEventStats(eventId); 
     gettingEventStats.setGettingCounter(gettingEventStats.getGettingCounter() + 1); 
     sessionFactory.getCurrentSession().update(gettingEventStats); 
    } 
} 

和變更方面的邏輯:

@Autowired 
private StatsDao statsDao; 

@Pointcut("execution(Event EventService+.getById(Integer))") 
private void gettingEvent() {} 

@AfterReturning(pointcut = "gettingEvent()", returning = "retVal") 
public void countGettingEvent(JoinPoint joinPoint, Object retVal) { 
    Integer eventId = (Integer) joinPoint.getArgs()[0]; 
    if (eventId != null && retVal != null) { 
     GettingEventsStats gettingEventStats = statsDao.getGettingEventStats(eventId); 
     if (gettingEventStats == null) { 
      statsDao.createGettingEventCounter(eventId); 
     } else { 
      statsDao.updateGettingEventCounter(eventId); 
     } 
    } 
} 
0

最簡單的方法是將其解析爲JSON並存儲爲字符串。記住然後增加列最大內存大小。

0

您將使用此方法保存大量條目。更好地使用D ropwizard Metrics,它使用水庫進行數據採樣和自定義記錄。

通常,指標通過JMX暴露給APM工具會更好。或者你應該使用Graphite或Graphana來達到這個目的。

+0

我有一個研究項目的任務使用Hibernate的持久性,但謝謝 - 我會嘗試建議的工具。 –