今天我们不细讲Spring MVC的架构,只是总结下性能测试过程中使用到的小经验以及遇到的性能问题。
架构图:
eclipse中:ctrl-H,搜索找到的file search,通过url信息在java文件中搜索。
找到了Controller层就找到了整个url处理的方法入口,再通过类调用信息查看Service层的处理过程以及DAO层的处理过程。
每一个DAO类上面都有 @Repository("name") ,ctrl-shift-r查找repository对应的xml文件,然后方法中指定的id名,查找对应的sql
getSqlSession().selectOne("name", schemeId);
getSqlSession().update("name", map);
getSqlSession().insert("name", coupon);
或者也可以通过上面的方法,直接ctrl-h,基于id名在xml文档中搜索。
eclipse IDE:
问题表象:
接口响应时间太长
定位方法:
通过spring的配置我们看到,该产品中使用的view层处理是freemarker
<bean id="viewResolver" >
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="suffix" value=".ftl"/>
<property name="exposeRequestAttributes" value="true"/>
<property name="exposeSessionAttributes" value="true"/>
<property name="allowRequestOverride" value="true"/>
<property name="allowSessionOverride" value="true"/>
通过btrace采集freemarker层的处理时间,发现的确是大部分时间花在了view层上
@OnMethod(
clazz="+org.springframework.web.servlet.view.freemarker.FreeMarkerView",
method="processTemplate",
location=@Location(value=Kind.RETURN)
)
public static void onProcessorAction(@ProbeClassName String pcn, @ProbeMethodName String pmn, @Duration long d) {
log = Strings.append(log, str(d/1000000));
println(log);
log = Strings.newStringBuilder(false);
}
问题原因:
导致该问题的主要原因是:页面ftl的代码过于复杂,导致freemarker解析模板类时,性能开销过多。
解决方法:
优化ftl文件,减少过多的逻辑处理。
问题表象:
混合接口运行5-6个小时以上,出现频繁Full GC的现象。
定位方法:
问题原因:
解决方法:
推荐使用RedirectAttributes管理参数。
In the example from the referenced blog post, the same redirect URL can be expressed as a URI template, which would ensure the same view name is used as the cache key every time.
In other words instead of:
return "redirect:form.html?entityId=" + entityId;
Do this:
return "redirect:form.html?entityId={entityId}";
In the above example, entityId can be a model attribute or if it is present as a URI variable on the current request, then it'll work fine.
In Spring 3.1+ it is actually preferable to use RedirectAttributes:
@RequestMapping(method = RequestMethod.POST)
public String onPost(RedirectAttributes attrs) {
...
attrs.addAttribute(entityId, 123);
return "redirect:form.html; // resulting URL has entityId=123
}
The above would also work before Spring 3.1 as long as entityId is in the model. However, using RedirectAttributes is preferable. See the reference documentation for more detail on that.
问题表象:
定位方法:
问题原因:
解决方法:
<bean id="HessianService" >
<property name="httpInvokerRequestExecutor">
<property name="httpClient">
<bean >
<bean >
<property name="params">
<bean >
<property name="maxTotalConnections" value="50000"/>
<property name="connectionTimeout" value="15000"/>
<property name="soTimeout" value="15000"/>
<property name="defaultMaxConnectionsPerHost" value="50000"/>
</bean>
</property>
</bean>
</bean>
</property>
</property>
</bean>
网易云新用户大礼包:https://www.163yun.com/gift
本文来自网易实践者社区,经作者侯本文授权发布。