java
文章平均质量分 85
软件开发随心记
这个作者很懒,什么都没留下…
展开
-
事务传播行为Propagation
ClassA更新user1.年龄=11(事务,默认的Propagation.REQUIRED),ClassB更新user1.年龄=12(事务,测试不同的Propagation);ClassA和ClassB构成嵌套事务。通过2个测试程序,回到最开始的问题,项目里的那个方法不存在嵌套事务,因此指定为Propagation.REQUIRES_NEW其实是与Propagation.REQUIRED的效果一致,所以这里可删除掉Propagation.REQUIRES_NEW,避免歧义。原创 2024-04-01 02:00:00 · 1773 阅读 · 0 评论 -
使用Apache Commons Pool2创建Java对象池
相比于其他实现对象池的技术,使用 Commons Pool2 实现对象池的优点是:它提供了完整的对象池管理功能,包括对象的创建、初始化、借用、归还、清理和销毁等操作,并且支持多线程环境下的并发访问和线程安全。此外,Commons Pool2 还具有灵活的配置选项,可以根据具体场景对对象池的性能和资源消耗进行优化。缺点是,使用 Commons Pool2 实现对象池需要引入额外的依赖,增加了项目的复杂性。原创 2023-04-02 19:24:50 · 2231 阅读 · 0 评论 -
MOCK远程API调用的简单实现
MOCK远程API调用的简单实现原创 2022-11-14 00:00:00 · 1180 阅读 · 0 评论 -
反射方法比较:Mehod vs FastMethod vs Javassist
在很多业务场景中,会对拥有相同属性名称的不同对象进行大量的Get、Set方法调用。通常为了能内聚相关的通用业务方法,我们都会创建一些入参为某些相同属性的方法,此时使用反射方式实现是最容易想到的解决方案。本文将对如下几种实现进行比较:java原生的Method、cglib的FastMethod、javassist实现的Invoker。由性能比较最明显可以看出以下几个结论:性能由高到低排列是:原生>Invoker>FastMethod>Method。原创 2022-10-08 00:10:17 · 536 阅读 · 0 评论 -
设计模式之策略模式
策略模式(Strategy)原创 2022-09-13 12:25:55 · 307 阅读 · 0 评论 -
聊聊Excel的大批量导入导出
聊聊Excel的大批量导入导出,看POI和easyexcel各自如何实现原创 2022-09-05 01:37:49 · 3402 阅读 · 1 评论 -
解决一个Mysql的utf8编码导致的问题
解决一个Mysql的utf8编码导致的问题原创 2022-07-30 14:08:14 · 754 阅读 · 1 评论 -
类加载器及双亲委派机制
双亲委派机制原创 2022-06-19 17:24:30 · 356 阅读 · 1 评论 -
@Transational踩坑
踩坑1:@Transational里代码太长@Transational最简单粗暴的使用方法就是在一个public方法上加上该注解,然后开始洋洋洒洒写上几百上千行代码,其中除了DB操作部分代码,也可能包含了接口/方法入参校验、外部系统接口调用、业务逻辑、数据计算、集合转换等逻辑。如此写,理论上是没什么大问题的,但绝大部分情况是到了最后部分才真正执行写DB的操作,此时才需用上@Transational,而在方法一开始就开启事务,很可能存在以下2种情况:程序还未执行到写DB逻辑,就return了,此时@T原创 2021-12-13 09:00:00 · 890 阅读 · 0 评论 -
MyBatis源码简析
MyBatis源码简析Mybatis作为一个经久不衰的ORM框架,其源码被众多人膜拜过,今天简单走一遍。原创 2021-12-08 15:32:13 · 619 阅读 · 0 评论 -
借用Arthas分析maven非包版本冲突导致找不到类问题
背景:微服务应用xxx.jar依赖netty-all-4.1.25Final,项目中使用通信工具async-http-client-2.0.31内置耦合了io.netty的几个同包名同类名的类;Tomcat应用运行时报:java.lang.NoSuchMethodError: io.netty.channel.DefaultChannelId.newInstance()Lio/netty/channel/DefaultChannelId;。But netty-all包中是存在Defa原创 2021-07-18 15:51:30 · 1526 阅读 · 0 评论 -
springboot-plugin极简实践(一)
前言网上看到一句这样的描述:Spring Boot可以说是至少近5年来Spring乃至整个Java社区最有影响力的项目之一,也被人看作是:Java EE开发的颠覆者本人深表同意使用springBoot是一个很容易的事但要基于springBoot的简单理论去搭建自己的整体框架,就需要学习和理解springBoot-Plugin,以它的方式来构建,让自己也能够享受到springBoot的简单和优雅sprintBoot-plugin极简实践实践的价值,一定要简单,且突然核心目标,我这边使用三个工程原创 2021-06-27 23:46:09 · 1785 阅读 · 0 评论 -
使用Guava-retrying优雅地解决异常重试场景
熟悉的重试场景我们在日常系统开发中,经常会遇到使用Http或者RPC调用跨系统应用的场景。由于是跨系统间调用,不可避免地会遇到网络问题或者服务方限流等原因导致的异常,这时我们就需要对失败的调用进行重试,这会引入了一系列的问题:哪些异常需要重试?应该重试多少次?重试的时间间隔是多少?每次重试时间的累加如何设定?超时时间是多少?场景模拟我们使用代码来模拟实际场景,MockService模拟一个远程调用,使用Random随机数模拟返回的请求结果。为了让重试行为更加明显,这里设置了返回随机数[0,原创 2021-06-20 21:38:10 · 2613 阅读 · 2 评论 -
JOOQ登堂未入室
1. JOOQ简介JOOQ,(Java Object Oriented Querying)Java面向对象查询,是一种对象关系映射(Object Relational Mapping)的处理数据库的框架。它是一套基于Java访问关系型数据库的工具包,能够将SQL语言集成到Java中,它具有轻量、简单、并且足够灵活的特点,通过JOOQ我们可以轻松的使用Java面向对象的语法来实现各种复杂的SQL。但它并非完全免费,只是对MySql之类的开源数据库免费。2. 入门实践2.1 准备工作MyS...原创 2021-06-14 23:53:51 · 1934 阅读 · 8 评论 -
Logback原理分析
业务开发中,少不了打印日志,常用的日志框架有commons logging/log4j/logback/log4j2等,同步日志方面logback性能略微胜出,而异步日志方面log4j2性能突出。今天要探讨的主角是logback。SLF4J说到logback,必会提及slf4j。slf4j的全称是:The Simple Logging Facade for Java,是java的一个日志门面,slf4j制定了一套标准接口,从而实现在【日志】这个领域里一统江湖。主要做两件事:实现了Logger获取的通原创 2021-06-07 15:04:37 · 1568 阅读 · 0 评论 -
Java尾递归
一、序言尾调用维基百科在计算机学里,尾调用是指一个函数里的最后一个动作是返回一个函数的调用结果的情形,即最后一步新调用的返回值直接被当前函数的返回结果。此时,该尾部调用位置被称为尾位置。尾调用中有一种重要而特殊的情形叫做尾递归。经过适当处理,尾递归形式的函数的运行效率可以被极大地优化。尾调用原则上都可以通过简化函数调用栈的结构而获得性能优化(称为“尾调用消除”),但是优化尾调用是否方便可行取决于运行环境对此类优化的支持程度如何。尾递归维基百科:若函数在尾位置调用自身(或是一个尾调用本身的其原创 2021-05-19 01:29:07 · 1276 阅读 · 0 评论 -
还原FullGc翻车现场
在上周写Bug工作的某一天某个时刻,系统挂载的几台容器突然随机命中进行重启,10分钟重启一次,每次重启的容器是随机的(请求命中哪一台那一台就xx),排查出来的原因是因为OOM导致FullGc => FullGc期间线程停顿 => 心跳检测失败 => 重启容器。笔者在那之前还没遇到过FullGc的问题,谨以本文还原一下FullGc的过程跟排查定位文章目录1. 触发FullGc的时机2. 制造OOM现场3. 原因分析排查1. 触发FullGc的时机老年代空间不足【对象在新生代到达一.原创 2021-03-28 19:22:58 · 290 阅读 · 0 评论 -
ThreadPoolExecutor杂谈
ThreadPoolExecutor杂谈日常的业务开发中,避免不了使用多线程,而通常我们不会在代码直接去new一个线程(不可控且耗资源),而是借助于线程池。而java原生的线程池中应用最广泛的当属ThreadPoolExecutor原理简述网上有大一堆分析ThreadPoolExecutor 的帖子,包括原理乃至源码,这里简单回顾其大概执行过程,首先看构造函数:public ThreadPoolExecutor(int corePoolSize,原创 2021-03-14 21:36:42 · 207 阅读 · 0 评论 -
ElasticSearch入门实操
中台最近在优化选品业务,希望能给客户提供搜索商品的功能,自然想到了可以快速存储和搜索海量数据的全文搜索引擎—ElasticSearch.目录1.简介2.安装(Win10环境,超级简单,开箱即用)3.基本概念4.入门5.Spring Boot整合ES6.《深入理解Elasticsearch》读书笔记1.简介ElasticSearch是Elastic技术栈中一套分布式、可扩展、实时的搜索与数据分析引擎。Elasticsearch不仅仅只是全文搜索,同时也提供结构化搜索、数据分原创 2021-03-07 21:30:08 · 472 阅读 · 0 评论 -
电子发票中数字签名的提取解析教程
随着电子信息技术的发展与成熟,加上国家的大力推广,电子发票已经开始慢慢取代纸质发票。相比传统的纸质发票,电子发票除了绿色环保,节约成本之外,更重要的是电子发票采取电子签章实现发票签名、电子盖章,具有唯一性、不可抵赖性、防篡改等优点,而且更加容易税务管理。那么,我们平常拿到一张电子发票,应该如何验证它的真伪呢?如何保证它是合法且没有被别人篡改呢?这就需要对电子发票的原理有所了解了。下文将慢慢分析电子发票文件的内部结构,并尝试对电子发票中数字证书及签名进行解析。原创 2021-03-01 00:15:26 · 7283 阅读 · 4 评论 -
start.sping.io代码研读及二次开发
Spring是Java开发者的圣经,https://spring.io官网作为布道场。开发者几乎能在上面找到关于Spring的一切信息,当然也包括官方推荐项目代码规范。其中https://start.spring.io既是官方的手脚架工程,也常被初学者用来生成入门工程。这个站点也是一个开源Spring项目,颇有些自举的骄傲(Git也有这种骄傲)。国内大厂某云平台也发布了定制化版本。相关资源项目列表initializrstart.spring.io官网文档Spring Initi.原创 2021-01-25 02:40:24 · 1727 阅读 · 0 评论 -
浅谈Java虚拟机的监控及诊断工具
1.基本命令的应用1.1 jps(源操作文档)在默认情况下,jps的输出信息包括 Java 进程的进程 ID 以及主类名。我们还可以通过追加参数,来打印额外的信息。如果某 Java 进程关闭了默认开启的UsePerfData参数(即使用参数-XX:-UsePerfData),那么jps命令(以及下面介绍的jstat)将无法探知该 Java 进程。常用的参数:-l :将打印模块名以及包名;-v :将打印传递给 Java 虚拟机的参数(如-XX:+UnlockExperimentalVMOptions原创 2021-01-11 10:18:18 · 280 阅读 · 0 评论 -
聊聊Java中的LinkedList实现原理
前言谈到Java中的List,一般我们使用最多的就是ArrayList。众所周知,ArrayList是使用数组来实现,然而还有另外一种数据结构也能实现List,就是我们熟悉的链表。在Java中对应的就是LinkedList,下面我们就通过分析Java的LinkedList的源码来了解其中的实现。LinkedList的实现LinkedList的定义public class LinkedList<E> extends AbstractSequentialList<E>原创 2020-12-19 00:55:17 · 473 阅读 · 2 评论 -
解构 java class文件格式 - 以HelloWorld为例
本文通过逐个字节解析的方式,彻底解构一段大家耳熟能详的代码(HelloWorld)来一窥JVM虚拟机核心——字节码的“秘密”。原创 2020-11-30 14:43:21 · 567 阅读 · 1 评论 -
使用pegjs解析java代码
使用pegjs解析java代码pegjs是什么pegjs是peg文法的一种实现,peg文法是一种解析表达式文法,其具体的解析公式和常用的正则表达式很像,需要注意的是peg不允许解析存在二义性。pegjs官网 https://pegjs.org/pegjs的作用在正则匹配不能实现或困难时可以选择pegjs来处理解析,如sql语句的解析,在构造dsl时编写自定义规则也非常方便。pegjs的简单应用1.这里以一段java代码的解析为例,准备一段需要解析的java代码class Test { @原创 2020-10-20 00:36:36 · 929 阅读 · 1 评论 -
关于Spring框架应用BeanPostProcessor和BeanFactoryPostProcessor接口导致的注入及事务失效问题
前言:Spring框架是一个以IOC和AOP为核心的业务框架,在使用它时,会因为技术和业务的不断迭代,业务框架本身越来越庞大,对应的技术融合也越来越多,原来可以成功执行的,后面加入一些组件就不无效。例如:使用了BeanPostProcessor或者BeanFactoryPostProcessor的一些用法,导致了BEAN的提 前初始化,随后在一些场景中,导致BEAN的注入无效、Spring的事务不起作用思考:在解决这些问题时,其实当时造成这种问题时,只是为了解决功能,但没有在整体方案上思考一个良好的规原创 2020-09-20 16:06:25 · 1419 阅读 · 0 评论 -
Lucene笔记
背景前段时间完成的会员积分系统,该系统的积分赠送等规则相对复杂,在匹配规制的时候很难精确的筛选出想要的规制,只能在数据库简单的赛选后,再将结果通过程序进行匹配。这种实现方式当规制多的时候命中规制会特别慢。数据库的缺陷传统的关系型数据库是通过索引来达到快速查询的目的,但是在全文搜索的业务场景下,索引很难满足。我们先举个例子看看关系型数据库为什么无法满足全文搜索的要求。ID地址开发商户型面积单价交通周边1地址A万科两房一厅、三房两厅两卫、四房两厅60平、99平、原创 2020-09-13 18:29:28 · 165 阅读 · 0 评论 -
浅谈虚拟机的垃圾回收
最近在极客时间上的《深入拆解Java虚拟机》课堂上学习,所以记录下了学习的笔记,与及对其相关的内容进行思考和拓展。1. 如何辨别一个对象是存是亡?用来辨别的计算方法有两种: 引用计数法与可达性分析。1.1 引用计数法实现方式: 每个对象添加一个引用计数器,用来统计指向该对象的引用个数。一旦某个对象的引用计数器为 0,则说明该对象已经死亡,便可以被回收了。缺点:1.需要额外的空间来存储计数器,以及繁琐的更新操作2.引用计数法还有一个重大的漏洞,那便是无法处理循环引用对象。1.2 可达性分析实原创 2020-08-16 18:11:08 · 644 阅读 · 0 评论 -
初探Java Nashorn脚本引擎
要想让一个程序功能变得灵活起来,那么配置绝对是不可或缺的,通过合理的设计,将所有动态变量都配置化,可以最大程度上让程序变得灵活。可是在某些复杂的业务场景中,仅仅只是变量的配置化,往往还并不能满足需求,尤其是互联网这种业务需要快速更迭的行业。于是,做一个这样的功能:仅仅依靠配置,就能让程序的逻辑cover住所有的业务逻辑变化,就成为了程序员的终极梦想。然而,现实是残酷的,"write once run forevre",这几乎是不可能实现的梦想(如果真的出现了这样的技术,那可能会是我们职业生涯将要面对的最原创 2020-08-10 02:15:30 · 5396 阅读 · 0 评论 -
浅析java对象内存大小
1. 前言java程序运行过程中会生成无数的对象,那对象与类关系是怎么样的?可能有部分同学不是很清楚,本文章会介绍统计对象大小的工具,以及借助HSDB分析对象大小2. 本文收获阅读本文后能得到如下收获类方法数量与类的对象大小无关类的静态字段与类的对象大小无关父类的成员字段会影响子类的大小3. 简单对象大小分析3.1 简单类代码import org.apache.lucene.util.RamUsageEstimator;public class SimpleObject {原创 2020-08-10 00:18:06 · 282 阅读 · 0 评论 -
【浅谈幂等】
幂等概念介绍具体场景解决方案总结 系统在复杂的【网络环境】和【不可控的人为操作因素】下,往往会产生重复操作的场景。为保障【系统整体的健壮】,我们会要求相关操作结果无论受到多少次重复调用,也都返回相同的响应结果。 概念介绍 名词解释:幂等源自于数学,如f(x原创 2020-07-26 23:26:51 · 184 阅读 · 0 评论 -
浅谈Spring AOP的原理和应用
浅谈Spring AOP的原理和应用1.AOP简介Aop(Aspect Oriented Programming)大家应该都知道这是面向切面编程思想,主要能够为我们在不影响原来的功能的前提,为软件横向拓展功能。简单来说,把对象中一些公用的行为抽取出来,减少代码冗余性,还可以将业务代码和系统功能代码分离开。以下,我对Spring AOP进行一系列探讨,(注意:Aop是一种思想,以下主要对Spring Aop技术的探讨的)2.Aop使用的场景1)权限验证2)缓存3)异常统一处理4)日志系统5)信原创 2020-07-11 17:02:41 · 623 阅读 · 0 评论 -
浅析Java方法反射原理
1. 前言1.1 目标 java程序员日常开发经常使用到反射技术,所以本文就是要讲解一下java的方法反射,让大家更好了解反射的性能.1.2 读者收获2. 代码示例2.1 示例代码public class ReflectionTest { public static int count =0; public void test(){ new Exception((count++)+" : print stackTrace ").printStackTrace()原创 2020-07-05 21:42:05 · 544 阅读 · 0 评论 -
Mockito的使用及原理浅析
Mockito的使用及原理浅析在微服务横行的年代,一个服务可能依赖了若干个其它服务,而这些被依赖的服务,又极可能依赖了别的服务,于是构成了一个复杂的依赖链。而日常开发中,经常会苦恼于某某上游接口没数据而所使得UT达不到预期的目标,所兴现在已经有了多种Mock Toolkit,很好的解决了这一痛点。比较常用的有EasyMock,JMockit,Mockito,PowerMock等,而本文主要介绍Mockito的简单使用,并对其实现原理进行简单分析Mockito的使用通常情况下,我们会在UT里使用@Moc原创 2020-06-26 21:54:14 · 2956 阅读 · 0 评论 -
用java编写基于selenium的方式抓取豆瓣读书书籍内容
用java编写基于selenium的方式爬取豆瓣读书书籍内容爬虫的早期感想处理思路顺序需求选型实践源代码selenium设计模式访问入口爬虫的早期感想很久以前,生活中使用c#和java分别写过网页游戏外挂,通过语言中内置的浏览器控件进行爬取数据,并发送新的指令,非常有意思,既能研究爬虫相关技术又能实践在休闲生活中。后面也有在工作中,定时爬取中国天气预报官方信息,提供给前端主页显示天气信息。处理思路顺序需求有朋友需要帮忙收集豆瓣读书中的书籍信息,根据传入的书丛地址,获取书丛中的书籍的信息、封原创 2020-06-21 08:20:02 · 1098 阅读 · 2 评论 -
【技术视野】窥探CI/CD
技术视野之窥探CI/CD前言:闲聊我司持续集成的业界产品万变不离其宗进入主题:jenkins提供了什么jenkins的基础使用(demo)扩展结语:前言:互联网时代的软件交付周期有别于传统软件行业,快与变及其关键的两个关键词。如若采取老旧的shell人工构建、人工推包、折腾环境进行运维的方式,必将加大每次提测与交付的成本,CI/CD的概念产生即是为了解决此技术痛点。CI/CD持续交付,快速试错,为实现devOps的目标提供了关键的一环。闲聊我司在这里我必须先赞一波我司的基础架构产品,两年前刚进来的时原创 2020-05-10 15:40:01 · 689 阅读 · 0 评论 -
浅谈高性能的Netty
文章目录1.什么是Netty?2.Netty的特点?2.1零拷贝2.1.1系统层面的零拷贝2.1.2Netty中的零拷贝2.2 Netty的线程模型3.Netty能做什么?4.Echo Server实战服务端两个类:客户端两个类:5.结语1.什么是Netty?笔者最近在业余时间正好在看netty的一个课程,感觉netty挺有意思的,和我们熟悉的spring mvc那一套有点不一样,而他也是挺主...原创 2019-12-15 22:34:05 · 466 阅读 · 0 评论 -
kafka简介
一言蔽之kafka诞生于LinkedIn,是其贡献的分布式高性能消息引擎服务【MQ】(如今其定位为一个分布式流处理平台)消息引擎系统消息引擎系统EMS:企业以一套标准消息规范屏蔽不同系统的差异,传递准确语义消息。设计因素:消息设计:结构 xml、json、file、binary传输协议:http、rpc、binary消息引擎范式消息队列:点对点发布订阅:一...原创 2019-11-17 15:49:53 · 214 阅读 · 0 评论 -
图解Java服务端Socket建立原理
1.前言 市面上有关于java的socket教程,但几乎都是把java的socket代码罗列一下,并没有跟读者详细说明清楚为什么要这么写,这么写,每一步背的原理是什么.所以本文目标是想通过一份java Server Socket的实现,一步步解析拆解,带大家理解服务端Socket建立的过程原理.2.代码示例public class MultiThreadServer implemen...原创 2019-11-10 15:53:07 · 3545 阅读 · 2 评论 -
程序猿回到过去:红花会与布隆过滤器
这是一个台风夜,雨还在下,敲着窗户,叮叮当当。阿智终于写完最后一行代码,合上了笔记本电脑。他看了看时钟,23点56分,他笑着说了一声“今天好早啊”。阿智还没有女朋友,自从做了一名程序猿,每天晚上都是机械键盘的响声陪着他到深夜。偶尔他也觉得这种生活有点苦闷,不过还好不知道从什么时候开始阿智迷上了金庸的武侠小说,每天工作完后他总要看上那么一段时间。沉浸在武侠世界里面的阿智直觉得天地开阔了很多,潇洒而自...原创 2019-08-26 08:03:45 · 227 阅读 · 0 评论