自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 MyBatis分页时foreach异常

MyBatis使用分页插件时并且查询条件包含foreach时,分页插件在执行count语句时会抛出异常,报参数为空异常。项目中使用到了MyBatisPlus,分页也是用的它的PaginationInterceptor,项目中的版本为1.3.6。分页插件会新增一个COUNT的SQL,并复制原BoundSql对象,然后使用DefaultParameterHandler.setParameters给CO

2017-11-17 14:43:31 2524 1

原创 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 7518 2

转载 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 1303

原创 Spring MVC(一)

在SpringBoot中MVC初始化主要由DispatcherServletAutoConfiguration及WebMvcAutoConfiguration完成。DispatcherServletAutoConfiguration会向Spring容器中注册DispatcherServlet,并且使用ServletRegistrationBean动态的把DispatcherServlet添加到Se

2017-11-11 14:58:26 330

原创 SpringCloud之Ribbon(二)

SpringClientFactory是Feign和Ribbon关联的纽带,具体可参见FeignRibbonClientAutoConfiguration。SpringClientFactory实例化IRule、IPing、ServerList、ILoadBalancer时默认是以PropertiesFactory中的Bean定义优先,PropertiesFactory和SpringClientF

2017-11-04 23:03:00 554

原创 SpringCloud之Ribbon(一)

在SpringCloud中Feign作为restful客户端,Eureka作为服务注册中心。Ribbon在Feign与Eureka之间充当中介,为客户端提供软件负载均衡算法。在Ribbon这一层中可以实现一个所谓的智能路由。            Ribbon是在Eureka之后初始化,Configuration类为RibbonAutoConfiguration。里面有如SpringClien

2017-11-01 19:53:44 1706

原创 SpringCloud之Feign(二)

FeignClientsConfiguration初始化配置中:默认Encoder类型为SpringEncoder,功能为调用Spring的HttpMessageConverters处理参数。默认Decoder类型为ResponseEntityDecoder,它包装了SpringDecoder,做的事情也就是调用Spring的HttpMessageConverters处理接口返回值。默认Contr

2017-10-28 23:16:36 6739

原创 MyBatisPlus注入公共Sql问题

同事新建项目运行CRUD时发现MyBatis的Mapper找不到对应方法,该方法为AutoMapper中的公共方法。       在此之前做了一次依赖及配置清理,怀疑是否不小心多删除了什么或是版本变化导致出了问题。把该项目还原就不会出现此问题,间接证明了此猜想。但另外一个项目同样的框架环境确是正常,所以肯定不是版本的问题。公司MyBatisPlus的版本是1.x版本,同事之前用的版本是2.x。

2017-10-26 15:30:25 4838

原创 SpringCloud之Feign(一)

Feign是SpringCloud中的HTTP客户端,要使用Feign只需在项目中加入@EnableFeignClients注解即可。查看该注解定义可知它是通过FeignClientsRegistrar类实现扫描并注册feign client。       FeignClientsRegistrar里的registerFeignClients方法通过Spring的ClassPathScanni

2017-10-26 13:35:53 4106

原创 可靠性消息事务实现

本方案基于外部事件表(Mysql)+MQ(ActiveMQ)+SpringCloud方式提供事务型消息发送。此方案并不依赖特定的事件表及MQ,TPS受限时可进行替换。主要应用在事务中包含的重接口、第三方系统调用等,以实现异步化,保证最终一致性。因为是异步调用,所以接口限制为不能有返回值。为了记录完整的调用日志链,整个过程中注意传递请求日志id。       在SpringCloud中远程调用默

2017-10-21 13:09:34 2952

原创 Spring Cache自定义缓存格式

SpringCache是一个基于注解来更新缓存的组件,对于大多数的缓存操作都适用,本质是基于AOP实现,也不用再重复千轮子,直接使用便是,并且支持SpringEL表达式,对于使用教程网上还是很多的。       很多时候为了兼容性以及方便,会把对象转换成JSON格式存入缓存(Redis)中,这就需要对Cache进行拦截,在加入缓存及获取缓存时做一个JSON格式转换。       通过@En

2017-09-30 11:23:52 2124 2

原创 Tomcat如何处理一个请求

