Java Web技术经验总结(三)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:
  1. 在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) 无法读取文档; 3) 文档的根元素不是 <xsd:schema>。

    这种错误的原因是:spring xml配置文件中指定的xsd文件读取不到了,原因多是因为断网或spring的官网暂时无法连接导致的。
    参考:Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)

  2. 在Spring + MyBatis项目中,写SQL语句的时候,要注意返回null的情况,例如:

    <select id="getFileSize" resultType="Long">
    SELECT sum(file_size) as fileSize
    FROM file_nodes
    WHERE uid=#{uid}
    </select>

    上述SQL语句,有可能返回null,因此resultType必须用Long,且Dao层的返回值也要用Long,并且需要在调用方做出判断和处理,否则会报空指针错误。

  3. awk,用于日志分析和数据统计。例如,最近有个数据统计的需求,那么命令awk -F '[:,]' '{s[$4] += $6; a[$4] += $8}END{for(i in s){print i, s[i], a[i]}}' OFS="\t" odsToolResBak可完成的工作是:将一个json字符串组成的日志文件,按照冒号和分号切割,并按照第4列分组,分别求第6列和第8列的和,最后每行的结果直接用'\t'分割。参考资料如下:

  4. vim,另一个上古神器,要熟悉常用的命令,例如10,100w!>>test.txt,该命令可将10行到100行的内容复制到另一个文件test.txt中;参考资料如下:

  5. 分享一个匹配中国大陆的有效手机号码的正则表达式:点我。另外,使用Java进行正则匹配的教程,可以参考:Java正则表达式

  6. Thymeleaf是一种用于代替JSP的新兴技术,Spring提供了与Thymeleaf的原生模板(nature template)协作的视图解析器。Thymeleaf与Velocity不同的地方在于,它看起来就像是原生的Html页面,不过在Html标签中增加了访问Spring bean的功能,并且可以直接在浏览器中打开。一言以蔽之:页面即原型。关于Thymeleaf的介绍可以参看这篇文章:新一代Java模板引擎Thymeleaf

  7. 别返回null值:当一个方法返回Collection集合的时候,不要返回null,如果没有结果则返回空的集合(例如:Collections.emptyList();),这样该方法的客户就不需要判断null的逻辑。这就是Java开发中的特例模式的应用。

  8. 如何学习开源项目,例如Spring?接触Spring近一年了,零零碎碎看了很多资料,看得阅读,就能将越多零碎的知识点拼接在一起,对Spring的整体设计思路也有渐渐加深的体会。整理一点优质材料在这里吧:

    • 好书
      • 《Spring揭秘》,关于Spring的技术图书,这本最好,具体怎么好?读了就知道,喜欢探究原理的人读起来一气呵成,很hi;
      • 《Spring实战 第4版》,最近国内刚出中文版,这本书的特点就是:知识点整理清楚,例子完整。虽然少了点原理讲解,比较适合Spring入门;
      • 《Spring技术内幕》,这本书去年浏览过一次,对代码的走读不错,但是有些原理性、设计思想阐述得不够深刻;
    • 好文
      • 我为什么要做瞎子摸象的践行者,文中的“如果一个事物庞大到你无法一眼就看透它,了解它, 那么, 不妨先一小块儿一小块儿的去探索,然后再结合你探索的这些碎片成果进行拼装和推演, 慢慢地,你就会对这个庞然大物有了更多的了解(当然, 是否能够完全了解,我就不敢妄言了)”这句,非常适合用在这里。spring发展到现在的4.3,已经非常复杂且包含了太多内容,我们不可能一上来就掌握全局,只能一点一点去看。
      • Spring框架的设计理念和设计模式分析
  9. 今天遇到一个应用启动失败的例子,一直处在tomcat wait的状态,查了很多问题没发现原因,最后才想到要看线程堆栈,用命令jstack pid >> temp.123将线程堆栈dump到文件中,发现某个bean初始化的时候依赖了第三方服务,而部署的机器跟那个服务属于两个独立环境,因此线程在这里Hold住了。

    • 当发现应用表现为性能低下、启动卡主时,要使用jstack看线程堆栈;
    • 当发现应用表现为内存gc异常,要使用jstat查看内存使用情况
  10. 今天对应用做性能测试的时候,发现CPU一直打满,由于该应用中大量应用了异步任务,怀疑是线程太多导致的CPU争用。根据关于JVM CPU资源占用过高的问题排查一文的提示,首先通过top命令,获得JVM进程的PID;然后用命令top -H -p PID,获得JVM中各个线程的运行情况,可以看到某些进程消耗的CPU一直在90多,记录这些线程的thread id,并转成十六进制;然后用命令jstack -l PID >> temp.123将JVM的运行栈打印到文件中,然后利用上述的十六进制thread_id在文件中查找,就可以看该线程的CPU都消耗在哪里了。
    通过抓堆栈发现,那些占用CPU比例过高的线程都是http处理线程:要不就是在等待请求到来;要不就是在处理一个JSON字符串——String responseContent = JSON.toJSONString(retResponse);,然后我们把这个retResponse打印出来一看,NND,这个对象得有1kb大小,好的,那就是这个东西占用了大量的CPU时间!

  11. 在性能问题上,有两个低级问题首先要排除:(1)大对象的json序列化;(2)日志级别要调到warn级别,不能在debug级别上进行压测。

  12. 最新的版本:fastjson 1.2.11版本,据说性能比1.1有了很大提升,建议升级。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
11天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
40 11
|
21天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
59 7
|
3天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
26天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
47 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
21天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
29天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
37 6
|
1月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
48 3
|
1月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
1月前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
58 6
|
1月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
74 4