专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

SpringBoot性能太差?试试这几招

  今天这篇文章介绍七种常见的SpringBoot性能优化方向。1。异步执行
  实现方式二种:使用异步注解Aysnc、启动类:添加EnableAsync注解。JDK8本身有一个非常好用的Future类CompletableFuture。AllArgsConstructorpublicclassAskThreadimplementsRunnable{privateCompletableFutureIntegerrenull;publicvoidrun(){intmyRe0;try{myRere。get()re。get();}catch(Exceptione){e。printStackTrace();}System。out。println(myRe);}publicstaticvoidmain(String〔〕args)throwsInterruptedException{finalCompletableFutureIntegerfuturenewCompletableFuture();newThread(newAskThread(future))。start();模拟长时间的计算过程Thread。sleep(1000);告知完成结果future。complete(60);}}
  在该示例中,启动一个线程,此时AskThread对象还没有拿到它需要的数据,执行到myRere。get()re。get()会阻塞。
  我们用休眠1秒来模拟一个长时间的计算过程,并将计算结果告诉future执行结果,AskThread线程将会继续执行。publicclassCalc{publicstaticIntegercalc(Integerpara){try{模拟一个长时间的执行Thread。sleep(1000);}catch(InterruptedExceptione){e。printStackTrace();}returnparapara;}publicstaticvoidmain(String〔〕args)throwsExecutionException,InterruptedException{finalCompletableFutureVoidfutureCompletableFuture。supplyAsync(()calc(50))。thenApply((i)Integer。toString(i))。thenApply((str)str)。thenAccept(System。out::println);future。get();}}
  CompletableFuture。supplyAsync方法构造一个CompletableFuture实例,在supplyAsync()方法中,它会在一个新线程中,执行传入的参数。
  在这里它会执行calc()方法,这个方法可能是比较慢的,但这并不影响CompletableFuture实例的构造速度,supplyAsync()会立即返回。
  而返回的CompletableFuture实例就可以作为这次调用的契约,在将来任何场合,用于获得最终的计算结果。
  supplyAsync用于提供返回值的情况,CompletableFuture还有一个不需要返回值的异步调用方法runAsync(Runnablerunnable),一般我们在优化Controller时,使用这个方法比较多。
  这两个方法如果在不指定线程池的情况下,都是在ForkJoinPool。common线程池中执行,而这个线程池中的所有线程都是Daemon(守护)线程,所以,当主线程结束时,这些线程无论执行完毕都会退出系统。
  核心代码:CompletableFuture。runAsync(()this。afterBetProcessor(betRequest,betDetailResult,appUser,id));
  异步调用使用Callable来实现:RestControllerpublicclassHelloController{privatestaticfinalLoggerloggerLoggerFactory。getLogger(HelloController。class);AutowiredprivateHelloServicehello;GetMapping(helloworld)publicStringhelloWorldController(){returnhello。sayHello();}异步调用restful当controller返回值是Callable的时候,springmvc就会启动一个线程将Callable交给TaskExecutor去处理然后DispatcherServlet还有所有的spring拦截器都退出主线程,然后把response保持打开的状态当Callable执行结束之后,springmvc就会重新启动分配一个request请求,然后DispatcherServlet就重新调用和处理Callable异步执行的返回结果,然后返回视图returnGetMapping(hello)publicCallableStringhelloController(){logger。info(Thread。currentThread()。getName()进入helloController方法);CallableStringcallablenewCallableString(){OverridepublicStringcall()throwsException{logger。info(Thread。currentThread()。getName()进入call方法);Stringsayhello。sayHello();logger。info(Thread。currentThread()。getName()从helloService方法返回);returnsay;}};logger。info(Thread。currentThread()。getName()从helloController方法返回);returncallable;}}
  异步调用的方式WebAsyncTask:RestControllerpublicclassHelloController{privatestaticfinalLoggerloggerLoggerFactory。getLogger(HelloController。class);AutowiredprivateHelloServicehello;带超时时间的异步请求通过WebAsyncTask自定义客户端超时间returnGetMapping(world)publicWebAsyncTaskStringworldController(){logger。info(Thread。currentThread()。getName()进入helloController方法);3s钟没返回,则认为超时WebAsyncTaskStringwebAsyncTasknewWebAsyncTask(3000,newCallableString(){OverridepublicStringcall()throwsException{logger。info(Thread。currentThread()。getName()进入call方法);Stringsayhello。sayHello();logger。info(Thread。currentThread()。getName()从helloService方法返回);returnsay;}});logger。info(Thread。currentThread()。getName()从helloController方法返回);webAsyncTask。onCompletion(newRunnable(){Overridepublicvoidrun(){logger。info(Thread。currentThread()。getName()执行完毕);}});webAsyncTask。onTimeout(newCallableString(){OverridepublicStringcall()throwsException{logger。info(Thread。currentThread()。getName()onTimeout);超时的时候,直接抛异常,让外层统一处理超时异常thrownewTimeoutException(调用超时);}});returnwebAsyncTask;}异步调用,异常处理,详细的处理流程见MyExceptionHandler类returnGetMapping(exception)publicWebAsyncTaskStringexceptionController(){logger。info(Thread。currentThread()。getName()进入helloController方法);CallableStringcallablenewCallableString(){OverridepublicStringcall()throwsException{logger。info(Thread。currentThread()。getName()进入call方法);thrownewTimeoutException(调用超时!);}};logger。info(Thread。currentThread()。getName()从helloController方法返回);returnnewWebAsyncTask(20000,callable);}}2。增加内嵌Tomcat的最大连接数
  代码如下:ConfigurationpublicclassTomcatConfig{BeanpublicConfigurableServletWebServerFactorywebServerFactory(){TomcatServletWebServerFactorytomcatFactorynewTomcatServletWebServerFactory();tomcatFactory。addConnectorCustomizers(newMyTomcatConnectorCustomizer());tomcatFactory。setPort(8005);tomcatFactory。setContextPath(apig);returntomcatFactory;}classMyTomcatConnectorCustomizerimplementsTomcatConnectorCustomizer{publicvoidcustomize(Connectorconnector){Http11NioProtocolprotocol(Http11NioProtocol)connector。getProtocolHandler();设置最大连接数protocol。setMaxConnections(20000);设置最大线程数protocol。setMaxThreads(2000);protocol。setConnectionTimeout(30000);}}}3。使用ComponentScan()
  使用ComponentScan()定位扫包比SpringBootApplication扫包更快。4。默认Tomcat容器改为Undertow
  默认Tomcat容器改为Undertow(Jboss下的服务器,Tomcat吞吐量5000,Undertow吞吐量8000)exclusionsexclusiongroupIdorg。springframework。bootgroupIdspringbootstartertomcatartifactIdexclusionexclusions
  改为:dependencygroupIdorg。springframework。bootgroupIdspringbootstarterundertowartifactIddependency5。使用BufferedWriter进行缓冲
  这里不给大家举例,可自行尝试。6。Deferred方式实现异步调用
  代码如下:RestControllerpublicclassAsyncDeferredController{privatefinalLoggerloggerLoggerFactory。getLogger(this。getClass());privatefinalLongTimeTasktaskService;AutowiredpublicAsyncDeferredController(LongTimeTasktaskService){this。taskServicetaskService;}GetMapping(deferred)publicDeferredResultStringexecuteSlowTask(){logger。info(Thread。currentThread()。getName()进入executeSlowTask方法);DeferredResultStringdeferredResultnewDeferredResult();调用长时间执行任务taskService。execute(deferredResult);当长时间任务中使用deferred。setResult(world);这个方法时,会从长时间任务中返回,继续controller里面的流程logger。info(Thread。currentThread()。getName()从executeSlowTask方法返回);超时的回调方法deferredResult。onTimeout(newRunnable(){Overridepublicvoidrun(){logger。info(Thread。currentThread()。getName()onTimeout);返回超时信息deferredResult。setErrorResult(timeout!);}});处理完成的回调方法,无论是超时还是处理成功,都会进入这个回调方法deferredResult。onCompletion(newRunnable(){Overridepublicvoidrun(){logger。info(Thread。currentThread()。getName()onCompletion);}});returndeferredResult;}}7。异步调用可以使用AsyncHandlerInterceptor进行拦截
  代码如下:ComponentpublicclassMyAsyncHandlerInterceptorimplementsAsyncHandlerInterceptor{privatestaticfinalLoggerloggerLoggerFactory。getLogger(MyAsyncHandlerInterceptor。class);OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{returntrue;}OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{HandlerMethodhandlerMethod(HandlerMethod)handler;logger。info(Thread。currentThread()。getName()服务调用完成,返回结果给客户端);}OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{if(null!ex){System。out。println(发生异常:ex。getMessage());}}OverridepublicvoidafterConcurrentHandlingStarted(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{拦截之后,重新写回数据,将原来的helloworld换成如下字符串Stringrespmynameischhliu!;response。setContentLength(resp。length());response。getOutputStream()。write(resp。getBytes());logger。info(Thread。currentThread()。getName()进入afterConcurrentHandlingStarted方法);}}

我的知青岁月后记四年的知青岁月,在我76年的人生路上,仅占5。26,然而它的份量却是极重的,因为它改变了我的人生。1968年奔向农村时,我是一个背着沉重家庭包袱看不见前程的懵懂学生1972年回城时每天进步一点点,离实现心目中的目标就会越来越近的进步意味着觉醒开悟。在自己没有觉醒开悟的那段日子,那真的是度日如年手足无措啊。只有经历过那段刻骨铭心的难忘的时刻的人,才会深有感触的。那既然自己已经觉醒开悟了,就不能够再像从前那样真正高明的人,从不拘泥于一隅生活有五味,味味动心扉。午间憩息,阳光洒进床头。慵懒书自落,自然入梦中。醒后,阳光依然,却看见落叶飘飞,思想便有了灵动。拾书再读明代禅师所写山居诗世界光如水月,身心皎若琉璃。但见冰他心中拔地而起的长安梦有很长一段时间,曾贇零都觉得周遭的一切是静止的,萧萧百层细沙,一轮残阳似血,冰冷却有序的钢架,他看着,问着,记录着,映着火红的晚霞,他好似已经看见了南京长安新基地建成的那一副画面。余华写尽了现实,写尽了人性1好好生活的前提是,首先别委屈了自己2纵有万贯家产在手,不如有一薄技在身。3一杯水,你渴的时候,它贵如黄金,不渴的时候,觉得寡然无味。一个人,你想爱的时候,不离不弃,不爱的时候,却青苔(散文)世间万物,多高大俊秀。唯青苔细小,微弱,隐忍,多生于荫敝角落处,不哗众,不取宠,默然于世。青苔是时光的吻痕,岁月的精华。巍巍高山之巅,风冽冽如刀割。山石的缝隙里,背荫面,荆棘的扎根散文丨尝试修炼快乐的状态尝试修炼快乐的状态文周长行笔者这几年比较热衷于谈快乐,仅写作发表的文章至少有五六篇,如扛起快乐的大旗开心就写冬至可以不快乐祝您快乐之后刘姥姥逗笑当快乐段子滚滚而来的时候做喜欢的自己老百姓才是微信真正的老板微信真正的老板是谁从产品开发的角度来看,微信是张小龙一手研发出来的,应该算是微信之父了。从对微信的掌控来说,微信背后的企业是腾讯,而腾讯的CEO是马化腾,是腾讯创始人最大个人股东,骁龙8Gen2在小米13系列,荣耀magic5系和三星GalaxyS23系出现据官方报道,骁龙将在11月14日到17日举行骁龙发布会(高通骁龙峰会),其中高通骁龙峰会会发布新一代安卓高通骁龙旗舰芯片高通骁龙8Gen2。根据报道,疑似荣耀magic5系列和小米收起你的小白鞋,今年秋天流行齐踝靴,158小个子女生也能穿秋天都已经过了快一半了,难道你还在穿普通的小白鞋吗?小白鞋虽然好穿,但是看上去确实有些单调了,穿久之后大家也想要能够尝试一些其他的鞋子,所以今年推荐你可以给自己入手一双时髦的齐踝靴美丽优雅的显身材瘦身牛仔裤美女牛仔裤美女说到牛仔裤,有时候我也会替它感到委屈,因为太过熟悉,我们经常会忽略它的存在。但当我们仔细盘点时,无论度过春夏秋冬,还是走过东南西北,都不曾缺席它的身影。手拿小包包随着人们
NASA韦伯望远镜正参与调查太阳系最奇怪的天体之一带环小行星使用美国宇航局新的詹姆斯韦伯太空望远镜的科学家们说,他们已经能够更近距离地观察一颗小行星,它也是我们太阳系中被发现的第五个环状系统(其他环状系统包括土星木星天王星和海王星)。天文学小行星擦过地球有惊无险美国国家航空航天局NASA说,几天前突然从宇宙黑暗中出现一辆卡车大的小行星进入地球视线,并于1月2627日从地球身边掠过,没有造成任何损害。法新社发自洛杉矶的报道说,与在好莱坞电影中国重型运载火箭发展瞄准最优最强重型运载火箭是载人航天和深空探测的重要运输工具,也是航天强国的标配。如今,极少数航天强国都在积极拓展重型运载火箭,以期在日益激烈竞争的航天博弈中拔得头筹并最终服务于人类科技进步。历在一加11手机发布后,前代一加10Pro是否更具性价比?请您不要忘了点赞关注收藏支持。我是尼古拉斯lalala,带来更多有趣的物件随着一加11的发布,前代的一加数字系列一加10Pro也迎来了降价优惠。从最初发布时的12GB256GB售价三星推出GalaxyWatch5GolfEdition内置高尔夫表盘近日消息,三星在英国推出了GalaxyWatch5GolfEdition绿色限量版,专为高尔夫球选手设计,在硬件方面和三星GalaxyWatch5智能手表是相同的,但是会配备与高尔Intel正在准备新的Arc显卡驱动,让显卡获得更好的性能Intel目前Arc显卡目前最大的问题其实不在硬件规格上,而是驱动,他们的显卡团队也承认了这问题,Arc显卡的驱动从一开始就有问题,虽然Intel的核显已经存在相当长的时间,但对于13700ES从1500元涨价到2200元?13代ES处理器价格混乱I9有性价比经历了23年春节过后,INTEL13代ES处理器的价格已经开始发生混乱,有些情况还是很有意思的1,13700ESQ0L5在15001600元的价格段遭疯抢,如今已经涨价到最高220英特尔的2022产品口碑回涨,却难挡业绩下滑对整个电脑行业来说,2022年的冬天显得有些过于寒冷。混乱和不确定,成为了过去一年整个电脑行业的主旋律。矿潮骤然退去,但留下的矿卡却依然在对市场进行冲击虽然新一代处理器性能提升不小盘点搭载四曲面屏幕的手机,共11款1华为P40Pro搭载麒麟9905GSoC旗舰芯片,7nmEUV制程工艺,103亿颗晶体管,CPU三档能效架构,性能与能效皆大幅提升,大型文件处理手到擒来,各类计算任务游刃有余正面元宵节海报文案合集,提前供大家参考!华灯照团圆,共渡幸福年。元宵节海报灵感合集,已经提前为大家备好了,转给有需要的你家居家电行业三雄极光照明以灯祈福,每一刻皆盼团圆。小米手机上元良宵,美美与共。小米手机用完美品质陪你荣耀用力太猛,发布仅一个月跌至3099元,16GB256GB5400万8GB运行内存手机的用户占比率是最高的,因为如今市面上绝大多数安卓手机都标配的是8GB运存,但这并不意味着8GB运存内存就已经够用了,要知道这一内存规格早在五年多之前就已经开始普及
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网