
web
synsdeng
不忘初心,方得始终
展开
-
Java集合Map
Map是Java里很常用的一个集合类型,用于存储键值对,其中每个键映射到一个值。常用的实现有:HashMap、TreeMap、ConcurrentHashMap、LinkedHashMap等,下面分别介绍它们的实现原理(本文基于JDK8)。 HashMap HashMap应该是用的最多的一个通用Map实现,它是非线程安全,遍历无序的。它最重要的一个成员变量为:Node[]t原创 2017-08-17 16:47:29 · 372 阅读 · 0 评论 -
Eclipse中Maven工程间循环引用错误
如果我们的项目包含多个工程(project),而它们之间又是循环引用的关系,那么Eclipse在编译时会抛出如下一个错误信息: “A cycle was detected in the build path of project: XXX” 解决方法非常简单: Eclipse Menu -> Window -> Preferences… -> Java -> Compiler -> Buildin转载 2017-11-15 15:48:48 · 1361 阅读 · 0 评论 -
MyBatis分页时foreach异常
MyBatis使用分页插件时并且查询条件包含foreach时,分页插件在执行count语句时会抛出异常,报参数为空异常。项目中使用到了MyBatisPlus,分页也是用的它的PaginationInterceptor,项目中的版本为1.3.6。分页插件会新增一个COUNT的SQL,并复制原BoundSql对象,然后使用DefaultParameterHandler.setParameters给CO原创 2017-11-17 14:43:31 · 2654 阅读 · 1 评论 -
基于同步器的合并接口实现
在上篇《高并发下合并接口请求》中是简单的基于计数器来实现,每个线程都会以一定的时间(10毫秒)间隔检查是否有接口返回。其中的延时可以把间隔设置的非常小,但所有线程的调度还是有些浪费CPU资源。近两天看Tomcat源码时无意发现了一个叫AbstractQueuedSynchronizer的同步器,这个是JDK并发包下提供的工具类,如著名的ReentrantLock就是基于此实现。 A原创 2017-09-01 23:12:46 · 792 阅读 · 0 评论 -
Tomcat如何处理一个请求
Connector(也称为通道或连接器),Tomcat中用于处理请求与响应的组件,接受来自客户端的请求并将请求转交给Engine处理,同时将来自Engine的答复返回给客户端,Connector主要负责处理与客户端的通信。Connector的核心是ProtocolHandler,ProtocolHandler的实现类分为HTTP及AJP两种。HTTP顾名思义就是处理HTTP协议的(HTTP/1.1原创 2017-09-23 17:28:52 · 1257 阅读 · 0 评论 -
高并发下合并接口请求
在有一次对商品详情页进行压力测试时,因为商详页的数据来源非常多,经过的服务多,调用链很长,所以查询数据库的次数也就非常多,数据库连接池很快就被用光,导致很多请求被阻塞,也导致应用整体线程数非常高。虽然通过增加数据库连接池大小可以缓解问题,并且可以通过压力测试,但这治标不治本。商详页中有很多查询已经做了缓存,但还是有些如促销、(活动)价格、库存等是不能缓存(或是不能缓存太长时间)。原创 2017-08-29 17:15:35 · 8036 阅读 · 0 评论 -
ThreadLocal & InheritableThreadLocal
ThreadLocal这个类给线程提供了一个本地变量,这个变量是该线程自己拥有,各线程间不共享。在该线程存活和ThreadLocal实例能访问的时候,保存了对这个变量副本的引用。当线程消失的时候,所有的本地实例都会被GC。并且建议ThreadLocal最好是使用 private static 修饰。 每个线程Thread里面都各有一个类似MAP的成员变量(变量名为threadLoc原创 2017-09-06 11:34:09 · 1469 阅读 · 1 评论 -
Nginx最大处理连接数
记录一次最近公司SEO优化压测,以前所有页面上的数据都是通过JS获取的,这样会有一个问题,就是SEO不友好,所以就增加了一层Node,接口请求放在了Node里,通过Node渲染页面后返回给浏览器。因为是一次比较大的改版,所以在测试环境进行了一次性能压测,当然测试环境机器有限,是按比例缩小进行压力测试。中间出现了几个问题,印象最深刻的就是Nginx最大连接数了。最开始因为对Nginx高性能的信任,所原创 2017-08-25 12:46:21 · 46866 阅读 · 1 评论 -
当浏览器访问一个链接时计算机都做了哪些事
当往浏览器地址栏输入一串地址敲下回车键,浏览器就会给我们展示出一个可视化的页面。看似很简单的操作,但背后凝聚了多年来IT人员的辛苦耕耘。我上家公司里经常喜欢拿这个问题来当作面试题,现在我是没有这个当面试官的机会了。 一次请求大致过程包括:域名解析--> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求--> 浏览器得到html代码 --原创 2017-08-11 13:21:07 · 4920 阅读 · 0 评论 -
Could not initialize class net.sf.cglib.beans.BeanCopier
使用BeanCopier做对象拷贝时,出现 java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.beans.BeanCopier 异常,但项目中是有该类的。 Cglib依赖了Asm,后来发现项目中存在两个Asm的Jar包,按理来说Maven项目只会存在一个版本。该项目做了一个框架升原创 2017-11-15 20:59:32 · 8137 阅读 · 2 评论