Как зарегистрировать время, потраченное методами в Springframework?

Сначала давайте удостоверимся, что Вы используете реальные временные таблицы, они запускают с # или ##? Если Вы составите фактические таблицы на лету и затем отбросите и воссоздадите их неоднократно, у Вас действительно будут проблемы с параллельными пользователями. Если Вы - createing глобальные временные таблицы (которые запускаются с ##), у Вас могут также быть проблемы. Если Вы не хотите использование проблем параллелизма локальные временные таблицы (Они запускают с #). Это - также хорошая практика для явного закрытия их в конце proc (или когда они больше не необходимы proc, если Вы говорите длинный многоступенчатый procs) и проверять на существование (и отбрасывание раз так) перед созданием.

9
задан Rakesh Juyal 30 September 2009 в 05:08
поделиться

4 ответа

АОП - это то, что вам здесь нужно. АОП позволяет добавлять код в приложение, не изменяя исходный код. Spring AOP предпочитает делать это с помощью объектов Proxy . Объекты Прокси используют шаблон декоратора для обертывания исходного объекта Target и добавления кода. Прокси настроен для реализации одного или нескольких интерфейсов исходного объекта Target .

Здесь для определения времени приложения идея состоит в том, чтобы использовать PerformanceMonitorInterceptor , один из классов мониторинга производительности, поставляемых с Spring Framework.

Первый вариант - использовать класс Spring ProxyFactoryBean для создания объектов Spring AOP Proxy . Для этого:

  • Определите свой исходный объект bean :
  • Определите PerformanceMonitorInterceptor :
  • Определите RegexpMethodPointcutAdvisor :
  • Определите :
  • 1114264] ProxyFactoryBean для проксирования исходного компонента и применения вашего советника
  • Установите уровень журнала для PerformanceMonitorInterceptor на TRACE

Ниже приведена конфигурация Spring, которая иллюстрирует эти шаги :

<beans>
  <bean id="MyServiceTarget" class="org.myapp.services.MyService">
    <property ... />
  </bean>

  <bean id="timingLogger" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/>

  <bean id="timingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice" ref="timingLogger"/>
    <property name="patterns">
      <list>
        <value>.*</value>
      </list>
    </property>
  </bean>

  <bean id="MyService" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>org.myapp.services.MyService</value>
    </property>
    <property name="target"><ref local="MyServiceTarget"/></property>
    <property name="interceptorNames">
      <list>
        <value>timingAdvisor</value>
      </list>
    </property>
  </bean>
</beans>

И конфигурация уровня журнала для PerformanceMonitorInterceptor :

log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE

Начиная со Spring 2.0, есть еще один вариант: использование Spring 2.0 XML-конфигурации на основе схемы и Spring ' s Точечные выражения в стиле AspectJ . С помощью ProxyFactoryBean вы должны явно объявить интерфейсы, которые вы хотите использовать в качестве прокси; используя теги и , вы можете автоматически проксировать каждый интерфейс каждого объекта в контейнере bean-компонентов.

<beans "add xsd declarations here" >
  <bean id="MyService" class="org.myapp.services.MyService">
    <property ... />
  </bean>

  <bean id="timingAdvice"
class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/>

  <aop:config>
    <aop:advisor pointcut="execution(* org.myapp.services.MyService.*(..))"
      advice-ref="timingAdvice"/>
  </aop:config>
</beans>
17
ответ дан 4 December 2019 в 08:33
поделиться

Finally i figured out how to do this.

First of all see the post by 'Pascal Thivent', it did a great help to me. After changing your log4j.properties and creating the timingAdvisor what you have to is, binding this adviser to the class you wan to enable the debugging. You have to change your code like this.

earlier code:

<bean id="myTableDao" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >                  
            <property name="anotherDao" ref="anotherDao"/>
    </bean>

New code.

<bean id="myTableDaoTarget" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >                
        <property name="anotherDao" ref="anotherDao"/>
</bean>


    <bean id="myTableDao" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
        <value>com.xyz.sc.db.dao.MyTableDao</value>
    </property>
    <property name="target"><ref local="myTableDaoTarget"/></property>
    <property name="interceptorNames">
        <list>
            <value>timingAdvisor</value>
        </list>
    </property>
</bean>
2
ответ дан 4 December 2019 в 08:33
поделиться

Для этого можно использовать AspectJ , объявить точку записи журнала, вызываемую подстановочным знаком, с обработкой до и после советов before () и after ().

1
ответ дан 4 December 2019 в 08:33
поделиться

Я вижу, что здесь уже был принятый ответ, но я рекомендую всем взглянуть на последнюю версию Spring Toolsuite ( Дистрибутив SpringSource для Eclipse). Он поставляется с утилитой профилирования из коробки, Spring Insight, который предоставляет эту точную статистику во время выполнения в удобном формате. Просто разверните свое приложение на его внутреннем tomcat, нажмите несколько страниц, затем перейдите к сервлету / insight и посмотрите, сколько времени затрачено на каждый вызываемый метод, вплоть до выполняемых операторов SQL, и сколько времени они заняли.

Вот ссылка на хорошую статью о Spring Insight, которая должна дать вам то, что вы хотите, всего за несколько минут. http://www.dotkam.com/2009/10/28/spring-insight-in-action-5-minutes-from-scratch/

1
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: