- 浏览: 3470538 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
perf4j是一款类似于log4j的性能检测工具.
它的基本操作就是封装我们常用的通过System.currentTimeMillis();来计算执行时间.如下:
- long start = System.currentTimeMillis();
- // execute the block of code to be timed
- System.out.println("ms for block n was: " + (System.currentTimeMillis() - start));
long start = System.currentTimeMillis(); // execute the block of code to be timed System.out.println("ms for block n was: " + (System.currentTimeMillis() - start));
它的最大优势是可以根据这些数据对要检测的代码块的执行进行数字以及图形化统计.
下面是通过AOP方式为jpetstore添加的perf4j步骤.
1.在pom文件中增加如下依赖
- < dependency >
- < groupId > org.perf4j </ groupId >
- < artifactId > perf4j </ artifactId >
- < version > 0.9.12-SNAPSHOT </ version >
- </ dependency >
- < dependency >
- < groupId > commons-jexl </ groupId >
- < artifactId > commons-jexl </ artifactId >
- < version > 1.1 </ version >
- < type > jar </ type >
- </ dependency >
- < dependency >
- < groupId > log4j </ groupId >
- < artifactId > log4j </ artifactId >
- < version > 1.2.14 </ version >
- < type > jar </ type >
- </ dependency >
<dependency> <groupId>org.perf4j</groupId> <artifactId>perf4j</artifactId> <version>0.9.12-SNAPSHOT</version> </dependency> <dependency> <groupId>commons-jexl</groupId> <artifactId>commons-jexl</artifactId> <version>1.1</version> <type>jar</type> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> <type>jar</type> </dependency>
2.增加编译插件如下:
- < build >
- < finalName > jpetstore </ finalName >
- < defaultGoal > package </ defaultGoal >
- < plugins >
- < plugin >
- < groupId > org.apache.maven.plugins </ groupId >
- < artifactId > maven-compiler-plugin </ artifactId >
- < version > 2.0.2 </ version >
- < configuration >
- < source > 1.5 </ source >
- < target > 1.5 </ target >
- < encoding > UTF-8 </ encoding >
- </ configuration >
- </ plugin >
- </ plugins >
- </ build >
<build> <finalName>jpetstore</finalName> <defaultGoal>package</defaultGoal> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.5</source> <target>1.5</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
3.为需要进行检测的方法增加注解@Profiled
譬如PetStoreImpl类中
- @Profiled
- public Category getCategory(String categoryId) {
- return this .categoryDao.getCategory(categoryId);
- }
@Profiled public Category getCategory(String categoryId) { return this.categoryDao.getCategory(categoryId); }
4.在spring配置文件中增加Aspectj的支持以及perf4j的支持
- < aop:aspectj-autoproxy />
- < bean id = "timingAspect" class = "org.perf4j.log4j.aop.TimingAspect" />
<aop:aspectj-autoproxy/> <bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect"/>
5.为了能够在页面上进行定制统计图表的实时查看,需要在web.xml中增加如下配置
- < servlet >
- < servlet-name > perf4j </ servlet-name >
- < servlet-class > org.perf4j.log4j.servlet.GraphingServlet </ servlet-class >
- < init-param >
- < param-name > graphNames </ param-name >
- < param-value > graphExecutionTimes,graphExecutionTPS </ param-value >
- </ init-param >
- </ servlet >
- < servlet-mapping >
- < servlet-name > perf4j </ servlet-name >
- < url-pattern > /perf4j </ url-pattern >
- </ servlet-mapping >
<servlet> <servlet-name>perf4j</servlet-name> <servlet-class>org.perf4j.log4j.servlet.GraphingServlet</servlet-class> <init-param> <param-name>graphNames</param-name> <param-value>graphExecutionTimes,graphExecutionTPS</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>perf4j</servlet-name> <url-pattern>/perf4j</url-pattern> </servlet-mapping>
此处定义的graphExecutionTimes,graphExecutionTPS为log4j配置文件中定义的appender,可增加可删除.
6.现在最重要的一步就是log4j中的设置了.
首先将jpetstore的log4j配置文件log4j.properties更换为log4j.xml。内容如下
- <? xml version = "1.0" encoding = "UTF-8" ?>
- <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
- < log4j:configuration debug = "false" xmlns:log4j = "http://jakarta.apache.org/log4j/" >
- <!--
- This default ConsoleAppender is used to log all NON perf4j messages
- to System.out
- -->
- < appender name = "console" class = "org.apache.log4j.ConsoleAppender" >
- < layout class = "org.apache.log4j.PatternLayout" >
- < param name = "ConversionPattern" value = "%-5p %c{1} - %m%n" />
- </ layout >
- </ appender >
- <!-- Perf4J appenders -->
- <!--
- This AsyncCoalescingStatisticsAppender groups StopWatch log messages
- into GroupedTimingStatistics messages which it sends on the
- file appender defined below
- -->
- < appender name = "CoalescingStatistics"
- class = "org.perf4j.log4j.AsyncCoalescingStatisticsAppender" >
- <!--
- The TimeSlice option is used to determine the time window for which
- all received StopWatch logs are aggregated to create a single
- GroupedTimingStatistics log. Here we set it to 10 seconds, overriding
- the default of 30000 ms
- -->
- < param name = "TimeSlice" value = "10000" />
- < appender-ref ref = "fileAppender" />
- <!--
- Note how the GraphingStatisticsAppenders have been attached to the
- CoalescingStatistics here.
- -->
- < appender-ref ref = "graphExecutionTimes" />
- < appender-ref ref = "graphExecutionTPS" />
- </ appender >
- <!-- This file appender is used to output aggregated performance statistics -->
- < appender name = "fileAppender" class = "org.apache.log4j.FileAppender" >
- < param name = "File" value = "${petstore.root}/WEB-INF/perfStats.log" />
- < layout class = "org.apache.log4j.PatternLayout" >
- < param name = "ConversionPattern" value = "%m%n" />
- </ layout >
- </ appender >
- <!--
- This first GraphingStatisticsAppender graphs Mean execution times for the
- firstBlock and secondBlock tags
- -->
- < appender name = "graphExecutionTimes"
- class = "org.perf4j.log4j.GraphingStatisticsAppender" >
- <!-- Possible GraphTypes are Mean, Min, Max, StdDev, Count and TPS -->
- < param name = "GraphType" value = "Mean" />
- <!-- The tags of the timed execution blocks to graph are specified here -->
- < param name = "TagNamesToGraph" value = "getCategory,getItem,getItemListByProduct,getProduct,getProductListByCategory,searchProductList" />
- < appender-ref ref = "graphsFileAppender" />
- </ appender >
- <!--
- This second GraphingStatisticsAppender graphs transactions per second
- for the firstBlock and secondBlock tags
- -->
- < appender name = "graphExecutionTPS"
- class = "org.perf4j.log4j.GraphingStatisticsAppender" >
- < param name = "GraphType" value = "TPS" />
- < param name = "TagNamesToGraph" value = "getCategory,getItem,getItemListByProduct,getProduct,getProductListByCategory,searchProductList" />
- < appender-ref ref = "graphsFileAppender" />
- </ appender >
- <!--
- This file appender is used to output the graph URLs generated
- by the GraphingStatisticsAppenders
- -->
- < appender name = "graphsFileAppender" class = "org.apache.log4j.FileAppender" >
- < param name = "File" value = "${petstore.root}/WEB-INF/perfGraphs.log" />
- < layout class = "org.apache.log4j.PatternLayout" >
- < param name = "ConversionPattern" value = "%m%n" />
- </ layout >
- </ appender >
- <!-- Loggers -->
- <!--
- The Perf4J logger. Note that org.perf4j.TimingLogger is the value of the
- org.perf4j.StopWatch.DEFAULT_LOGGER_NAME constant. Also, note that
- additivity is set to false, which is usually what is desired - this means
- that timing statements will only be sent to this logger and NOT to
- upstream loggers.
- -->
- < logger name = "org.perf4j.TimingLogger" additivity = "false" >
- < level value = "DEBUG" />
- < appender-ref ref = "CoalescingStatistics" />
- </ logger >
- <!--
- The root logger sends all log statements EXCEPT those sent to the perf4j
- logger to System.out.
- -->
- < root >
- < level value = "INFO" />
- < appender-ref ref = "console" />
- </ root >
- </ log4j:configuration >
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- This default ConsoleAppender is used to log all NON perf4j messages to System.out --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> </layout> </appender> <!-- Perf4J appenders --> <!-- This AsyncCoalescingStatisticsAppender groups StopWatch log messages into GroupedTimingStatistics messages which it sends on the file appender defined below --> <appender name="CoalescingStatistics" class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender"> <!-- The TimeSlice option is used to determine the time window for which all received StopWatch logs are aggregated to create a single GroupedTimingStatistics log. Here we set it to 10 seconds, overriding the default of 30000 ms --> <param name="TimeSlice" value="10000"/> <appender-ref ref="fileAppender"/> <!-- Note how the GraphingStatisticsAppenders have been attached to the CoalescingStatistics here. --> <appender-ref ref="graphExecutionTimes"/> <appender-ref ref="graphExecutionTPS"/> </appender> <!-- This file appender is used to output aggregated performance statistics --> <appender name="fileAppender" class="org.apache.log4j.FileAppender"> <param name="File" value="${petstore.root}/WEB-INF/perfStats.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%m%n"/> </layout> </appender> <!-- This first GraphingStatisticsAppender graphs Mean execution times for the firstBlock and secondBlock tags --> <appender name="graphExecutionTimes" class="org.perf4j.log4j.GraphingStatisticsAppender"> <!-- Possible GraphTypes are Mean, Min, Max, StdDev, Count and TPS --> <param name="GraphType" value="Mean"/> <!-- The tags of the timed execution blocks to graph are specified here --> <param name="TagNamesToGraph" value="getCategory,getItem,getItemListByProduct,getProduct,getProductListByCategory,searchProductList"/> <appender-ref ref="graphsFileAppender"/> </appender> <!-- This second GraphingStatisticsAppender graphs transactions per second for the firstBlock and secondBlock tags --> <appender name="graphExecutionTPS" class="org.perf4j.log4j.GraphingStatisticsAppender"> <param name="GraphType" value="TPS"/> <param name="TagNamesToGraph" value="getCategory,getItem,getItemListByProduct,getProduct,getProductListByCategory,searchProductList"/> <appender-ref ref="graphsFileAppender"/> </appender> <!-- This file appender is used to output the graph URLs generated by the GraphingStatisticsAppenders --> <appender name="graphsFileAppender" class="org.apache.log4j.FileAppender"> <param name="File" value="${petstore.root}/WEB-INF/perfGraphs.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%m%n"/> </layout> </appender> <!-- Loggers --> <!-- The Perf4J logger. Note that org.perf4j.TimingLogger is the value of the org.perf4j.StopWatch.DEFAULT_LOGGER_NAME constant. Also, note that additivity is set to false, which is usually what is desired - this means that timing statements will only be sent to this logger and NOT to upstream loggers. --> <logger name="org.perf4j.TimingLogger" additivity="false"> <level value="DEBUG"/> <appender-ref ref="CoalescingStatistics"/> </logger> <!-- The root logger sends all log statements EXCEPT those sent to the perf4j logger to System.out. --> <root> <level value="INFO"/> <appender-ref ref="console"/> </root> </log4j:configuration>
最后启动服务器,点击petstore上面的链接,就可以看到项目WEB-INF/下面的perfStats.log,perfGraphs.log已经有数据了。
现在查看http://localhost:8080/jpetstore/perf4j,就可以查看perf4j对各个检测方法的图形统计了,如下:
上面我们是采用的AOP方式,另外也可以采用更具侵入性的方法来实现,在SqlMapProductDao代码块的开始和结尾增加如下代码:
- public List searchProductList(String keywords) throws DataAccessException {
- StopWatch stopWatch = new LoggingStopWatch();
- Object parameterObject = new ProductSearch(keywords);
- List aaa = getSqlMapClientTemplate().queryForList("searchProductList" , parameterObject);
- stopWatch.stop("searchProductList" );
- return aaa;
- }
public List searchProductList(String keywords) throws DataAccessException { StopWatch stopWatch = new LoggingStopWatch(); Object parameterObject = new ProductSearch(keywords); List aaa = getSqlMapClientTemplate().queryForList("searchProductList", parameterObject); stopWatch.stop("searchProductList"); return aaa; }
最后,perf4j在检测方式上还提供其他一些特性,譬如可以自定义TAG。。。可以查阅其相关文档http://perf4j.codehaus.org/devguide.html 。
来自:http://eddysheng.iteye.com/blog/434913
发表评论
-
说明SOA监管(SOA Governance)实例(收录备查)
2012-12-19 11:35 1710SOA 已经不是单纯技术问 ... -
Injecting Spring Beans into Java Servlets
2012-11-01 10:21 1904If you are working in a Java ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3702原文出处:http://blog.chenlb.com/200 ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:17 3834When I try to install the And ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:13 1937When I try to install the And ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14785大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1667charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22519Java Native Access 项目 在 ... -
使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
2011-04-20 11:59 13281"在服务器运行过程中,Spring不停的运行的计划任 ... -
DBCP代码研读以及就数据库连接失效的解决
2011-03-31 11:03 3725问题 网上很多评论说DBCP有很多BUG,但是都没有指明是什 ... -
ContextLoaderListener
2010-12-06 15:58 8420(1) org.springframework.web.c ... -
Servlet3.0新功能: 异步处理
2010-12-06 15:22 3121J2EE 6和Glassfish 3V正式发 ... -
Servlet3.0引入的新特性
2010-12-06 15:20 3025Servlet3.0规范的新特性主要是为了3个目的: ... -
100個節點上運行群集亞馬遜EC2上Hazelcast
2010-12-03 23:59 3290本文的目的,適是给妳湮示的細節集群的100個節點。此湮示記錄, ... -
Spring Properties Reloaded
2010-12-02 14:54 4342Spring Properties Reloaded Som ... -
语义网的学习资源大汇集(备忘)
2010-06-23 22:48 1684网上资源 http:/ ... -
使用 JOLAP 实现复杂分析查询
2010-06-06 13:42 1922Shashank Tiwari 在本文中对 ... -
HTML5 Canvas for Internet Explorer
2010-06-04 21:16 1825Canvascape http://www.benjoff ... -
大型网站架构演变和知识体系
2010-06-01 23:47 1910架构演变第一步:物 ... -
Ejb Con Spring
2010-05-20 17:46 2175Contenido [ocultar] 1 ...
相关推荐
学习Spring 的例子JpetStore
spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导 入eclipse中运行。共3个压缩包
NULL 博文链接:https://jnh.iteye.com/blog/452766
用spring改造的jpetstore4.0,适用于jdk7+,tomcat6+。mysql数据库
参照jpetstore做出的Struts1.1+spring2.5+ibatis2.3+Ajax的整合、从页面输入学生的Id、光标离开后、页面利用无刷新技术从数据库取出显示在页面上。
最新spring带的JPetStore的MyEclipse项目,包括了数据库,可用hsqldb直接运行,可以直接导入MyEclipse中并部署运行。 在Myeclipse里新建一个web项目,导入shopping项目即可,数据库在db文件夹里
spring附带的例子 jpetstore 包括spring mvc 和 struts
myeclipse些测试运行成功
这是使用Struts+Spring+Hibernate实现jpetstore的功能的源代码
本例子经过修改,配置,组装成了一个可直接部署运行,不需要修改的demo,是学习spring ibatis struts 的一个非常好的例子。绝对好东西!!尽情下吧!!!
spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导入eclipse中运行。共3个压缩包
spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导 入eclipse中运行。共3个压缩包
NULL 博文链接:https://ritaleo.iteye.com/blog/723394
spring的jpetstore实例,可以直接用myeclipse打开的工程,里面含有建数据库的文件。
spring jpetstorespring jpetstorespring jpetstorespring jpetstorespring jpetstorespring jpetstore
该jpetstore经典案例为最新SPRING开发包里面的完全案例,并集成到eclipse里面了,在eclipse里面可以直接运行并调试,在工作目录里面直接建立jpetstore目录,自动导入该目录下文件,修改jdbc.properties配置文件,连接...
spring+ibatis的jpetstore实例工程,包含完整源代码和jar包
在原有的JPetStore5.0的基础上修改,数据持久层用hibernate替换原有的ibatis;添加Spring框架。
eclipse环境下spring框架的宠物商店的例子目录结构~
Struts+Spring+ibatis开发的Jpetstore宠物商店的开源程序,在SourceForce上下载的,学JAVA WEB开发的人研究的热门开源程序。有需要的同学分享吧!这里提供的是一个下载地址,因为有点大,所以就提供了一个地址,大家...