Java Web技术经验总结(二)

该系列的第一篇在此:Java Web技术经验总结一,主要包含我在日常工作中的经验和心得体会(如有不足之处欢迎指出)。

  1. Maven的使用经验

    • 依赖的scope有test、provided、compile等。test:一般是单元测试场景使用,在编译环境加入classpath,但打包时不会加入,如junit等;provided:表示容器或者JDK已经提供该依赖,打包时不需要打包入war;compile:默认范围,在工程环境的classpath(编译环境)和打包(如果是WAR包,会包含在WAR包中)时候都有效。
  2. JVM相关参考资料
  3. JVM观察和调试相关的命令
    • 排查full gc问题,可以通过命令jstat -gccause java_pid 1s查看gc发生的原因
    • 观察gc.log的时候:(1)GC开头的都是Young GC;(2)CMS-initial-mark标识,且没有full字样的,是old区的GC;(3)带full字样的是fgc(例外情况:-XX:+ExplicitGCInvokesConcurrent,这个参数会把full gc转成cms gc,因此gc.log中不会有full gc字样)。
    • 查看JVM进程:ps -ef|grep java
    • 查看JVM内存占用信息:
      sudo -u admin /opt/taobao/java/bin/jstat -gccause ${PID} 1000 1000
    • dump内存:
      sudo -u admin /opt/taobao/java/bin/jmap -F -dump:live,file=/home/admin/heap.bin ${PID}
  4. 线上机器每隔一个小时full gc问题排查
    • 参考文章

    • 排查思路
      • 首先,怀疑jdk版本问题,升级之后依然存在,排除
      • 第二,怀疑tomcat版本问题,由7.0.26.1升级到7.0.54.1之后消失
      • 分析gc.log,每隔一小时出现一次cms收集,最开始认为这不是full gc;后查询资料发现ExplicitGCInvokesConcurrent选项会将full gc转换成cms gc,因此gc.log中没有“full gc”字样;然后根据参考文章1和参考文章2定位问题。
    • 结论:tomcat 7.0.26.1版本中的JreMemoryLeakPreventionListener,该监听器每隔一个小时会触发一次System.gc()。根据tomcat官方的bug fix报告可知,在7.0.28版本将该间隔fix成Long.MAX_VALUE了。
  5. 在单元测试中加载配置文件
    • 在spring项目中,使用Mockito+JUnit测试业务逻辑时,有时需要读取一些外部配置文件(例如biz.properties),可以参考Spring下的单元测试(JUnit)--加载配置文件
    • 可以考虑使用@Properties定位配置文件、使用@Value注入配置属性;不过在这种情况下,需要解决不同环境下的属性配置问题;
    • 可以考虑通过暴露set接口,在单元测试中设置对应的属性,从而避免处理外部配置文件的先关技术。
  6. Mockito + Spring + AssertJ是Spring项目中写单元测试的最佳组合,优点有:轻量、简洁、可以测试web层(拦截器、过滤器等)、可以测试异常分支。
  7. log4j中的日志级别有:DEBUG、INFO、WARN、ERROR(级别依次变高),在生产环境中一般采用ERROR级别、在开发环境中使用DEBUG级别。如果日志级别为DEBUG级别 ,则代码中的logger.debug()logger.info()logger.warn()logger.error()等日志都会打印;如果日志级别为WARN,则只会打印WARN和ERROR日志。参考:日志级别的选择
  8. 给Controller的@RequestMapping方法加日志,通过AOP不容易加(有解决方案),一个比较迂回的方法是,让Controller使用一个Service代理(包含一个process方法),拦截这个process方法比较容易。
  9. Java Web的最佳实践:Spring Boot + Thymeleaf,基础技术包括:Spring + HTML + CSS。JSP,Velocity和FreeMarker,那是上一代的模板引擎,应该尝试一下新的东西。参考:Thymeleaf官网
  10. 数据库部分,企业级Java Web要求的知识架构很多,后端就包括数据技术,最常用的是关系型数据库MySQL,可以阅读下列文章补充一点知识点。当然,最常用、最有效的参考资料是官方文档。
  11. 常用概念,PV:请求次数/day;UV:不同uuid的个数/day。对于自己负责的业务,有两个日志是必须的:BI日志和业务监控日志——BI日志用于计算业务指标,可以指导运营和产品的动作、业务日志用于研发同学监控自己服务的稳定性、机器的使用率、接口的QPS等指标。
  12. 服务的稳定性,需要良好的监控保障,主要包括几个方面:系统监控、应用监控(JVM)、业务监控(PV/UV/RT)和调用链路监控等。
