【SpringMvc】后台系统超大报表下载超时的处理

2017-10-20
阅读 5 分钟
11.9k
B端业务经常要提供下载报表的功能,一般的方法是先查询出所有数据,然后在内存中组装成报表(如XLS/XLSX格式)后统一输出。但是如果生成报表需要查询的数据量很大,远程服务的调用时间之和远远超过了链路上某节点(比如代理服务器Nginx、浏览器Chrome)的等待时间,因此该次Http连接就会被强制关闭,导致下载失败。

【Spring】一次线上@Transational事务注解未生效的原因探究

2017-10-09
阅读 3 分钟
13.8k
现象描述 上周同事发现其基于mySql实现的分布式锁的线上代码存在问题,代码简化如下: {代码...} 实际执行test()后发现doInside()的Sql执行过程没有被Spring Transaction Manager管理起来。 发现的两个问题 在一个实例方法中调用被@Transactional注解标记的另一个方法,且两个方法都属于同一个类时,事务不会生效。 调用...

【效率专精系列】我有一个梦想:提高开发效率,晚上回家吃鸡

2017-09-21
阅读 2 分钟
4k
之前零零散散写了几篇文章,主要是实际开发过程中一些效率痛点和相应的改善方法。今天抽空温故知新,把之前的内容串起来,做了个小总结,即《效率专精系列》小系列的总集篇。

【效率专精系列】Beta环境不需要,本地联调拯救开发效率

2017-09-18
阅读 3 分钟
3.9k
beta环境下的部署时间较长。首先部署beta需要经过push分支、合并冲突、build、部署四个步骤。在不考虑分支冲突的情况下,由于白天CI服务器压力较大,以商户后台应用为例,build耗时约1-2min,部署耗时约3-5min。本地的build则相对快得多,冷部署时间则和beta服务器差不多。

【效率专精系列】几种常见的JVM热部署技术及实现难点浅谈

2017-09-14
阅读 3 分钟
12.1k
开发、自测、联调期间代码可能会被频繁地修改,通常即使只增加了一行代码,都需要重启容器以检查执行效果。而热部署技术能够帮助开发人员减少重新部署的等待时间。本文的目的为调研热部署的技术现状及其对开发效率的帮助,并简单梳理其技术实现的难点。

【效率专精系列】善用插件提升MyBatis开发效率

2017-09-04
阅读 3 分钟
18.8k
团队使用Mybatis作为数据库访问框架。不同于Hibernate这种采用经典面向对象思想设计的ORM框架,Mybatis是面向过程的,它只做了过程到SQL语句的映射。两者的性能在绝大多数场景下是差不多的,因此理论上可以互相替代使用。由于Mybatis可以直接控制底层SQL,因此对于码农来说,学习成本更低、优化起来更容易;不过也带来了...

5分钟搞定Swagger2环境配置与使用

2017-08-29
阅读 4 分钟
38.1k
Maven配置 在pom.xml中加入依赖 {代码...} 与SpringMvc集成 增加JavaConfig配置文件 {代码...} 如果Spring MVC代理了根路径(\)的url,在spring-mvc.xml增加配置项。 {代码...} 启动Tomat,通过localhost:8080/swagger-ui.html访问Swagger-UI。 Maven插件生成API描述文档(json格式) {代码...} 执行mvn complie,在设置...

【效率专精系列】善用API统一描述语言提升RestAPI开发效率

2017-08-29
阅读 8 分钟
10.4k
团队内部RestAPI开发采用设计驱动开发的模式,即使用API设计文档解耦前端和后端的开发过程,双方只在联调与测试时耦合。在实际开发和与前端合作的过程中,受限于众多因素的影响,开发效率还有进一步提高的空间。本文的目的是优化工具链支持,减少一部分重复和枯燥的劳动。

【SpringMVC】浅谈Convert/Format机制与HttpMessageConverter的关系

2017-07-27
阅读 2 分钟
8.9k
Spring3引入了较Spring2的PropertyEditor更加强大、通用的Convert/Format SPI,Convert SPI可以实现任意类型的转换;Format SPI支持国际化,并在前者的基础上实现了String与任意类型的转换。这两类SPI属于spring-core,被整个spring-framework共享,是一种通用的类型转换器。

