java
文章平均质量分 50
thunder-1
像光一样
展开
-
Spring事务异常回滚,发生异常事物不回滚的解决
最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了…为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志。但是这边情况来了,当这个方法异常时候 日志是打印了,但是加的事务却没有回滚。原因是我的代码分层没有严格按照MVC结构区分,我省略了Controller,而我们在配置SpringAop事务的时候一般情况下都是配到service层,所以在service层进行try catch进行捕获异常是不可以的,因为在service层发生的异常被捕获以后,AOP事务就是不会回滚转载 2021-06-09 16:48:20 · 2596 阅读 · 0 评论 -
安装激活JRebel热部署插件
1、Idea离线或在线安装Jrebel插件(教程很多)2、配置激活服务器使用已经封装好的jar包,保持一直运行即可(放到服务器上或者本地),用于激活JRebel。链接: https://pan.baidu.com/s/1rrn-6F26JpD5RSsbJV3-hQ 密码: dscu使用如下命令启动应用:java -jar JrebelBrainsLicenseServerforJava-1.0-SNAPSHOT-jar-with-dependencies.jar -p 1008 &3、激原创 2021-05-19 09:45:14 · 507 阅读 · 0 评论 -
多表左链接查询sql结构
如果想对多个表进行链接查询,可以采用如下sql结构:select gc.common_id,gc.bom_id,gc.goods_state as '商品状态 0-下架 1-上架',gc.goods_name as '商品名称',gc.material_type as '物料类型',c1.category_name as '一级分类名称',c2.category_name as '二级分类名称',c3.category_name as '三级分类名称'from goods_common gclef原创 2021-05-06 08:49:12 · 2672 阅读 · 0 评论 -
高并发下如何保证接口的幂等性?
一、前言接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴一个参考。不知道你有没有遇到过这些场景:1、有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。2、我们在项目中为了解决接口超时问题,通常会引入了重试机制。第一次请求接口超时了,请求方没能及时获取返回结果(此时有可能已经成功了),为了避免返回错误的结果(这种情况不可能直接返回失败吧?),转载 2021-04-01 10:52:31 · 121 阅读 · 0 评论 -
float和double浮点数精度丢失问题,导致0.9f-0.8f不等于0.1f
1、首先请看代码块,想想输出的结果是什么? float a = 1.0f-0.9f; float b = 0.9f-0.8f; System.out.println("res1:"+(a==b)); float x = 0.5f-0.25f; float y = 0.25f; System.out.println("res2:"+(x==y));2、输出结果res1:falseres2:true原创 2021-03-31 11:08:32 · 1258 阅读 · 0 评论 -
hibernate的使用
一、Hibernate定义是一个ORM对象关系映射框架,对JDBC进行了封装,将java实体类映射到数据库表中,将java实体类成员变量数据类型映射到数据库表字段数据类型中,开发人员直接操作对象,避免大量数据编程(SQL编写),提升了开发效率。二、Hibernate使用过程1、根据配置信息,创建配置对象.2、通过配置对象创建sessionFactory 对象,来配置hibernate。3、通过sessionFactory 对象用来创建Session 对象,进行数据库物理连接,与数据库进行交互。原创 2021-03-25 15:20:07 · 3298 阅读 · 0 评论 -
清华大学jdk镜像资源分享链接
https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/8/原创 2021-01-26 15:19:07 · 5295 阅读 · 0 评论 -
无感知验证码和点击验证码实现原理
一、无感知验证码实现原理1、安全用户“点击完成验证”,安全用户验证通过。2、风险用户根据风险程度触发二次验证,比如滑动拼图、图片点选等,验证通过之后再允许进行下一步操作。无感知验证核心在于判断访问用户否是安全用户:需要根据用户行为数据、访问代理、IP、环境变量等等数据建模,用户点击验证按钮之后去后端接口验证,验证通过才可进行下一步操作。安全用户判断模型:1、用户行为数据:页面停顿时间、点击按钮时长,其他输入事件(埋点)、点击事件(埋点)等等。2、访问代理:建立白名单机制,非白名单代理触发原创 2020-12-26 16:05:48 · 3636 阅读 · 0 评论 -
java -cp JAVA_OPTS环境变量不起作用的处理方法
原因:JAVA_OPTS只对tomcat/weblogic等Web服务器中间件有效,以“java -cp [*.jar] test.Main”方式运行的不会去读取JAVA_OPTS,所以通过java -cp执行相关文件会报错。JAVA_OPTS在 tomcat/bin/catalina.sh或tomcat/bin/catalina.bat文件配置,这可配置java进程虚拟机的启动参数 。解决方案:1、如果在运行java类,需要设置Heap Size的话,需要如下方式:java -Xmx2048m原创 2020-10-04 10:42:19 · 1974 阅读 · 1 评论 -
Java8 新特性之流式数据处理
一. 流式处理简介在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现。比如我们希望对一个包含整数的集合中筛选出所有的偶数,并将其封装成为一个新的List返回,那么在java8之前,我们需要通过如下代码实现:List<Integer> evens = new ArrayList<>();for (final Integer num : nums) { if (num % 2转载 2020-09-21 17:15:38 · 172 阅读 · 0 评论 -
Spring AOP概念的简化版和相关概念
添加链接描述原创 2020-08-18 16:08:39 · 115 阅读 · 0 评论 -
Spring中使用变量${}的方式进行参数配置
Spring中使用变量${}的方式进行参数配置在使用Spring时,有些情况下,在配置文件中,需要使用变量的方式来配置bean相关属性信息,比如下面的数据库的连接使用了${}的方式进行配置,如下所示:<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" va原创 2020-08-17 17:43:41 · 1605 阅读 · 0 评论 -
记录使用jmeter测试扣减库存和修改库存高并发执行是否发生数据不一致问题
问题描述:ERP系统业务方反馈调取修改商城库存接口后,商城库存没有改变,需要验证修改库存和扣减库存并发执行时,是否发生了覆盖,导致数据不一致的问题。1、测试demo从代码分析,扣减库存,使用的是悲观锁。2、使用jmeter高并发扣减库存一个商品初始化库存5000,并发执行100个线程同时扣减库存,循环40次,预期累计扣减库存4000,经过测试库存扣减正常,并没有多扣或少扣,商品最后库存1000,说明扣减库存的悲观锁是正常运行的。3、高并发执行扣减库存操作时,同时调取修改库存接口,验证修改原创 2020-08-17 15:16:34 · 843 阅读 · 0 评论 -
bean作用域为singleton(单例模式)引起多线程安全问题
华为云OBS整合了Ueditor,但是在批量上传文件时,只能部分上传成功,很多文件会上传失败。错误代码:@Service@Slf4jpublic class FileServiceImpl implements FileService { @Value("${files.path}") private String filesPath; @Value("${files.prefix}") private String FilesPrefix; @Value("${huaWeiObs原创 2020-08-11 18:08:58 · 1185 阅读 · 0 评论 -
BeanFactory和FactoryBean的区别与联系
1、 BeanFactoryBeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是 Spring IOC 所遵守的最底层和最基本的编程规范。在 Spring 代码中, BeanFactory 只是个接口,并不是 IOC 容器的具体实现,但是 Spring 容器给出了很多种实现,如 DefaultListableBeanFactory 、 XmlBeanFactory 、 ApplicationContext 等,都是附加了某种功能的实现。packa转载 2020-08-08 17:51:01 · 134 阅读 · 0 评论 -
定义@Valid全局异常,返回自定义错误信息
@Valid的注解要求对变量进行验证,直接加在变量之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。但@Valid默认返回信息非常长,我们可以定义全局异常子定义我们需要返回的信息和格式。@valid使用方法:https://blog.csdn.net/weixin_38118016/article/details/80977207/** * @Author: thunder * @Date: 2020/8/7 14:56 * @ControllerA原创 2020-08-08 10:53:36 · 3618 阅读 · 1 评论 -
SpringMVC 中 @ControllerAdvice 注解的三种使用场景!
@ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:1、全局异常处理2、全局数据绑定3、全局数据预处理灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是 SpringMVC 提供的功能,在 Spring Boot 中可以直接使用,下面分别来看。全局异常处理使用 @ControllerAdvice 实现全局异常处理,只需要定义转载 2020-08-07 15:17:09 · 174 阅读 · 0 评论 -
Java序列与反序列实现深度复制
在 Java 语言里深复制一个对象,常常可以先使对象实现 Serializable 接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里,再从流里读出来,便可以重建对象。import org.apache.commons.io.output.ByteArrayOutputStream;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.spr原创 2020-08-05 17:25:42 · 155 阅读 · 0 评论 -
JAVA 注解的几大作用及使用方法详解
一、注解的作用:java 注解,从名字上看是注释,解释,但功能却不仅仅是注释那么简单。注解(Annotation) 为我们在代码中添加数据提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据,(通过 解析注解 来使用这些数据)常见的作用有以下几种:1.生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等;2.跟踪代码依赖...原创 2019-11-28 16:54:34 · 1180 阅读 · 0 评论 -
什么时候用抽象类,什么时候用接口?
抽象类是对类的抽象,接口是对行为的抽象,抽象类定义的是类,接口定义的是行为。如果行为跨越不同类的对象,可使用接口,如果对现实类对象、可以用抽象类。抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类。接口是根本不知道子类的存在,方法如何实现还不确认,只是预先定义行为规范。接口例子:集合框架List接口,并不知道子类的存在,只是预先定义了List的行为规范,让实现它的类有相同的使用方法。抽象类的例子:集合框架AbstractList,从子类分析出公共的属性和方法,并实现了List接口,原创 2020-07-26 10:46:14 · 3821 阅读 · 2 评论 -
java序列化和反序列化使用总结
一、概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象。对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输。反序列化就是根据这些保存的信息重建对象的过程。 序列化:将java对象转化为字节序列的过程。 反序列化:将字节序列转化为java对象的过程。 二、为什么要序列化和反序列化 我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据转载 2020-07-25 17:30:19 · 226 阅读 · 0 评论 -
Java中如何判断两个对象是否相等(Java equals and ==)
https://www.cnblogs.com/xxl910/p/12691246.html转载 2020-07-25 16:58:06 · 186 阅读 · 0 评论 -
httpclient: 设置请求的超时时间,连接超时时间等
1、为什么要设置HTTP timeout?1、与用户操作相关的接口,如果不设置超时时间,将会出现长时间的无响应,严重影响用户体验。2、负载很高的系统,因为大量调用耗时长的接口,导致性能急剧下降,从而影响其他正常的业务。3、某些情况下,HTTP请求可能永远都得不到响应,那么这部分系统资源就一直被占用,直到系统奔溃。2、示例public static void main(String[] args) throws Exception{ //创建httpclient原创 2020-07-23 17:43:24 · 13665 阅读 · 0 评论 -
ThreadPoolExecutor参数设置
1-首先预估系统负载,需要以下几个值:tasks :每秒的任务数,假设为50~100taskTime:每个任务花费时间,假设为0.1sresponseTime:系统允许容忍的最大响应时间,假设为30s2-计算1)corePoolSize每个任务需要taskTime秒处理,则每个线程每秒可处理1/taskTime个任务。系统每秒有tasks个任务需要处理,则需要的线程数为:threadcount = tasks/(1/taskTime) = tasks*taskTime = (10~20)*0.转载 2020-07-23 15:49:57 · 1505 阅读 · 0 评论 -
QPS(每秒查询率)如何计算
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS) 。机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器 。案例分析:每天300w PV 的在单台机器上,这台机器需要多少QPS?( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)。一般需要达到139QPS,因为是峰值。问:如果一台机器的QPS是58,需要几台机器来支持?答:139 / 58 = 3...转载 2020-07-22 08:58:57 · 2735 阅读 · 0 评论 -
ArrayList、LinkedList、HashMap如何保证多线程安全
线程同步指的是多线程的协同,定义多个线程如何访问特定资源,避免多线程并发访问导致数据不一致的问题。ArrayList、LinkkedList、HashMap是最常用的数据结构,但是他们是线程不安全的,在多线程场景下,如果不做控制,可能会到导致线程安全问题。解决ArrayList、LinkedList线程安全方法1、继承Arraylist,然后重写或按需求编写自己的方法,这些方法要写成synchronized,在这些synchronized的方法中调用ArrayList的方法。2、使用Collectio原创 2020-07-21 09:38:13 · 2643 阅读 · 0 评论 -
wait与sleep区别?
wait与sleep区别?对于sleep()方法,该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。...原创 2020-07-20 17:46:28 · 93 阅读 · 0 评论 -
JVM原理
1:什么是JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。转载 2020-07-20 11:59:57 · 267 阅读 · 0 评论 -
equals和==的区别
1.equals和==“双等号”用于比较引用和比较基本数据类型时具有不同的功能:比较基本数据类型,如果两个值相同,则结果为true而在比较引用时,如果引用指向内存中的同一对象,结果为true;equals()作为方法,实现对象的比较。由于运算符不允许我们进行覆盖,也就是说它限制了我们的表达。因此我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过运算符是做不到的。2.object类的equals()方法的比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有原创 2020-07-14 12:12:06 · 158 阅读 · 0 评论 -
Window安装 Rabbit MQ安装配置及常见问题
Window安装1:RabbitMQ安装1.1:安装Erlang:http://www.erlang.org/1.2:安装RabbitMQ:http://www.rabbitmq.com/download.html1.3:window 平台配置参考:https://github.com/ServiceStack/rabbitmq-windows1.4:RabbitMQ管理插件启用及新用户创建参考:http://www.thegeekstuff.com/2013/10/enable-rabbitmq转载 2020-06-16 15:15:44 · 278 阅读 · 0 评论 -
什么是REST API
三、REST API3.1 RESTful是什么?RESTful(Representational State Transfer)架构风格,是一个Web自身的架构风格(url风格),底层主要基于HTTP协议,是分布式应用架构的伟大实践理论,RESTful架构是无状态的,表现为请求-响应的形式,有别于基于Bower的SessionId。3.2 理解REST有五点:1.资源2.资源的表述3...原创 2020-05-07 15:29:34 · 439 阅读 · 0 评论 -
TransportClient和RestClient实现ES的全文搜索
ES基本操作参考:https://blog.csdn.net/jacksonary/article/details/82729556实现复杂查询:一、TransportClient实现 /** * 根据name搜索 * * @param name book name */ @RequestMapping(value = "/book_sear...原创 2020-05-06 14:23:57 · 877 阅读 · 0 评论 -
Java 中的悲观锁和乐观锁的实现
乐观锁顾名思义就是在操作时很乐观,这数据只有我在用,我先尽管用,最后发现不行时就回滚。悲观锁在操作时很悲观,生怕数据被其他人更新掉,我就先将其先锁住,让别人用不了,我操作完成后再释放掉。悲观锁需要数据库级别上的的实现,程序中是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大地降低。锁(locking)业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算...转载 2020-05-03 14:39:13 · 471 阅读 · 0 评论 -
ELK常用命令
#后台启动ES,需要切换到elsearch这个账号启动服务,目的主要是为了安全/opt/ELK/elasticsearch-6.4.3/bin/elasticsearch -d#后台启动logstash,等一会儿才会生效,或者直接启动脚本nohup /opt/ELK/logstash-7.6.2/bin/logstash -f /opt/ELK/logstash-7.6.2/confi...原创 2020-04-27 12:39:59 · 423 阅读 · 0 评论 -
springboot+mysqlrouter+mybatis+mysql实现读写分离架构完全技术方案
1、安装Mysql8https://blog.csdn.net/atongmu2017/article/details/90610444解决: You are not allowed to create a user with GRANThttps://blog.csdn.net/mxskymx/article/details/887650722、配置一主多从数据库架构https://b...原创 2020-04-25 23:18:32 · 1794 阅读 · 0 评论 -
ExecutorService 的理解和使用
前言:我们之前使用线程的时候都是使用new Thread来进行线程的创建,但是这样会有一些问题。如:a. 每次new Thread新建对象性能差。b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。c. 缺乏更多功能,如定时执行、定期执行、线程中断。相比new Thread,Java提供的四种线程池的好处在于:a. 重用存在的线程,减少对象...转载 2020-04-23 11:16:50 · 141 阅读 · 0 评论 -
CountDownLatch的理解和使用
CountDownLatch概念CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务...原创 2020-04-23 11:06:24 · 368 阅读 · 0 评论 -
多线程编程思维导图
一条线程是进程中的单一顺序控制流,一条进程可以并发执行多个线程,每条线程执行不同的任务。一个进程包含有操作系统分配的内存空间,包含一个或多个线程。多线程举例:修一堵墙。单线程:主要步骤分三步,和水泥、搬砖和砌墙,这三个步骤依次执行,比如先搬砖,再和水泥,最后砌墙,串行执行,一个步骤需要等待前一个步骤完成,才会执行,因为有等待,这样效率不够高。多线程:主要步骤分三步,和水泥、搬砖和砌墙,但...原创 2020-04-22 16:52:30 · 403 阅读 · 0 评论 -
网络编程思维导图.png
原创 2020-04-19 17:39:42 · 182 阅读 · 0 评论 -
java集合框架思维导图
一、JAVA集合框架思维导图二、java集合框架图三、Java集合框架体系图原创 2020-04-11 15:12:51 · 666 阅读 · 0 评论