时间: 2024-09-14 15:16:53

Java Web技术经验总结(二)的相关文章

Java Web技术经验总结(四)

Spring MVC中返回JSON数据的不同方法 Spring 3 MVC ContentNegotiatingViewResolver example,该视图解析器,可以用于将同一份模型数据展现为不同的表现形式,例如JSON.XML和RSS等: 利用@ResponseBody注解修饰控制器方法,并在xxx-servlet.xml中开启spring mvc支持--<mvc: annoation-driven/>,这种机制背后的原理是MessageConverter. 最近用Mockito写单元

Java Web技术经验总结(三)

在Spring项目中,如果需要配置spring xml文件,要注意,将顶部的schema信息中的版本信息去掉,这样xml配置文件就不会跟具体的spring版本耦合:而且还可以避免一些诡异的问题,例如下面这种异常 org.xml.sax.SAXParseException :schema_reference.4: 无法读取方案文档 'http://www.springframework.org/schema/beans/spring-beans-3.0.xsd', 原因为 1) 无法找到文档; 2

Java Web技术经验总结(一)

接口的权限认证,使用拦截器(HandlerInterceptorAdapter),参考:第五章 处理器拦截器详解--跟着开涛学SpringMVC.注意:推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的.最先应该使用的 "@Autowired"的含义是:ListableBeanFactory接口定义的<T> Map<Stri

Java Web技术内幕:深入理解Session与Cookie

其实这个问题回答起来既简单又复杂,简单是因为它们本身只是 HTTP 协议中的一个配置项,在 Servlet 规范中也只是对应到一个类而已:说它复杂原因在于当我们的系统大到需要用到很多 http://www.aliyun.com/zixun/aggregation/12583.html">Cookie 的时候,我们不得不考虑 HTTP 协议对 Cookie 数量和大小的限制,那么如何才能解决这个瓶颈呢? Session 也会有同样的问题,当我们的一个应用系统有几百台服务器的时候如何解决 Se

java web技术需要从服务器端数据库中下载数据到本地

问题描述 由于是web技术所以代码也要放在服务器上.客户端运行一个网页的时候,后台自动运行从服务器端的数据库中把数据写到本地的txt文本文件中.细节要求是按照日期判断同一天的数据是一个txt.隔天自动生成另一个txt..格式要求数据能自动换行求完成代码..加注解....万分感谢 解决方案 解决方案二:我晕...没人知道啊...高手哪去啦....解决方案三:我晕.没人知道啊..高手哪去了解决方案四:我晕.没人知道啊..高手哪去了

java web 技术-求助!关于模拟登陆利用接收的cookie判断登录是否成功,遇到了问题,,求大神们相助!在下多谢!

问题描述 求助!关于模拟登陆利用接收的cookie判断登录是否成功,遇到了问题,,求大神们相助!在下多谢! 在下学生最近在做一个用java开发模拟登陆校内网的项目,可是学校使用struts2做的,url的尾缀是.action,登陆前和登陆后的url一致,无法用html来判断,,于是就想用cookie来判断登陆是否成功,可是面临一个问题就是请求标头的Cookie是JSESSIONID=3CDAB1BA4520BD1F53E62F9D5BCCCC49之类的,发送的jsessionid和接收的jses

java web 技术-web应用实现实时视频通讯的,java为后台

问题描述 web应用实现实时视频通讯的,java为后台 基于web服务的实时视频通讯的大体架构模型(视频流的技术),java为后台, 赐教!! 解决方案 参考webrtc的模型 http://www.cnblogs.com/zhaozhan/archive/2012/03/31/webrtc.html

用Java Web技术控制电子设备,比如数据采集卡,能实现吗?

问题描述 小弟想做一个网站,用这个网站来控制一套数据采集装置,在网站上发送指令,数据采集装置就把数据写到数据库里面,这样的想法可能实现吗,该用什么技术呢?? 解决方案 可以,但是得需要硬件设备的JAVA版接口,一般硬件接口,输入输出数据都固定好了.提取相应数据即可,也可联系硬件开发商,开发个人需求的接口.

项目技术经验总结二:系统多风格的实现

项目|项目 在刚刚完成的一个系统中,(基于asp.net)要求系统提供多风格,用户可自由选择系统风格.我们通过采用css样式文件替换,简单有效地实现了该项功能.实现步骤如下: 1.定义css样式文件,可命名为style_blue.css等:2.在每个程序页面(*.aspx)设置相应的css中Class3.用户登陆时取出其设置的风格(值为css文件名,如style_blue)利用Session保存4.进到特定页面,从Session取出css风格,在文件头加载相应的css文件(如style_blue