java
185的阿平
集中起来的力量可以击穿顽石
展开
-
性能爆炸!SXSSFWorkbook原文件上追加写入&分页导出
以上工具类里提供的都是一次性导出的方法。那如果说需要多次导出咋整呢。说实话,支付系统里头最头痛的就是导出大数据量,性能瓶颈第一卡在数据库资源,第二卡在poi性能。以上方法都是经过系统测试的,用于记录自己遇到的问题,如果你也遇到并且有疑问欢迎留言解答。原创 2024-04-01 16:07:33 · 1001 阅读 · 4 评论 -
mybatis流式游标查询-导出DB大数据量查询OOM问题
Service层—需注意加上事务注解表示该service并不是在mapper结束时结束事务,而是等整个service结束才结束事务,不然会出现只能读取到第一段游标的结果集。客户端而言,数据每次读取都是从本机器的内核缓冲区,所以性能会更快一些,一般情况不必担心本机内核无数据消费(除非。服务端传递来的数据,在客户端不做任何业务逻辑,拿到数据直接放弃,会发生客户端消费比服务端超前的情况)流式查询,将结果集一条一条的拉取进内存,比较依赖网络,可能会造成网络阻塞。弊端就显而易见了,如果查询数据量过大,会不断经历。原创 2024-04-01 15:39:38 · 1126 阅读 · 0 评论 -
结合ChatGPT制作PPT
整体流程是先找个第三方PPT制作网站,看下支不支持文本转PPT功能,有这样功能基本都能用GPT操作。我本次讲的事务相关的内容,可以看下最终成品效果,整体排版还不错,PPT页数少了就需要在文本中多新增一些内容输出,PPT页数也会随着增多。缺点:大部分适用比较简短的PPT制作,精细化的ppt还是需要二次优化,有些第三方网站语法比较奇怪,需要调教GPT才能生成对应的文本结构。今天看到圈友的一个AI分享,然后自己本身需要做一个分享的PPT。mode=demo)具体操作参考,比较细节,我是看了半小时就做完了。原创 2023-07-17 11:31:22 · 7217 阅读 · 3 评论 -
第三方jar包引入项目,发布到本地和远程仓库
本地引用jar的话可以有两种方式。第一种就是本地包引用,如下将包放下工程下,然后maven指定。但这种方式在打包层面可能会有很多奇怪的问题。加上类似Jenkis构建会检查项目规范,不允许在工程中单独放入jar包,所以好的方式是将该包传到仓库直接引用。原创 2023-04-26 11:17:04 · 1433 阅读 · 1 评论 -
poi导出excel生成密码文件的版本问题
poi导出原创 2022-11-23 13:49:22 · 833 阅读 · 1 评论 -
非对称加密的公私钥用法
非对称加密的公私钥用法原创 2022-11-10 19:00:51 · 319 阅读 · 0 评论 -
maven子依赖版本覆盖父依赖
比如父依赖定义了jaskson.version为2.13.3,在中进行管理就会锁死版本。 在子依赖中指定版本也会无法覆盖,需要在子依赖的中也指定原创 2022-07-11 11:27:29 · 3961 阅读 · 0 评论 -
多线程-ReentrantLock的特性及用法
ReentrantLock实现Lock接口,重写了Lock类中的方法。具有以下特性1.可重入。即在同一个线程中可对同一个lock对象重复加锁。public class TestReentrant { static ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { method1(); } public static void met原创 2022-05-10 17:57:47 · 300 阅读 · 0 评论 -
多线程-线程通信(wait-notify,await-single,park-unpark)
在多线程场景中,如有些线程需要依赖另外线程的结果而继续执行,如多个线程处理请求,有的处理的快有点慢。快的需要等待慢的线程结果一起提交执行结果。都会涉及到线程间的通信,就是A线程告知B线程处理的结果是怎么样,B线程再执行对应逻辑。通信比较经典的就是采用等待通知模式,当然还有join,volilate等也可作为通信手段。本文重点讲下API层面的通信。举个例子,三个线程T1,T2,MAIN的场景,T1因为条件不满足进入等待状态,等待其他线程的唤醒(可理解为孩子吃饭没辣条自己关上门在房间里等待辣条)。T2的工作原创 2022-04-22 16:02:45 · 474 阅读 · 0 评论 -
多线程-syncronized的应用与原理分析
synronized许多开发人员看到就认为是重量级锁,其实不然,JVM对它定义有很多种状态。偏向锁->轻量锁->重量锁。这其中有很多的优化过程,业务概念被称为锁膨胀,锁消除,锁撤销。下面来具体分析一下。首先syncronized本质作用于对象上,修饰普通方法锁this对象,修饰静态方法锁类对象。以下代码说明。@Slf4jpublic class SyncronThread03 { //以下代码效果一样 public synchronized void say(){原创 2022-04-14 22:07:08 · 636 阅读 · 0 评论 -
多线程-Thread类的常用方法及使用场景
众所周知,操作线程就必须熟读线程的API方法,万一你开个多线程刹不住车就歇菜了,下面就介绍一些API基本用法。包括sleep,join,yield,interrupt。sleep,让当前线程睡一会。原生用法Thread.sleep(毫秒),会抛出一个打断的异常;此方法可防止CPU100%的问题,如果你代码中有轮训机制,就会体验到。while(true) 中加上一个sleep,CPU至少会减低80%消耗。一般我们采用自制工具类。因为JUC中支持改玩意,不需要每次去catch异常public clas原创 2022-04-12 15:47:06 · 561 阅读 · 0 评论 -
多线程-java线程创建的四种方式
java中表面有四种创建线程的方法,其实可以说是两种1.通过Thread类,重写run方法。再调用其start。2.通过Thread类,实现Runable接口重写run方法。将Runable对象传入Thread类构造方法中,再调Thread类的start。3.通过Thread类,通过FutureTask和Callable接口重写run方法,将实例对象传入Thread类构造方法中,再调Thread类的start。4.通过ThreadPool来创建线程。需要往线程池中提交Callbale对象或R原创 2022-04-12 12:28:11 · 2280 阅读 · 0 评论 -
设计模式:模板模式
模板模式 就是将通用方法抽象到父类作为模板,将公共的结构化逻辑在父类中完成。子类继承父类其通用方法实现不同业务逻辑。一般来说通用方法定义为抽象方法,公共逻辑方法使用final修饰不让子类重写。如人的一天按早中晚三餐吃饭,每个人每顿吃的不一样。但顺序肯定是早中晚,这样就可以用模板方式实现。人生活接口public abstract class PersonLife { abstract void monEat(); abstract void lunchEat(); abs原创 2021-12-21 10:55:18 · 93 阅读 · 0 评论 -
java8中list的高级玩法
最近频繁做List的一些操作,换成java8后发现有的可以直接通过steam流完成快速开发。记录一下List<A> list = new ArrayList<>();@Datapublic class A{private String name;private int age;private Date birthday;}List<A> list = new ArrayList<>();数据字段过滤list原创 2021-12-04 18:38:03 · 1037 阅读 · 2 评论 -
No active profile set, falling back to default profiles: default问题
这个问题出现在多环境配置切换时,springboot会提供一个active指定编译时加载哪个配置文件。spring: profiles: active: dev有时候明明指定了active确发现还是不生效,走了默认的配置。如果有些业务参数时放在配置文件中的就会报Could not resolve placeholder 'CM3.WORKING_DIR' in value "${CM3.WORKING_DIR}" 类似这种错误。 但这类问题一般在配置文件层面检查能查出。今天一问题.原创 2021-12-04 18:15:58 · 1959 阅读 · 0 评论 -
设计模式:策略模式
策略模式很大方面是为了解决代码中多层嵌套if else的问题。当某一类业务有共同特性时,并且分为多个场景要走不同的逻辑时,比如if(我是人) deal(我要吃饭) if(我是牛) deal(我要吃草)if(我是大熊猫) deal(我要吃竹子) 这样如此多的业务的话 会变成if() else if() else if() else{} 如果中间if中再带if判断条件,整个代码看起来就晕掉。这时候可以使用策略模式美化代码。定义一个共同接口public interface Person { v.原创 2021-11-30 21:07:57 · 496 阅读 · 0 评论 -
springboot中的controller层增加事务控制
大多数编程者习惯会在service层加事务控制,当一个controller层调用了多个service的update或者insert方法时,第一个成功了,第二个失败了。那么就会有第一个的事务会回退吗的困惑。其实通过在方法上@Transactional注解就可以控制。但在controller中不要使用try catch被捕捉了就不会回退事务。反正自己动手试试就知道。controller //可行 @PostMapping("/updateCustTel") @Transactional原创 2021-11-27 16:44:17 · 6413 阅读 · 0 评论 -
设计模式:单例模式(反射破坏,枚举不能被破坏的原因)
除了枚举单例,其余都能被反射破坏。双重检查+懒汉式+私有构造判断(这已经是比较安全的写法,网上说不能破坏):package com.yuanping.sjms_demo.singleton;/** * 单例模式标准,私有静态成员变量,私有构造方法,公共静态获取实例的方法 */public class DoubleCheck { private static volatile DoubleCheck doubleCheck = null; //volitile防止指令重排序原创 2021-10-21 17:41:51 · 931 阅读 · 0 评论 -
设计模式:简单工厂,工厂方法,抽象工厂区别图解
简单工厂:简单工厂(也叫静态工厂) 一个具体工厂类里面通过一个静态方法去获取某个抽象产品的子产品。比如你在自助贩卖机去买矿泉水:有怡宝,娃哈哈,百岁山。他们的价格为2块,1块,3块。这时候你就需要确定你想喝哪款,需要传递一个水标识的信息给贩卖机,贩卖机就返一个对应的支付码,支付完成后送对应的水。代码://工厂类:利用反射是为了减少if/elsepublic class WaterFactory { public static Water getInstants(Strin..原创 2021-10-20 17:14:24 · 198 阅读 · 1 评论 -
SpringSecurity实现统一登录
场景:A服务器的平台需要跳转B服务器的平台,中间通过一个链接把A平台的身份信息带入,直接进入B平台做校验,实现到B平台的免登陆流程。实现思路:对跳转的url路径做Filter过滤,Filter里写具体实现逻辑。总结一下用SRT实现的流程。需要实现的三个核心类SecurityConfigurerAdapter //定义的配置信息AuthenticationProvider //核心处理器AbstractAuthenticationProcessingFilter //核心过滤器上.原创 2021-09-01 10:48:25 · 622 阅读 · 0 评论 -
实现ResponseBodyAdvice接口进行返回报文封装(脱敏)
今收到需求需要对所有接口的返回报文中含有敏感信息的字段进行加密处理,大概有100多个接口。肯定会优先想到用AOP切面实现。但AOP里头只能用环绕通知去实现,像后置及后置返回通知都是在方法执行后的通知(后置无法收到返回报文,后置返回可收到但是已返回到前端)显然不合适。环绕通知用过的话其实会发现有点性能问题。并且对于它是可以影响原来的返回格式的。所以用一种新的方式去实现,使用ResponseBodyAdvice实现。基本API用法很简单,本文嵌入了一些业务逻辑及设计思路。需求有7类场景进行脱敏,每个场景不同原创 2021-07-30 16:11:03 · 1205 阅读 · 1 评论 -
java利用poi实现excel导出
依赖<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.15</version> <scope>compile</scope> </dependency>原创 2021-07-07 15:27:12 · 148 阅读 · 0 评论 -
rabbitMQ解决消息丢失-消费者手工确认ack
maven配置<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/m原创 2021-07-05 18:31:21 · 126 阅读 · 2 评论 -
centos7中搭建rabbitMQ
首先要下载三个资源包,资源路径可下载执行以下三条命令安装rpm -ivh erlang-21.3-1.el7.x86_64.rpm yum install socat -y rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm 添加开机启动 RabbitMQ 服务 chkconfig rabbitmq-server on 启动服务 /sbin/service rabbitmq-server start 查看服务状态 /原创 2021-06-25 23:29:31 · 98 阅读 · 0 评论 -
nginx搭建前后端分离工程
首先需要在本地安装配置nginx。步骤可以看之前的博客 三分钟搭建nginx。有了nginx后。主要是针对nginx.conf文件做配置即可。首先将前端界面的包放到服务器的某个路径下。我的路径为/home/wftapp/vcc-app/page/H5配置nginx.confserver { listen 8123; //访问监听端口 # listen somename:8080; server_name原创 2021-06-25 15:00:56 · 114 阅读 · 0 评论 -
jenkins自动化构建git页面配置
Jenkins在新建完项目后会有编辑配置按钮,也可在在新建的过程配置。都是一个界面。简单对这个界面的属性做下说明。能直接跑起来项目就行。1.General这块可选可不选。是对项目的概括说明。相对于jenkins来说的。2.源码管理3.构建触发器&构建环境。4.构建这一步加下说明,jenkins是按从上到下依次执行命令的。像图中所示就是打完包后去主机上执行对应的脚本。关于使用insatll打包出现找不到主类清单的问题的插件信息。<plugin> .原创 2021-06-25 14:39:57 · 168 阅读 · 1 评论 -
Aop记录日志实践(获取请求参数&返回参数&环绕通知)
先贴一个标准Demo自定义注解或者代码中配置自己扫描的类或方法。个人觉得注解更加方便些。原创 2021-05-31 19:02:01 · 3498 阅读 · 2 评论 -
MySQLIntegrityConstraintViolationException:Column cannot be null(Mysql约束检查异常)
这个错今天在项目出现的,刚开始很奇怪。因为我的数据库中这个字段设置了不为NULL,默认值0。就算前端传入的值是NULL时应该在mybatis中插入再到数据库会插入0。理论上一点都没错。但是Mysql在执行过程过有个预处理过程这个过程就是检查约束,基本的语法信息。所以这个异常发生在预处理过程。因为我传入的是NULL,而数据库中设置的字段约束为非空。所以报出次异常—》约束检查异常。解决方法的话可以在业务代码中加上默认值的设置。...原创 2021-05-25 16:09:09 · 3665 阅读 · 0 评论 -
jdk1.8中Integer与int自动拆箱的问题
首先定义了一个枚举类,业务中需要取这个枚举类的code字段做比较。public enum TemplateEnum { IS_DEFAULT(1, "默认"), NO_DEFAULT(0, "非默认"); private int code; private String remarks; private TemplateEnum(int code, String remarks) { this.code = code; th原创 2021-05-25 15:41:40 · 151 阅读 · 0 评论 -
arthas线上性能分析及mysql执行计划调优
今天线上遇到一个HTTP请求超时直接断开的情况,导致用户界面查询了N久没有查到结果。因为HTTP的请求时间超时在30S。先去review一遍代码,没发现明显的代码异常。此时就相当于要查看哪一段的代码执行占用时间较大。此时就想到之前看到的性能分析工具阿里的arthas。实践一下。比起传统AOP加响应时间日志的灵活很多。安装arthascurl -O https://arthas.aliyun.com/arthas-boot.jar然后可以大概看下arthas的帮助java -jar artha原创 2021-01-19 16:39:05 · 1405 阅读 · 1 评论 -
基于mysql大数据量limit查询优化
今天一个业务场景,定时任务同步全量的历史数据。Java中用一个list去接收sql查询返回的数据。想到list的存储及sql性能瓶颈,于是就需要对数据进行分页查询。使用得mysql数据,在查询数据库中40w数据时,发现耗时将近4min。其中230s是用在网络传输。那么此时就需要分页查询。分页查询逻辑也有效率高低,比较好的方法通过id进行between查询。这种局限于id为自增的表。并且它的每条数据内容都是固定的。如果中间有其实id不是连续的,那么中间这个基数就很难定义。比如我数据库最小的id原创 2020-12-21 22:38:01 · 512 阅读 · 0 评论 -
java中用BigDecimal解决金额的存储问题
Java中只要涉及到钱的交易就会有金额字段的考虑。最近的发现问题有精度损失。最开始用int字段去存储金额,当入库到数据库会有小数字段。如115.63就直接报错。那么改用varchar去存储。在实际业务场景,需取出时需要根据金额做逻辑操作。当时采用的方法,cash为115.63,用parseDouble解析 发现了值变了,精度丢失。导致接口报错。 String.valueOf(Double.parseDouble(cash)*100)v于是测试String sb = String.原创 2020-12-14 16:17:55 · 1008 阅读 · 0 评论 -
java根据模板生成word文件
准备word模板,将里面需要写入的内容以${变量名}形式表现。如图保存word。另存为xml格式文件。将model.xml更改后缀名改为model.ftl。这个文件我存在在E盘的根目录。等下需要加载该文件,所以文件路径尽量不要带中文。代码工作,首先引入依赖<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifa.原创 2020-11-20 11:40:56 · 529 阅读 · 0 评论 -
ReentrantReadWriteLock读锁源码分析
读锁的获取,两个核心方法tryAcquiretrytryAcquireShared方法Thread current = Thread.currentThread();获取当前线程int c = getState();获取锁状态 32位if (exclusiveCount(c) != 0 && getExclusiveOwnerThread() != current) return -1;//写锁次数不是0说明写锁被获取并且不是当前线程获取,那就获取...原创 2020-11-16 23:00:13 · 84 阅读 · 0 评论 -
ReentrantReadWriteLock写锁源码分析
有几个特性,读锁是共享的,能被多个线程占有。写锁是独占的。只能有一个线程占有。获取了写锁能在获取读锁成为锁降级。获取了读锁不能再获取写锁。也不支持锁升级。写锁的获取tryAcquire方法writerShouldBlock方法,非公平锁直接返回false,公平锁如下。写锁的释放tryRelease方法...原创 2020-11-16 22:55:33 · 76 阅读 · 0 评论 -
远程WWW服务支持TRACE请求(tomcat漏洞修复及测试方案)
近期主机安全扫描除了安全漏洞,如图看到该问题的第一思路,找到具体端口号对应的应用。主机配置httpd服务信息。最终发现主机上并未开启httpd服务。应用是基于tomcat发布的,并且为springboot的内嵌tomcat。意思就是说跟主机侧无关,需要调整应用侧代码。于是百度tomcat传统形式通过配置web.xml达到禁止不安全的http方法 <security-constraint> <web-resource-collection...原创 2020-06-10 16:29:53 · 5397 阅读 · 2 评论 -
学习篇-redis中String类型常用命令及应用场景
操作命令基本命令 get,set,getset批量操作 mget,mset超时设置 setex (秒),setpx(毫秒),ttl key查看过期时间设置判断命令。setnx(新增会自动判断,有则不会覆盖原有)set key value xx(用于更新 如果不存在也不会插入这个健)字符追加 append ,字符长度 strlen增减运算 incr decr 。固...原创 2020-05-01 22:34:07 · 232 阅读 · 0 评论 -
java使用axis实现webservice接口调用
看了很多博客,发现都是cp出来说明也不清楚。不是缺包就是少代码,一贴就不负责任。自己最后找到了方法,写一个比较完整的方法给大家提供。确保webservice接口可以在网页进行访问,调用webservice接口之前都会确认。如图为可用2. 可用之后开始编写代码依赖如下: <!-- https://mvnrepository.com/artifact/org.apac...原创 2020-04-29 11:12:16 · 1663 阅读 · 2 评论 -
OpenSSH8.0对应jsch jar包版本
由于连接sftp所用jar最终会使用jsch的包。然而jsch的包会有各种版本问题。来梳理一下,根源是jdk1.6支持的加密算法较少(jdk8支持了大多数加密算法),而openSSH8.0默认屏蔽了jdk1.6支持的加密算法,如:diffie-hellman-group1-sha1等。openSSH7的版本能支持1.6的算法。首先查看主机ssh命令,执行ssh -v因为一台...原创 2019-12-29 21:48:12 · 6584 阅读 · 0 评论 -
为什么用tomcat启动程序后java文件没编译,为之前的class文件
这个问题最基础的原因,就是你的项目java环境没配置好。没指定jdk路径,导致无法编译。当有这个时候,你的项目就会正常编译。原创 2019-11-13 18:07:31 · 1214 阅读 · 0 评论