今天突发奇想的对j2ee项目的性能监控来了兴趣,索性找找资料研究一下!
可能很多朋友在性能优化方面都有很多困扰:程序在哪方面存在缺陷?sql哪里有瓶颈?哪个请求最频繁?哪个请求耗时最长……从某种意义上说,解决问题并不是特别困难的事儿,但如何发现问题的问题会经常困扰着我。
今天给大家介绍一款j2ee项目性能监测工具:jwebap!通过简单的研究,发现这东西还是挺好用的,哈哈!
一、jwebap简介 参见
leadyu的博客
Jwebap是一个用于J2EE工程(EJB以及WebModule系统)进行性能监控的组件,它有几个特点:
1)基于ASM实现类的静态增强,可以无缝的部署于J2EE系统,对系统的开销几乎可以忽略
2) 部署和使用非常的简单,整个Jwebap的部署只需要部署jwebap_core_**.jar以及需要使用的各种plugin_**.jar,然后配置 jwebap.xml和web.xml就可以完成所有的部署,比起绝大多数的profiling容易的多。 同时Jwebap提供Web Console进行整个Jwebap的管理和数据展现。在API层提供一套默认的视图框架供plugin开发者使用,可以只用Jar包就开发出相当漂亮的 Web界面。
3)Jwebap的开发分为两个部分Jwebap-core部分,Jwebap-plugin部分。core部分基于jdk14 提供了类静态增强,轨迹生命管理,Plugin管理,视图框架等等,在这个基础上开发plugin。我觉得,好的profiling应该能够根据不同的人 群按需使用,同时在功能不断复杂和强大的过程中仍然能够保证较轻的架子。
理论部分原作者已经介绍的很详细了,这里就不再赘述。直接上干货!
二、jwebap的部署
1、将jwebap_0.6.1.jar、tracer_0.6.1.jar以及依赖包commons-beanutils.jar、commons-betwixt-0.8.jar、commons-digester-1.7.jar、commons-logging.jar、commontemplate-0.8.1.jar、jxl.jar导入到项目的classpath下。(一般webapp项目放在web-inf下的lib中即可)。
2、将jwebap.xml导入到classpath下。
jwebap.xml
<?xml version="1.0" encoding="UTF-8"?>
<jwebap>
<!--plugins-->
<plugin name="Tracer" ref="${ABSOLUTE_PATH}/tracer_0.6.1.jar"/>
<!--dispatcher-->
<dispatcher name="RedirectDispatcher" mapping="" type="org.jwebap.ui.controler.DefaultRedirectDispatcher" />
<dispatcher name="ActionDispatcher" mapping="/console/*" type="org.jwebap.ui.controler.ActionDispatcher" />
<dispatcher name="ResourceDispatcher" mapping="/resources/*" type="org.jwebap.ui.controler.ResourceDispatcher" />
<!--action-mapping-->
<action-mapping>
<action path="/" type="org.jwebap.ui.action.EmptyAction" template="resources/view/index.ctl" />
<action path="/deploy/plugins" type="org.jwebap.ui.action.EmptyAction" template="resources/view/plugin_deploy.ctl" />
<action path="/deploy/plugins/list" type="org.jwebap.ui.action.PluginListAction" />
<action path="/deploy/plugins/remove" type="org.jwebap.ui.action.PluginRemoveAction" />
<action path="/deploy/plugins/new" type="org.jwebap.ui.action.PluginFormAction" template="resources/view/plugin_deploy_new.ctl" />
<action path="/deploy/plugins/add" type="org.jwebap.ui.action.PluginAddAction" />
<action path="/deploy/plugins/detail" type="org.jwebap.ui.action.EmptyAction" template="resources/view/plugin_detail.ctl" />
<action path="/deploy/plugins/components/list" type="org.jwebap.ui.action.ComponentListAction" />
<action path="/deploy/plugins/components/detail" type="org.jwebap.ui.action.ComponentFormAction" template="resources/view/component_detail.ctl" />
<action path="/deploy/plugins/components/save" type="org.jwebap.ui.action.ComponentSaveAction" />
</action-mapping>
</jwebap>
3、修改项目下的web.xml,添加jwebap相关的配置
<context-param>
<param-name>jwebap-config</param-name>
<param-value>/WEB-INF/jwebap.xml</param-value>
</context-param>
<listener>
<listener-class>org.jwebap.startup.JwebapListener</listener-class>
</listener>
<filter>
<filter-name>PageDetectFilter</filter-name>
<filter-class>org.jwebap.plugin.tracer.http.DetectFilter</filter-class>
<init-param>
<param-name>excludeUrls</param-name>
<param-value>/detect;/detect/*;*.js;*.jpg;*.htm;*.html;*.gif;*.png;*.css;*.swf</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PageDetectFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>detect</servlet-name>
<servlet-class>org.jwebap.ui.controler.JwebapServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>detect</servlet-name>
<url-pattern>/detect/*</url-pattern>
</servlet-mapping>
4、修改tracer_0.6.1.jar中的plugin.xml文件(在jar包的META-INF文件夹下)
……
<component name="MethodComponent" type="org.jwebap.plugin.tracer.method.MethodComponent">
<component-param>
<name>trace-filter-active-time</name>
<value>-1</value>
<description>(ms) timings filter's over time</description>
</component-param>
<component-param>
<name>trace-max-size</name>
<value>1000</value>
<description>max over-time trace size</description>
</component-param>
<component-param style="longtext">
<name>detect-clazzs</name>
<value>
com.gamecenter.controller.report.*;<!-- 改为需要监控的包或者类 -->
</value>
<description>
package name and class name that monitored by MethodComponent,
e.g.: 'test.*;test.Test' , divided by ';'
</description>
</component-param>
</component>
<component name="JdbcComponent" type="org.jwebap.plugin.tracer.jdbc.JdbcComponent">
<component-param>
<name>trace-filter-active-time</name>
<value>-1</value>
<description>(ms) timings filter's over time</description>
</component-param>
<component-param>
<name>trace-max-size</name>
<value>1000</value>
<description>max over-time trace size</description>
</component-param>
<component-param style="longtext">
<name>connection-listener</name>
<value>
org.jwebap.plugin.tracer.http.ServletOpenedConnectionListener;org.jwebap.plugin.tracer.method.MethodOpenedConnectionListener
</value>
<description>Connection Listener</description>
</component-param>
<component-param style="longtext">
<name>driver-clazzs</name>
<value>com.jolbox.bonecp.BoneCPDataSource</value><!-- 配置数据库连接池驱动,我这里用的是bonecp连接池 -->
<description>
1)Local datasource: set your ConnectionManagerClass,or the connection pool 's datasource. If you have more than one class ,divided by ';'.
c3p0:com.mchange.v2.c3p0.ComboPooledDataSource;
dbcp: org.apache.commons.dbcp.BasicDataSource
Also,other class. Jwebap will inject driver-clazzs,and detect any connection and datasource object it's method renturn.
Note: 'driver-clazzs =jdbc driver' is deprecated. Beacause of connection pool, set 'driver-clazzs =jdbc driver', jwebap will find out all connection is leaked.
2)JNDI datasource: If your application uses jndi datasource, you can set the class which manages connections in your application as driver, e.g.: 'com.china.telecom.ConnectionManager'.
Else if you use spring to get jndi datasource ,
you also can set driver-clazzs=org.springframework.jndi.JndiObjectFactoryBean.JdbcComponent
will inject this class to proxy all connection the class's method return.
org.springframework.orm.ibatis.SqlMapClientFactoryBean
</description>
</component-param>
</component>
至此,jwebap的配置就完成了!让我们赶快启动应用来测试一下吧!
应用正常启动后,在浏览器中输入 http://ip:port/servername/detect/console/ 你会看到jwebap的性能检测界面,大功告成!
三、遇到的问题:
1、JdbcComponent 中driver-clazzs的设置。这里直接设置成数据库连接池就好了。但是设置完成以后可能会出现以下错误:
org.jwebap.toolkit.bytecode.InjectException: com.jolbox.bonecp.BoneCPConfig注入失败.
……………………
Caused by: org.jwebap.toolkit.bytecode.asm.DefineBytecodeException: com/jolbox/bonecp/BoneCPConfig注入错误:loader (instance of org/apache/catalina/loader/WebappClassLoader): attempted duplicate class definition for name: "com/jolbox/bonecp/BoneCPConfig"
这个问题之前我也尝试了很多方法,最后才发现这个重复加载是由于spring和jwebap都加载了boncp类造成的,而我这里采取的解决办法就是将
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
放在
<listener>
<listener-class>
org.jwebap.startup.JwebapListener
</listener-class>
</listener>
的后面即可。至于为什么,我现在还不是很清楚,欢迎哪位大师指点一二!
2、如果JdbcComponent 中driver-clazzs的设置没有报错,但是控制台下的jdbc Trances就是没有监测到数据,那么你的driver-clazzs可能没有和你项目中所使用的数据库连接池(或驱动)匹配上,再换个数据源试试吧!
- 大小: 57.4 KB
分享到:
相关推荐
PC间用ACL和TRP协议
基于西门子S7-1200PLC的立体车库创新设计:融入新能源汽车充电元素,简约而不简单的智能化方案,基于西门子S7-1200PLC的立体车库设计设计 针对古老传统的立体车库进行创新,引入当下流行的新能源汽车充电元素,简约而不简单 包含:程序,图纸,仿真 ,关键词:基于西门子S7-1200PLC; 立体车库设计; 创新; 新能源汽车充电元素; 简约设计; 程序; 图纸; 仿真。,基于新能源充电的西门子S7-1200PLC立体车库创新设计:程序、图纸与仿真,简约而不凡
陕西省国家级非物质文化遗产经纬度数据统计表 统计内容包含以下字段: 1. 项目名称 2. 遗产类别 3. 入选批次 4. 所属地区 5. 申报地区/单位 6. 保护单位 7. 地理经度 8. 地理纬度 该统计表系统记录了陕西省国家级非物质文化遗产的地理空间信息,为文化遗产的数字化保护与研究工作提供了重要的数据支撑。
GBT27023复习备考
vivado MIPS32五级流水CPU设计
基于MBD开发手册的《Application Modeling Guideline:辅助驾驶系统中的数学模型设计与应用》,Application Modeling Guideline 文档57页 基于MBD开发手册包含: 1. MBD概述:文档可能会介绍MBD的基本概念,解释为什么它在辅助驾驶系统开发中至关重要。 MBD允许工程师使用数学模型来描述系统行为,这有助于早期发现问题,减少硬件原型制作的需求。 2. 工具选择:在辅助驾驶开发中,常用的MBD工具有MATLAB Simulink、MathWorks的Simulink Design Verifier、Vector的CANoe等。 文档可能涵盖这些工具的特点和适用场景,帮助开发者选择合适的工具。 3. 模型设计:MBD的核心是模型设计,文档会详细说明如何创建和组织模型结构,包括输入 输出接口定义、状态机设计、算法实现等。 对于辅助驾驶系统,这可能涉及到视觉处理、传感器融合、路径规划、决策制定等多个模块。 4. 仿真与验证:MBD工具支持动态仿真,开发者可以运行模型以验证其功能。 文档会介绍如何设置仿真条件,进行时序分析,以及如
LabVIEW曲线处理与包络线判断功能:准确判断,附带Demo及完整源码,labview做的曲线处理,包络线判断功能,判断准确。 一个demo,有源码 ,Labview曲线处理; 包络线判断功能; 判断准确; 有源码Demo; 包络线功能Demo; 准确度。,LabVIEW曲线处理与包络线精准判断功能Demo源码分享
2021年06月Scratch三级实操
GBT27067复习备考
基于nRF905的实验室温湿度监测系统研究.pdf
2022年12月机器人六级理论
Unity Shader Graph 2D - 角色身上部件高亮Bloom效果
大四-校内实习第四天(五)
2020年09月机器人五级实操
springboot停车场管理系统,含有完整的源码和报告文档
基于MPC模型预测算法的轨迹跟踪控制研究:双仿真比较及侧偏角软约束的重要性分析,基于mpc模型预测轨迹跟踪控制,总共包含两套仿真,一套是不加入四轮侧偏角软约束,一套是加入四轮侧偏角的软约束控制,通过carsim与simulink联合仿真发现加入侧偏角软约束在进行轨迹跟踪时,能够通过控制四轮侧偏角的变化,较好的实现轨迹跟踪;而不加入侧偏角软约束的,发现车辆由于失去稳定性, 轨迹跟踪失败( 该仿真是学习mpc模型预测算法控制和基于车辆动力学轨迹跟踪控制非常好的学习资料)。 文件中参考文献和文件说明。 ,基于mpc模型预测轨迹跟踪控制; 四轮侧偏角软约束; 车辆稳定性; 轨迹跟踪失败; carsim与simulink联合仿真; mpc模型预测算法控制; 车辆动力学轨迹跟踪控制。,MPC模型预测轨迹跟踪控制:侧偏角软约束与车辆稳定性的联合仿真研究
基于扩展卡尔曼滤波算法的车辆多状态精确估计与仿真研究:融合位置、轨迹、速度及加速度的实时动态监测,基于扩展卡尔曼滤波EKF的车辆状态估计 估计的状态包括: 1. 车辆的横纵向位置 2.车辆行驶轨迹、横摆角、 3. 车速、加速度、横摆角速度 4. 相应的估计偏差。 内容附带:Simulink模型与MATLAB代马,以及参考文档。 ,基于扩展卡尔曼滤波; 车辆状态估计; 横纵向位置估计; 行驶轨迹估计; 横摆角估计; 车速估计; 加速度估计; 横摆角速度估计; 估计偏差; Simulink模型; MATLAB代码; 参考文档。,"基于扩展卡尔曼滤波的车辆多状态估计系统及其偏差分析:Simulink模型与MATLAB代码实现"
"基于V-REP与MATLAB联合仿真的小车项目:循迹、避障、走迷宫及路径规划的详细代码与文档说明匹配版",V-REP小车项目+匹配文档,基于V-REP与MATLAB联合仿真,小车能够完成循迹、避障、走迷宫和路径规划,提供详细代码和文档说明。 ,核心关键词:V-REP小车项目; 匹配文档; 联合仿真; 循迹; 避障; 走迷宫; 路径规划; 详细代码; 文档说明。,V-REP小车项目:循迹避障与路径规划联合仿真实现
2022年7月环境管理体系基础