- 博客(36)
- 收藏
- 关注
原创 事务嵌套问题Transaction rolled back because it has been marked as rollback-only
在事务方法中调用其他事务方法时,因为spring事务传播属性,会将事务合二为一。当子方法报错抛异常时,spring将该事务标记为 rollback only。父方法再执行事务就会报Transaction rolled back because it has been marked as rollback-only异常。代码:// 父方法 @Transactional(rollbackFor = Exception.class) public void test() {
2020-10-19 11:11:53
628
原创 JVM提问----个人笔记,不喜勿喷
什么时候会尝试触发Minor GC新生代内存区域基本快满了,再次分配对象的时候,发现空间不足触发Minor GC之前会检查老年代大小?检查老年代可用内存空间,是否大于新生代所有对象的总大小,如果大于新生代所有对象,就可以发起Minor GC 老年代可用空间小于新生代的所有对象大小,检查'-XX:HandlePromotionFailure'的参数是否设置,如果设置了,就检查老年代的内存大...
2020-04-26 15:39:04
233
原创 Redis问题---个人记,不喜勿喷
redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看)单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。redis中io多路复用器模块是单线程执行,事件处理器也是单线程执行,两个线程不一样。所以实际redis应该是单进程多线程,只是不同的模块都用的单线程实现。两个维度来举例:(1)若是client...
2020-04-08 16:05:10
998
原创 MySql B+树索引-个人记录,不喜勿喷
MySql Innodb索引:B+树 全文索引 哈希索引B+树有n个子树的中间节点包含n个元素,每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。 所有叶子节点包含元素的信息以及指向记录的指针,且叶子节点按关键字自小到大顺序链接。 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。所有的数据都在叶子节点,且每一个叶子节点都带有指向下一个节点...
2020-04-03 14:51:40
241
原创 秒杀demo
简单的秒杀demo,使用redis缓存令牌和库存,可水平扩展@RequestMapping(name = "/seckill", method = RequestMethod.POST) public String seckill(){ RedisAtomicLong stockAtomic = new RedisAtomicLong(test_stock, r...
2020-04-02 11:26:02
207
原创 Redis集群个人笔记
Redis有三种集群模式:1、主从模式2、Sentinel模式3、Cluster模式主从模式主从模式是三种模式中最简单的,分为两类:主数据库(master)和从数据库(slave)读写分离策略:从节点可以扩展redis的读能力,有效应对大并发量的读操作一个master可以拥有多个slave,一个slave只能对应一个master slave挂了不影响其他节点工作...
2020-02-29 10:20:25
350
原创 Mysql事务隔离级别和传播机制
事务的特性:原子性:事务不可分割,组成事务的各个逻辑不可分割一致性:事务执行的前后,数据完整保持一致隔离性:事务执行不应该受到其他事务的干扰持久性:事务一旦结束,数据就持久化到数据库中如果不考虑事务的隔离性,会引发一些安全问题:脏读: 一个事务读取到另一个事务未提交的数据。不可重复读:一个事务读取到另一个事务提交的更新的数据,导致多次查询结果不一致。幻读:一个事务读...
2020-02-12 15:36:05
584
原创 垃圾回收个人看
JVM内存区域:1、虚拟机栈: 方法执行时的内存模型,是线程私有的,生命周期跟线程相同。方法执行时入栈,方法执行完出栈,出栈相当于清空数据,所以这块不需要GC。2、本地方法栈: 与虚拟机栈功能非常类似,区别在于虚拟机栈为虚拟机执行java方法时服务,而本地方法栈为虚拟机执行本地方法时服务,也不需要GC.3、程序计数器: 线程独有,可以看作是当前线程执行的字...
2020-02-12 13:49:27
216
1
原创 Redis过期策略和内存淘汰机制
场景:Redis只能存5G数据,写入10G数据Redis过期策略:定期删除+惰性删除策略定期删除:默认100ms检查是否有过期的key,有过期key则删除。redis不会检查所有key,而是随机抽取进行检查。因此,可能会导致很多key过期没有删除。惰性删除策略:在获取key的时候,redis会检查key是否过期。可能存在的问题:定期删除没有删除key,也没有请求获取key,也就是说...
2019-11-12 19:13:14
141
原创 Springboot整合RabbitMQ
添加依赖 <!-- 添加springboot对amqp的支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </...
2019-11-11 12:22:25
158
原创 Windows安装RabbitMQ
下载erlang,地址:https://www.erlang.org/downloads配置环境变量下载rabbitMQ,地址:https://www.rabbitmq.com/download.html执行:rabbitmq-plugins enable rabbitmq_management这样就启动了管理工具,可以试一下命令:停止:net stop Rab...
2019-11-05 23:16:06
149
原创 MQ常见面试题
消息中间件什么是MQ为什么要使用MQ1、如何避免消息重复投递和重复消费在生产数据时,消自体中必须要有一个bizId作为去重依据在消费一条消息的时候,自己判断一下是否已经消费过了2、消息丢失,如何保证消息的可靠性传输消息丢失,可能出现在生产者,MQ,消费者;生产者丢失:生产者发送数据到MQ的时候,可能因为网络问题半路搞丢了。可以选择MQ的事...
2019-10-18 23:03:44
877
原创 Redis分布式锁注意点
死锁 为了防止死锁,必须设置过期时间例如:线程A拿到锁,还没有解锁,程序突然挂掉,锁一直存在,其他线程一直拿不到锁。所以要设置过期时间 加锁跟解锁必须是同一个线程,保证原子性 例如:线程A拿到锁,业务还没有处理完成,锁已经超时被自动删除掉了;线程B拿到锁,线程A解锁的时候必须判断值是当前线程,否则删掉线程B的锁。可重入锁和锁的原子性,可以用到ThreadLoca...
2019-09-21 11:53:00
335
原创 微服务“定义”
翻译:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(HTTP)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。微服务的特点:每个微服务可独立运行在自己的进程里;意味着每个微服务都有tomcaa...
2019-09-08 19:59:40
456
原创 Spring事务死锁
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction### The error may involve com.example...
2019-09-07 19:32:07
1663
原创 Redis缓存设计原则
缓存热数据 缓存读写顺序:读,先缓存,后数据库;写,先数据库,后缓存 所有缓存数据都应该设置过期时间 缓存的过期时间应该避免集中过期,造成缓存击穿 缓存key具备可读性,应避免不同业务出现同名的key,简单缩写可节省内存空间 避免缓存穿透,数据库中查不到的数据,可在Redis中设置空值,以避免缓存无数据而每次达到数据库 缓存预热,上线之前可预先将数据写入缓存中 数据一致性问题,...
2019-09-05 22:29:58
605
原创 Spring嵌套事务失效的问题
直接上代码 @Transactional public void methodA() { try { methodB(); } catch (Exception e) { e.printStackTrace(); } CatalogEntity record = new CatalogEntity(); catalogEntityMapper.insert(...
2018-09-28 15:21:04
2319
翻译 高并发限流
限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页或告知资源没有了)、排队或等待(比如秒杀、评论、下单)、降级(返回兜底数据或默认数据,如商品详情页库存默认有货)。 常见的限流算法有:令牌桶、漏桶。计数器也可以进行粗暴限流实现。 一、使用Redis实现 存储两个key,一个用于计时,一...
2018-09-02 14:54:25
282
翻译 Spring中BeanFactory跟FactoryBean的区别和联系
BeanFactory BeanFactory是接口,用于管理Bean的一个工厂。BeanFactory是IOC容器的核心接口,它主要作用就是实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。 BeanFactory只是一个接口,并不是IOC容器的具体实现,Springp容器提供了很多种实现,如:XmlBeanFactory、ApplicationContext等。现在...
2018-08-12 00:01:21
4218
翻译 Java-Interview
https://github.com/crossoverJie/Java-Interview本项目多数是一些Java基础知识,底层原理,算法详解。
2018-08-09 10:55:24
349
翻译 ReentrantReadWriteLock读写锁
ReentranReadWriteLock读写锁,内部维护了二个锁,一个用于读操作支持多线程并发执行,一个用于写操作只能单线程执行。在多线程的场景下,如果对资源加了写锁,其它线程无法再获取写锁和读锁;如果对资源加了读锁,其它线程可以继续加读锁,也就是说可以多线程同时读的操作。在实际应用中,读多写少的情况下,能够提供更好的并发性和吞吐量。功能:支持公平和非公平获取锁的方式 可...
2018-07-23 11:34:14
162
翻译 Synchronized与Lock
锁类型:可重入锁:在对象中所有同步方法不用再次获得锁 可中断锁:在等待获取锁的过程中可以中断当前线程 公平锁:等待获取锁的时间长的优先获取锁,队列效果 读写锁:读的时候可以多线程一起读,写的时候必须同步//可重入锁:在调用methodE,执行methodD时不需要再次获得锁 public void methodD(String str) throws Exception {...
2018-07-23 11:12:05
303
翻译 java线程池ExecutorService
线程池的作用:1、减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务;2、可以根据系统的承受能力,调整线程池的数量,防止消耗过多的内存;Java通过ExecutorService提供了四种线程池:1、Executors.newFixedThreadPool(5) : 创建一个定长的线程池,可控制线程最大并发数,超出的线程会在阻塞队列中等待,线程可重复利用,默认没...
2018-06-28 22:42:10
261
翻译 Java并发Semaphore、CountDownLatch、CyclicBarrier
Semaphore semaphore又称信号量,在并发编程中,通过许可证控制线程并发数new Semaphore(N,isFair) ; n是同时运行线程数,fair是否公平,默认false;公平:在获取许可时首先查看等待队列中是否已有线程,如果有就加入队列末尾,等待唤醒。非公平:在获取许可时,先尝试获取许可,如果失败才会加入队列。acquire(); 获取许可,许可数减1。release...
2018-06-27 22:10:50
229
翻译 CAS单点登陆基本流程
流程图步骤详解1、浏览器请求服务资源,无session信息,返回302重定向CAS服务地址2、重定向请求CAS服务器,发送cookie信息请求认证,认证失败返回登陆页面3、提交用户密码到CAS服务器请求登陆,返回认证信息重定向CAS客户端4、重定向CAS客户端发送认证信息,客户端向CAS服务器请求认证,返回确认登陆5、登陆成功,CAS客户端重定向请求地址以上是第一次访问服务资源或者session认...
2018-06-12 23:45:55
369
翻译 Spring Bean介绍
1. 实例化一个Bean,也就是我们通常说的new2. 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入3. 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID。实现该接口可以获取当前Bean的名字。4. 如果这个Bean实现了BeanFactoryAwar...
2018-06-11 23:28:50
229
翻译 Spring声明事务和编程事务
1、编程式事务:是指通过编码的方式实现事务,类似JDBC编程实现事务管理,一般使用TransactionTemplate.2、声明式事物:是建立在AOP之上,对方法前后拦截,在目标方法执行完之后提交或者回滚事务。其优化就是不需要重复的代码进行事务管理,只需要配置(@Transactional注解)即可。唯一不足的是只能做到方法级别,如果需要细粒度代码块级别,只能使用编程式。...
2018-06-11 23:08:41
169
翻译 SpringBoot指定内置tomcat版本
1、在pom文件中配置tomcat版本<properties> <tomcat.version>8.0.42</tomcat.version></properties>2、指定tomcat版本,启动项目有时候会报异常,这是因为tomcat缺少jar包,需要添加依赖:<dependency><groupId>org.apa...
2018-06-11 22:55:17
7159
1
翻译 Spring容器启动过程
Spring容器的启动方式有两种:1、提供ApplicationContext自己创建Spring容器 通过ClassPathApplicationContext初始化容器,加载spring.xml配置文件,然后解析配置文件,初始化Bean,注册Bean。2、Web项目中在web.xml中配置监听器 web容器在启动时加载ContextLoaderListener,执行initWebA...
2018-06-11 22:47:15
182
翻译 Dubbo安装部署
Dubbo入门Demo 这里主要采用Dubbo与Zookeeper、SpringBoot框架整合。步骤:1. 安装Zookeeper2. 创建Maven项目,服务提供者和服务消费者,并与ZK、Dubbo整合3. 部署Dubbo-admin、Dubbo-Monitor实现管理和监控一、 Zookeeper安装 Zookeeper是一个分布式的服务框架,是树型的目录服务...
2018-04-25 23:10:30
9885
2
翻译 Dubbo简介
Dubbo背景和简介 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,就是个远程服务调用的分布式框架,以服务者与消费者的方式在dubbo上注册。 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
2018-04-24 22:48:03
834
翻译 Hadoop关于MapReduce
简述MapReduce是一种可用于数据处理的编程模型,用以进行大数据量的计算。Hadoop可以运行各种上语言版本的MapReduce程序。MapReduce程序本质上是并行运行的,因此可以将大规模的数据分析任务分发给任何一个拥有足够多机器的数据中心。MapReduce的优势在于处理大规模数据集。为了加快处理速度,我们需要并行处理程序来进行数据分析。从理论上讲,我们可以使用计算机上所
2017-10-20 22:42:27
394
翻译 jdk1.8之前版本------->HashMap简述
以下是JDK1.8之前版本的源码简介一、什么是HashMapHash:散列将一个任意的长度通过某种(hash函数算法)算法转换成一个固定值。Map:存储的集合HashMap是数组+链表的数据结构总结:通过hash出来的值,然后通过这个值定位到这个map,然后把这个value存储到这个map中。此类不保证映射顺序,也不保证映射顺序恒久不变。数组长度默认16
2017-10-14 14:15:47
332
翻译 Java内存泄露和溢出
基本概念内存泄露:程序中动态分配内存给临时对象,但是对象不会被GC所回收,它始终占用内存。从而引发内存溢出内存溢出:程序运行过程中无法申请到足够的内存而导致的一种错误。内存泄露是导致内存溢出的一种诱因,但不是唯一的因素。Java堆溢出(OutOfMemoryError:Java heap space)堆是用来存储对象实例的,因此如果我们不断地创建对象,并且使创建的对
2017-10-12 22:05:56
249
翻译 JVM堆与栈
数据类型java虚拟机中,数据类型可以分为二大类:基本数型和引用类型。基本类型的变量保存原始值,即:代表的值就是数据值本身;而引用类型的变量保存引用值。‘引用值’代表了某个对象的引用,而不是对象的本身,对象的本身存放在这个引用值所表示的地址的位置。基本类型:byte,short,int,long,char,float,double,boolean引用类型:对象,数组
2017-10-11 21:37:14
184
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