【SpringMVC】从Fastjson迁移到Jackson,以及对技术选型的反思

2017-07-27
阅读 7 分钟
15.3k
直接原因是fastjson无法支持注解形式的自定义序列化和反序列化,虽然其Github上的Wiki上说明是支持的。但是实测结果表明:Test类的序列化被fastjson的ASMFactory生成字节码形式的序列化类代理,序列化的逻辑依然为原生而不是自定义的XXX.class。

【SpringMVC】与权限拦截器冲突导致的Cors跨域设置失效问题

2017-07-25
阅读 4 分钟
27.3k
前端域名FE.com向后端域名BE.com分别请求访问优惠券的列表和提交新增的优惠券,API设计所用的Method分别为Get和Post,结果为前一次访问成功而后一次访问失败。这两次请求都是跨域请求,其中请求1包含一个Get请求,请求2本应该包含一个Options请求和一个Post请求,但是只发生了Options请求。

【胡言乱语】开发工程师如何在互联网公司的业务流水线上打造核心竞争力?

2017-07-04
阅读 3 分钟
2.3k
"以技术安身立命",自从就读软件工程以来,就曾是我一直追求的目标,我相信这也是很多软件人的目标;只是参加业务开发后的种种让我觉得这个信条在(大部分)业务开发中,都只是一个天真的幻想,打造"技术专家"不仅缺乏养成的环境,也缺乏使用的机会.

【Java】jdk1.8集合类特性综述及横向比较

2017-07-04
阅读 4 分钟
3.4k
前置知识: Java基础 集合类基础(jdk1.8) Map(字典) 该接口不基于Collection HashMap/LinkedHashMap/TreeMap比较 HashMap LinkedHashMap TreeMap 继承 父接口 Map Map NavigableMap1 父类 AbstractMap HashMap AbstractMap 数据存储 底层结构 数组+(链表/红黑树) 同HashMap+双向链表 红黑树 复杂度 插入 O(1) 同HashMap O...

【Java】类的循环初始化是否会引起死锁?

2017-07-04
阅读 4 分钟
3.2k
前置知识: 类的生命周期 场景设计和推测 情况: 在类A中的初始化中实例化B 在类B的初始化中实例化A 类设计 A类: 静态变量a=new B();静态变量a1=1(之后在静态初始化块里赋值为2); 实例变量a2=11(之后再初始化块中赋值为12); 构造函数; B类: 静态变量b=new A();静态变量b1=3(之后在静态初始化块里赋值为4); 实例变量b2=21(...

【Java】类的生命周期简述

2017-07-04
阅读 2 分钟
2.6k
在进入正文前,首先根据上面的例子试图猜测:为了Main类中的main()函数能够运行,JVM需要做哪些前置工作呢?这些工作是以什么顺序展开的呢?为了更好的描述多个类的情形,可以先试图描述一个更简单的例子:把行1和行2和行3注释掉.

【Java】白话编译器对List<? extend T>和List<? super T>类型实例的add()和get()操作限制

2017-07-04
阅读 2 分钟
13.8k
如果你不懂,可以不看的问题背景:Java编译器会阻止对声明类型为List<? extend T>的集合的add操作;会阻止对声明类型为List<? super T>的集合的get操作。会有类似add(capture<? extend T>) can not be applied to T的错误提示为什么编译器要这么做?

【Spring】BeanUtils.copyPorperties()的IllegalArgumentException原因分析

2017-07-04
阅读 2 分钟
2.4k
在使用ORM框架读取数据库表记录时,为了把PO(Persist Object)转换成BO(Business Object),由于PO和BO中的字段绝大多数情况下高度重合,因此copyProperties()也是经常使用的函数,但是如果使用不当就会抛出Exception

【Spring】白话IoC及容器的初始化

2017-07-04
阅读 5 分钟
2.8k
IoC(Invert Of Control,控制反转)的概念其实出现的蛮早的,但是由于概念枯燥难懂所以被接受的程度一直不高,老头子灵机一动,为亲儿子Spring重新起了一个名字DI(Dependency Inject,依赖注入)后,总算有人请他出山了。