Connector(也称为通道或连接器),Tomcat中用于处理请求与响应的组件,接受来自客户端的请求并将请求转交给Engine处理,同时将来自Engine的答复返回给客户端,Connector主要负责处理与客户端的通信。Connector的核心是ProtocolHandler,ProtocolHandler的实现类分为HTTP及AJP两种。HTTP顾名思义就是处理HTTP协议的(HTTP/1.1

2017-09-23 17:28:52 1183

原创 RocketMQ概述

RocketMQ是一个分布式消息中间件,并支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念,如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等。       RocketMQ以Topic来管理不同应用的消息,对于生产者(producer)而言,发送消息时需要指定消息的Topi

2017-09-13 14:52:22 2234 1

原创 基于RocketMQ的推送猜想

RocketMQ是基于Topic的分布消息中间件,一个Topic对应多个ConsumerQueue,消费者消费指定的ConsumerQueue队列,并且消息是通过Pull方式拉取。为每个用户定义一个Topic这种方式不现实,即使为每个用户定义一个queueId也是不切实际的做法。ConsumerQueue本来是处理分布式及负载均衡,但我们可以换种思路,一个用户关联一个queueId,一个queue

2017-09-12 19:07:19 1594

原创 ThreadLocal & InheritableThreadLocal

ThreadLocal这个类给线程提供了一个本地变量,这个变量是该线程自己拥有,各线程间不共享。在该线程存活和ThreadLocal实例能访问的时候,保存了对这个变量副本的引用。当线程消失的时候,所有的本地实例都会被GC。并且建议ThreadLocal最好是使用 private static 修饰。       每个线程Thread里面都各有一个类似MAP的成员变量(变量名为threadLoc

2017-09-06 11:34:09 1388 1

原创 Linux删除(清空)正在运行的应用日志文件内容

在测试环境定位问题时,如果发现日志文件内容太多或太大,有时需要删除该日志,如Tomcat,Nginx日志。以前每次都是先rm -rf ***.log,然后重启应用。直到后来发现了以下命令,原来可以不用重启应用直接清空日志。最简单的方式直接运行以下命令:>file.log    还有其它两种方式,分别为:echo "">file.logcat /dev/null >

2017-09-04 17:36:25 31111 3

原创 基于同步器的合并接口实现

在上篇《高并发下合并接口请求》中是简单的基于计数器来实现,每个线程都会以一定的时间(10毫秒)间隔检查是否有接口返回。其中的延时可以把间隔设置的非常小,但所有线程的调度还是有些浪费CPU资源。近两天看Tomcat源码时无意发现了一个叫AbstractQueuedSynchronizer的同步器,这个是JDK并发包下提供的工具类,如著名的ReentrantLock就是基于此实现。       A

2017-09-01 23:12:46 733

原创 高并发下合并接口请求

在有一次对商品详情页进行压力测试时,因为商详页的数据来源非常多,经过的服务多,调用链很长,所以查询数据库的次数也就非常多,数据库连接池很快就被用光,导致很多请求被阻塞,也导致应用整体线程数非常高。虽然通过增加数据库连接池大小可以缓解问题,并且可以通过压力测试,但这治标不治本。商详页中有很多查询已经做了缓存,但还是有些如促销、(活动)价格、库存等是不能缓存(或是不能缓存太长时间)。       

2017-08-29 17:15:35 7957

原创 日志打印及配置更新

记录日志是项目不可或缺的功能,一般Java用的比较多的是Slf4j、Log4j、Logback等。而且一般的做法都是在类,或父类里调用 LoggerFactory.getLogger(this.getClass())来创建一个Logger。像Controller、Service等还好,只需在父类中定义即可,其它的工具类,帮助类,抽象出来的业务类等就较麻烦,每个类都要这么来一下。

2017-08-27 17:38:01 520

原创 Nginx最大处理连接数

记录一次最近公司SEO优化压测,以前所有页面上的数据都是通过JS获取的,这样会有一个问题,就是SEO不友好,所以就增加了一层Node,接口请求放在了Node里,通过Node渲染页面后返回给浏览器。因为是一次比较大的改版,所以在测试环境进行了一次性能压测,当然测试环境机器有限,是按比例缩小进行压力测试。中间出现了几个问题,印象最深刻的就是Nginx最大连接数了。最开始因为对Nginx高性能的信任,所

2017-08-25 12:46:21 46661 1

原创 Java集合Map

Map是Java里很常用的一个集合类型,用于存储键值对,其中每个键映射到一个值。常用的实现有:HashMap、TreeMap、ConcurrentHashMap、LinkedHashMap等,下面分别介绍它们的实现原理(本文基于JDK8)。 HashMap       HashMap应该是用的最多的一个通用Map实现,它是非线程安全,遍历无序的。它最重要的一个成员变量为:Node[]t

2017-08-17 16:47:29 339

原创 当浏览器访问一个链接时计算机都做了哪些事

当往浏览器地址栏输入一串地址敲下回车键,浏览器就会给我们展示出一个可视化的页面。看似很简单的操作,但背后凝聚了多年来IT人员的辛苦耕耘。我上家公司里经常喜欢拿这个问题来当作面试题,现在我是没有这个当面试官的机会了。       一次请求大致过程包括:域名解析--> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求--> 浏览器得到html代码 --

2017-08-11 13:21:07 4794

原创 Spring 事务原理

事务的管理对于基于数据库的应用程序而言是非常重要的,本文基于Spring Boot来看看Spring是如何管理事务的,本文将从事务的理论、声明式事务配置以及事务管理来展开。       事务的特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性/永久性(Durability)。在同一个事务当中的SQL要么都成功,要么都失败(回滚

2017-03-16 22:13:14 398

原创 Spring Beans实例化

如果说Spring最核心的东西是什么,那就非Beans组件莫属了,Bean对于Spring的意义就象OOP对于Java的意义一样。本文基于Spring Boot1.4x来分析下Spring是如何实例化Bean。我们将会从Bean的定义、创建以及解析几个方面来分析。首先来说说Spring是如何找到并解析Bean属性的。如果使用注解的方式则Spring在启动初始化的时候会扫描项目classpath

2017-03-12 10:25:44 984

原创 Spring启动流程简要分析

本文基于Spring Boot1.4.x所写。Spring Boot伴随Spring4.x发布,可以说是Java Web开发近几年来最有影响力的项目之一,极大的提高了开发效率。据我说知,很多公司新起的项目当中都用起了SpringBoot框架。

2017-02-22 15:57:46 4074 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除