![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
工作总结
文章平均质量分 58
IT枫斗者
大家好,我是程序员枫哥,csdn全栈领域优质创作者,华为云专家博主,阿里云专家博主,51CTO专家博主,目前组建的团队,专注Java技术分享,一对一学习辅助,春招/秋招/社招/跳槽,Java带徒等求职辅助,欢迎来技术交流,有问必答。
展开
-
接受外包Offer前一定要清楚的4件事
但如果你想从工作中获得的不仅仅只有报酬,更想有一些为日后的履历增光添彩的项目经历的话,派遣员工可能就不是很合适。除非你愿意非常频繁地跳槽来换工作,否则涨薪在派遣员工中也是很困难的,而作为规模公司的正式员工,往往有很成熟的薪资上升机制,也有晋升的机会。而且业内有一些传言,把进代理机构的经历称之为「弄花简历」,这段经历有可能会对后期想要进入大厂时的筛选过程有一定的影响。至于说HR招人时所提到的「有转为正式员工的机会」,就像真爱,听过的人多,见过的人少,我也不过多发表意见。原创 2023-06-14 05:00:00 · 158 阅读 · 0 评论 -
谈谈一个程序员的职场心得(真有用)
我会分为三个部分:软件开发,职场协作和认知成长,每个部分精简成 7 条心得。原创 2023-03-05 06:00:00 · 1060 阅读 · 1 评论 -
日志log笔记看这一篇文章就够了
全称:Simple Logging Facade for Java,即简单日志门面接口,和commons-logging是一样的,它们都不是具体的日志框架,只是门面接口,要想使用需要具体的日志框架(log4j,logback等)%l 输出日志时间发生的位置,包括类名、发生的线程,以及在代码中的行数,如:Test.main(Test.java:10)它是apache提供的日志门面接口,有个这门面接口用户就可以选择不同的日志实现,而不需要改动日志的定义,符合面向接口编程思想。Console和A为自定义。原创 2023-02-05 06:00:00 · 418 阅读 · 0 评论 -
Quartz入门看这一篇文章就够了
1Quartz [kwɔːts]是一个完全由Java编写的开源的作业调度框架Job接口1首先我们需要定义实现一个定时功能的接口,我们可以称之为Task(或Job)如定时发送邮件的task(Job)重启机器的task(Job)优惠券到期发送短信提醒的task(Job)Trigger [ˈtrɪɡə(r)] 触发器1有了任务之后,还需要一个能够实现触发任务去执行的触发器,触发器Trigger最基本的功能是指定Job的执行时间,执行间隔,运行次数等。原创 2023-02-04 06:00:00 · 1865 阅读 · 0 评论 -
你知道 @Async 是怎么让方法异步执行的吗?
SpringBoot 提供了接口让开发人员可以自定义线程池执行器;框架默认提供了一个空的实现类 AsyncConfigurerSupport,两个方法体内部都是空实现。这部分逻辑在/***/return;}}}AsyncConfigurer 在项目中只能有一个实现 Bean,如果超过一个,将会抛出 IllegalStateException 异常。本文通过对@Async注解的分析,和你解释了@Async 是怎么让方法异步执行的吗?这个问题;原创 2022-12-18 19:16:55 · 188 阅读 · 0 评论 -
那就聊聊深拷贝和浅拷贝
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。实现浅拷贝核心思想:如果属性是基本数据类型,则拷贝基本类型的值;如果属性是引用类型,拷贝的就是内存地址 ,会受拷贝对象(本体)的影响。深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用。原创 2022-12-14 08:23:33 · 160 阅读 · 0 评论 -
彻底理解synchronized
使用锁时,线程获取锁是一种悲观锁策略,即假设每一次执行临界区代码都会产生冲突,所以当前线程获取到锁的时候同时也会阻塞其他线程获取该锁。而CAS操作(又称为无锁操作)是一种乐观锁策略,它假设所有线程访问共享资源的时候不会出现冲突,既然不会出现冲突自然而然就不会阻塞其他线程的操作。因此,线程就不会出现阻塞停顿的状态。那么,如果出现冲突了怎么办?无锁操作是使用又叫做比较交换来鉴别线程是否出现冲突,出现冲突就重试当前操作直到没有冲突为止。原创 2022-12-12 06:30:00 · 311 阅读 · 0 评论 -
SpringBoot 整合 Activiti7 实现工作流
在正式讲解之前,我们先简单的了解一下什么是工作流👇工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。那么在一个系统中工作流的功能就是对系统的业务流程进行自动化管理,而工作流是建立在业务流程的基础上,所以一个软件的系统核心根本上还是系统的业务流程,工作流只是协助进行业务流程管理。原创 2022-12-09 05:15:00 · 1325 阅读 · 0 评论 -
Sping Boot 如何实现自动配置
都需要创建一个启动类,而启动类都含有注解,从启动类,一步步探索源码。 启动类上都有一个 注解: 里面有 的注解: 注解导入类: 类找到 方法,里面有方法: 方法通过 扫描所有含有的包: 项目包含文件,是一个键值对的形式,扫描该文件下对应类: 打开调式模式,在方法里面的处设置断点,查看返回的集合: 第一个元素是是因为引入了的依赖: 从上面查看的源码,可以知道自动配置主要是实现的,注解导入类,通过方法调用扫描所有含有文件的包,将文件中对应的类注入到容器中。这些属性自动配置到之后就无需自己手动配置了,中的原创 2022-12-08 07:36:05 · 368 阅读 · 0 评论 -
Optional用法与争议点
要说Java中什么异常最容易出现,我想NullPointerException一定当仁不让,为了解决这种null值判断问题,Java8中提供了一个新的工具类Optional,用于提示程序员注意null值,并在特定场景中简化代码逻辑。比如下面一段取深层属性值的代码:这种场景还比较常见,但深层嵌套的if判断,让代码阅读者压力倍增。看看用Optional后的写法,如下:链式调用的写法,让代码可读性增强了不少,不用判断null,是因为Optional在内部已经做了null值判断了!那我们来看看Optio原创 2022-12-07 07:24:14 · 331 阅读 · 0 评论 -
分布式事务最终一致性的方案
分布式系统中不可避免存在分布式事务带来的一致性问题。为了解决这个问题,需要熟悉业界相关的理论:ACIDCAPBASE2PC3PCTCC对于一致性的处理,分为强一致和最终一致性。强一致,对系统的吞吐量和性能有较大损耗,一般用在金融/银行系统,而最终一致性,是以牺牲短期的数据强一致、提升可用性的方案。 对于大部分分布式系统,强烈建议放弃强一致性,采取最终一致性方案。现状:微服务之间采用HTTP调用,在一个事务内涉及跨系统调用,未考虑过事务一致性问题问题:在异常情况下一定出现数据不一致和脏数据 现状:采用消息队列原创 2022-12-05 07:40:11 · 674 阅读 · 0 评论 -
高并发场景下缓存处理思路总结
Write Behind Caching 这种模式通常是先将数据写入到缓存里面,然后再异步的写入到database中进行数据同步,这样的设计既可以直接的减少我们对于数据的database里面的直接访问,降低压力,同时对于database的多次修改可以进行合并操作,极大的提升了系统的承载能力。比如,一个是读操作,但是没有命中缓存,然后就到数据库中取数据,此时来了一个写操作,写完数据库后,让缓存失效,然后,之前的那个读操作再把老的数据放进去,所以,会造成脏数据。使用加锁队列来应付这种问题。原创 2022-11-23 20:18:36 · 173 阅读 · 0 评论 -
扒去Spring事件监听机制的外衣,竟然是观察者模式
观察者模式是一个典型的发布-订阅模型,其中主要涉及四个角色:抽象被观察者角色:内部持有所有观察者角色的引用,并对外提供新增、移除观察者角色、通知所有观察者的功能;具体被观察者角色:当状态变更时,会通知到所有的观察者角色;抽象观察者角色:抽象具体观察者角色的一些共性方法,如状态变更方法;具体观察者角色:实现抽象观察者角色的方法;UML类图展示类观察者模式大体如下:以具体的代码来展示一下观察者模式的实现。第一,定义抽象观察者。/*** 抽象观察者角色**//*** 接收消息。原创 2022-11-22 20:15:50 · 147 阅读 · 0 评论 -
Spring Boot + EasyExcel导入导出,简直太好用了
在EasyExcel执行write方法之后,获得ExcelWriterBuilder类,通过该类的registerWriteHandler方法可以设置一些处理策略。/*** 设置单元格样式(仅用于示例)** @return 样式策略*/// 表头策略// 表头水平对齐居中// 背景色// 自动换行// 内容策略// 设置数据允许的数据格式,这里49代表所有可以都允许设置。原创 2022-11-21 14:53:30 · 344 阅读 · 0 评论 -
Java8中那些方便又实用的Map函数
一直以来,java因代码编写太繁琐而被开发者们所广泛诟病,但从java8开始,从Map、Stream、var、multiline-string再到record,java在代码编写层面做了大量的简化,java似乎开窍了🤔。原创 2022-11-20 19:06:50 · 152 阅读 · 0 评论 -
优秀后端都应该具备的开发好习惯
很多小伙伴,判断一个list}这样写呢,逻辑是没什么问题的。}日常开发中,我们既要会用工具类,更要学会自己去总结工具类。比如去文件处理工具类、日期处理工具类等等。这些都是优秀后端开发的一些好习惯。原创 2022-11-19 10:41:29 · 171 阅读 · 0 评论 -
后端API接口性能优化的10种方案,真有用!
优化前: 优化后: 打个比喻:耗时操作,考虑用异步处理,这样可以降低接口耗时。假设一个转账接口,匹配联行号,是同步执行的,但是它的操作耗时有点长,优化前的流程: 为了降低接口耗时,更快返回,你可以把匹配联行号移到异步处理,优化后:除了转账这个例子,日常工作中还有很多这种例子。比如:用户注册成功后,短信邮件通知,也是可以异步处理的~至于异步的实现方式,你可以用线程池,也可以用消息队列实现。在适当的业务场景,恰当地使用缓存,是可以大大提高接口性能的。缓存其实就是一种空间换时间的思想,就是你把要查的数原创 2022-11-18 11:05:59 · 1369 阅读 · 0 评论 -
Redis脑裂现象及解决方案
Redis脑裂可以采用min-slaves-to-write和min-slaves-max-lag合理配置尽量规避,但无法彻底解决,Redis脑裂最本质的问题是主从集群内部没有共识算法来维护多个节点的强一致性,它不像Zookeeper那样,每次写入必须大多数节点成功后才算成功,当脑裂发生时,Zookeeper节点被孤立,此时无法写入大多数节点,写请求会直接失败,因此Zookeeper才能保证集群的强一致性。原创 2022-10-24 17:32:24 · 8917 阅读 · 0 评论 -
Java中如何实现文件预览的功能
JODConverter 依赖于openoffice,需要在服务器单独安装openofficeAspose使用的是破解版的,如果商用使用需要考虑版权问题。原创 2022-09-08 07:21:58 · 983 阅读 · 0 评论 -
vue样式穿透 ::v-deep的具体使用
有些像 Sass 之类的预处理器无法正确解析 >>>。这种情况下你可以使用 /deep/ 或 ::v-deep 操作符取而代之——两者都是 >>> 的别名,同样可以正常工作。有些像 Sass 之类的预处理器无法正确解析 >>>。这种情况下你可以使用 /deep/ 或 ::v-deep 操作符取而代之——两者都是 >>> 的别名,同样可以正常工作。但是有些开发者反应,在vue-cli3编译时,deep的方式会报错或者警告。但是像scss等预处理器却无法解析>>>,所以我们使用下面的方式.原创 2022-09-02 07:03:34 · 429 阅读 · 0 评论 -
jdbcTemplate 获取数据库的表名 和 信息
。原创 2022-09-01 21:30:02 · 1876 阅读 · 1 评论 -
@RequestBody的使用
RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。...原创 2022-08-31 07:45:26 · 1451 阅读 · 0 评论 -
JavaScript 实现点击/关闭全屏
那么,问题我们知道了。解决问题的思路是怎么样的呢?我们获取到图片元素的DOM节点我们调用全屏的函数进行全屏展示浏览器监听点击事件,当图片是全屏的状态,再次点击图片的时候,调用函数退出全屏。...原创 2022-08-28 12:54:18 · 944 阅读 · 0 评论 -
vue组件中重新渲染的3种方式
因为vue是通过虚拟Dom算法来判断元素的变化,是否变化的核心是通过判断新旧元素的key值是否变化。如果你的key是变化的,则重新渲染该元素,如果key没变,则不会重新渲染。的时候,当前条件块里包含的元素会被销毁,如果包含的是组件,则组件对应的生命周期函数(的时候,当前条件块里的元素会被重建,如果包含的是组件,则组件对应的生命周期函数(属性,然后在需要重新渲染的时候,改变key的值就行。等),计算属性,watch等会执行,相当于重新渲染。所以如果你想让你的组件重新渲染,你给组件加上。...原创 2022-08-26 19:16:20 · 13516 阅读 · 0 评论 -
java使用多线程进行批量更新数据
获取需要进行批量更新的大集合A,对大集合进行拆分操作,分成N个小集合 。开启线程池,针对集合的大小进行调参,对小集合进行批量更新操作。对流程进行控制,控制线程执行顺序。import com.google.common.collect.Lists;import org.apache.commons.collections.CollectionUtils;import java.util.List;/** * 拆分结合工具类 * * @author shiwen */public cl原创 2022-06-25 11:15:41 · 3396 阅读 · 2 评论 -
在项目中,校验字段最大八位整数,六位小数
在项目中,校验字段最大八位整数,六位小数public static final int a = 100000000;String amount = String.valueOf(b.getBase);if(a.compareTo(b.getBase()) < 0 || amount.length() > 17){ throw new Exception("错误!!");}原创 2022-01-23 10:03:06 · 446 阅读 · 0 评论 -
在项目中,数据库字段存储逗号隔开字符串,只需求修改其中几个,应该怎么写sql
在项目中,数据库字段存储逗号隔开字符串,只需求修改其中几个,应该怎么写sqlupdate 表名 set 表中所需修改字段名=replace(表中所需修改字段名,该字段旧值,该字段新值) where 该字段旧值 like ',%该字段中所需要修改得值%';...原创 2022-01-23 09:53:10 · 837 阅读 · 0 评论 -
SQL left[right] join多张表和from多张表的区别
SQL left[right] join多张表和from多张表的区别from多张表普通的联接,结果中的记录在两个表中都有,相当于inner joinmysql> select * from a;+------+------+| id | col |+------+------+| 1 | 11 || 2 | 12 || 3 | 13 |+------+------+mysql> select * from b;+------+------+| id | col原创 2022-01-23 09:43:58 · 1646 阅读 · 0 评论 -
项目上线,备份数据库表sql怎么写
项目上线,备份数据库表sql怎么写直接备份整张表create table 备份表名 like 被备份表名;insert into 备份表名 select * from 被备份表名;备份相关字段create table 备份表名 like 被备份表名;insert into 备份表名(字段a,字段b ...) select (字段a,字段b ...) from 被备份表名;...原创 2022-01-23 09:32:00 · 574 阅读 · 0 评论 -
在项目中学会配置开关
在项目中学会配置开关在实际的项目中我们常常会遇到,在创建一个任务时,后端进行校验是否存在另外一个已经完成的任务,如果完成则可以向下走,但是没有完成,也就没有办法继续向下进行步骤,也就是阻塞了,有可能别人所做的功能阻塞我们,也有可能我们所作的功能被别人所阻塞怎么解决学会配置数据字典,我们每次通过修改数据字典中的值来进行判断是否能被校验通过数据字典中的值也就是两种状态 true|false Y|N这个数据字段中的值要在代码中进行添加判断,前端每次通过传值来进行判断是否需要...原创 2022-01-16 13:41:52 · 169 阅读 · 0 评论 -
[java项目实战] java 浅拷贝和深拷贝
[java项目实战] java 浅拷贝和深拷贝在项目开发工程中我们最常见的就是使用浅拷贝进行复制,因为浅拷贝进行复制,我们只需要把旧对象的引用复制给新对象就可以了,时间复杂度和空间复杂度都非常的低,但是我们要是进行深拷贝所需要的资源就会很多了,并且在实际项目中很少能用到深拷贝,所以我们常见的方法基本都是浅拷贝,如果我们需要深拷贝,那么我在这里也介绍几种深拷贝的方法浅拷贝数据类型是基本数据类型成员变量,浅拷贝进行值传递。因为两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象原创 2022-01-16 13:25:52 · 357 阅读 · 1 评论 -
十几个大表left join的大SQL查询优化
十几个大表left join的大SQL查询优化问题十几个表关联查询,有子查询,并表和left join表查询,由于近期上了生产,每天都有几万条应用,查询一个星期内的数据,用了几十分钟,导致触发熔断机制获取生产环境中的sql下载日志获取到执行的sql替换参数得到完整的带参数的sql测试环境复现失败在测试环境上未能复现成功,但是上线就会出现这个问题让测试结构复现数据,不可行,数据成分不一致,可能效果完全不同并且有那么多表,要进行构造数据也是很麻烦的最后是去现网导出相关表的数据,原创 2022-01-16 12:36:59 · 6625 阅读 · 4 评论 -
数据库中存储单个字符串,前端传多个字符串组成一个字符串,怎么处理查询语句
数据库中存储单个字符串,前端传多个字符串组成一个字符串,怎么处理查询语句<if test='a.stageCode != null and a.stageCode != ""'> t.stage_code in <foreach collection=".stageCode.split(',')" open="(" close=")" separator="," item="item"> #{item} </foreach></if>...原创 2022-01-16 11:58:14 · 380 阅读 · 0 评论 -
数据库中存储单个数据,但是查询出来按分组将多个字符串连接成一个字符串 ,使用group_concat()
数据库中存储单个数据,但是查询出来按分组将多个字符串连接成一个字符串 ,使用group_concat()使用group_concat可以处理,但是怎么写呢?SELECT group_concat(字段名) FROM 表名 group by 分组的字段名原创 2022-01-16 11:48:29 · 442 阅读 · 0 评论 -
SpringBoot实现Excel导入导出,性能爆表,用起来够优雅
操作Excel实现导入导出是个非常常见的需求,之前介绍了一款非常好用的工具EasyPoi。有读者提出在数据量大的情况下,EasyPoi占用内存大,性能不够好。今天给大家推荐一款性能更好的Excel导入导出工具EasyExcel,希望对大家有所帮助!原创 2022-01-15 10:20:54 · 641 阅读 · 0 评论 -
在实战项目中,函数使用不当导致索引失效,导出数据过慢
在实战项目中,函数使用不当导致索引失效,导出数据过慢讲一讲最近碰到的小问题一个用于统计的sql压测发现比较慢原因是sql中需要统计当天的数据,因为函数使用不当导致索引失效原sqlselect ifnull(( select count(1) from d_application a where a.stste = 53 and a.auditopentity = 'a'), 0) auditQuantity, count(distinct d.appoi原创 2022-01-08 10:15:17 · 474 阅读 · 0 评论 -
在上线前,项目需要提供清理脚本,应该怎么写
在上线前,项目需要提供清理脚本,应该怎么写清理脚本# 这个设置的是删除的数据数据set @user_ids = 'name1,name2';# 设置清理的开始时间和结束时间set @start_time = '2000-01-01 00:00:00'set @end_time = '2200-01-01 00:00:00'delete from table_name where find_in_set(creat_by,@user_ids) and CREATE_DATE between原创 2022-01-07 20:55:03 · 437 阅读 · 0 评论 -
在实战项目中,去除字符串前后的中英文空格
在实战项目中,去除字符串前后的中英文空格/*** 前导空格*/private static final Pattern PREFIX_PATTERN = Pattern.compile("^("+'\u3000'+"|\\s)+");/*** 后边空格*/private static final Pattern SUFFIX_PATTERN = Pattern.compile("^("+'\u3000'+"|\\s)+$");/*** 空字符串*/private static f原创 2022-01-07 20:42:23 · 496 阅读 · 0 评论 -
【mysql】delete from命令使用别名
【mysql】delete from命令使用别名我们平时使用delete from 进行删除数据库表中的数据语法delete from table_name where [clause]使用别名注意但是我们会在使用别名的时候出现错误,在oracle中我们可以这样使用delete from table_name t where t.id = #{id}但是这种写法在mysql中会报错,【you have an error in your sqlsyntax;check原创 2022-01-07 20:30:30 · 3709 阅读 · 1 评论 -
在生产环境中,表未加索引,四万多条数据导出用一个多小时,客户体验差,应急修改
在生产环境中,表未加索引,四万多条数据导出用一个多小时,客户体验差,应急修改最近学员遇到问题,说自己写出来了生产问题,看sql并没有任何问题,但是执行速度特别慢,要进行sql优化,不知道怎么下手,我在此简单说一下,但是不能暴露源码,举个例子源代码<select id="exportBusi" resultType="com.gongsi.it.busi.vo.ExportBusiVO"> select * from base_t t left join number_t tm o原创 2022-01-07 20:18:38 · 469 阅读 · 0 评论