自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(284)
  • 收藏
  • 关注

原创 Java 堆栈问题排查流程

1.通过top -c命令查看那个进程CPU使用有异常,得到异常进程的pid2.根据ps -mp <pid> -o THREAD,tid,time | sort -k2r查看进程中哪个线程CPU使用异常,得到tid3.因为jstack的栈信息的tid是十六进制的,所以要将tid转化为十六进制printf "%x \n" <tid>4.通过jstack,查看异常堆栈信息jstack -l <pid> | grep <thread-hex-id> -A 10

2021-09-23 14:30:34 711

原创 Dubbo admin安装教程

github下载代码:git clone https://github.com/apache/dubbo-admin.git打包dubbo-admin-server,java -jar 运行想看的界面需要按照nodejsNode.js完成后先installcnpm install运行cnpm run devlocalhost:8080访问

2021-09-23 14:09:36 329

原创 SQL执行计划的十大参数

调用分析指令分析sql再进行对应的调优explaion select ...十个参数:id:编号select_type:查询类型table:表type:索引类型possible_keys:预测可能用到的索引key:实际使用的索引key_len:实际使用的索引的长度ref:表之间的引用rows:通过索引查询到的数据个数Extra:额外信息id 编号id编号代表了执行的顺序。id相同从上到下执行。id越大执行优先级越大。select_type 查询类型SIMPLE:

2021-07-28 14:19:53 916

原创 Docker 部署Kafka

拉镜像docker pull wurstmeister/kafkadocker pull wurstmeister/zookeeper启动zk,暴露2181端口docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper启动kafkazk是docker中的ipdocker run --name kafka01 \-p 9092:9092 \-e KAFKA_BROKER_ID=0 \-e KAFK.

2021-07-28 14:18:14 175

原创 RPC、GRPC、HTTP、REST、SOAP、RMI、HESSIAN

RPC:Remote Procedure Call,远程调用,分布式调用、服务解耦RPC与HTTP都可以实现远程调用。RPC基于tcp也可是http。RPC可以自己定义消息体。RPC自带负载均衡。RPC通过接口访问方法,HTTP通过访问地址。SOAP 是一种RPC框架,HTTP是承载协议,本身是一种应用协议,实现了调用远程就像调用本地接口一样。XMLREST不是一种RPC架构,也不是一种协议,而是一种架构风格。使用HTTP的文本类传输方式。JSONgRPC是谷歌开源的一个RPC框架,二进制

2021-07-27 15:58:13 601

原创 Java fail-fast与fail-safe

fail-fast和fail-safe比较java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。fail-fast产生的原因通过迭代器每次迭代都会去检查modCount等不等于expectedModCoun,如果不等就会抛出ConcurrentModificationException异常,..

2021-07-27 15:50:38 93

原创 SpringBoot @AliasFor注解作用及失效场景

@AliasFor注解主要用于为注解属性声明别名,同步两个属性的值,例如:@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,ElementType.TYPE})@Documentedpublic @interface cs { @AliasFor("value") long scope() default 300; @AliasFor("scope") long value() defau

2021-07-26 15:38:08 852

原创 Redis 如何保证缓存数据与数据库一致

需要根据业务所能接受的影响来采取策略读写请求串行化如果业务场景严格要求缓存和数据库一致,则使用读写请求串行化,吞度量极低旁路缓存策略(Cache Aside Pattern)读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库然后再删除缓存。【不写到缓存中】。为什么不更新缓存?原因是:缓存可能不单单是从数据库取值,还可能是经过复杂计算后才得到的。如果使用一次缓存前经过来二十次写入,每次写入都需要写缓存会花费大量无用的代价。Lazy思想

2021-07-26 15:37:14 142

原创 SpringBoot @ControllerAdvice异常处理

@ControllerAdvice需要与@ExceptionHandler配合使用@ControllerAdvice放在类上,表明这个类用以处理异常@ExceptionHandler(XXException.class)则用在具体的方法上,表示处理特定的异常@ResponseStatus(HttpStatus.BAD_GATEWAY)可以在处理异常后,返回特定的状态@RestControllerAdvice=@ControllerAdvice+@ResponseBody栗子:@GetMappin

2021-07-26 15:36:12 264

原创 SQL 随机查询一条数据

order by 这个关键词可以用数字代替列比如第二列是nameselect * from xx order by 2 就会根据name排序所以随机查询一条数据可以这么写SELECT * FROM XXX ORDER BY RANDOM() LIMIT 1MYSQL的随机函数是rand()

2021-07-22 15:22:18 1151

原创 聚集索引与非聚集索引

聚集索引:本身就是按照某一种规则排列的索引。像字典按字母的查询,因为文章本身就是按照汉子的字母排序的,所以这种按照字母的查询是聚集索引。非聚集索引:索引不是数据本身的排序的索引。比如按照偏旁查汉字,同一个偏旁,在文章本身顺序相差很多。每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。区别:1.每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。2.聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。3.聚集索引插入数据时速度要慢(时间花费在“物理存储

2021-07-22 15:19:59 697 1

原创 建立联合索引的好处

减少开销建一个联合索引 (a,b,c) ,实际相当于建了 (a)、(a,b)、(a,b,c) 三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销!覆盖索引MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机 io 操作。效率高假设有3个过滤条件:c1,c2,c3 每一个条件可以过滤10%的数据。100W的数据单列索引:100W*10%过滤后,需要回表继续过滤c2,c3联合索引:100W*10%*10%*10..

2021-07-21 15:17:47 673

原创 Pg 扩大连接数

查看当前最大连接数show max_connections查看当前连接的数量select count(*) from pg_stat_activity修改最大连接池,默认100找到pg的配置文件postgressql.conf 找到max_connections配置,修改后保存。重启pg,pg_ctl -D pg的data目录 restart,需要以postgres身份去运行,通过su 进行切换...

2021-07-21 15:15:28 576

原创 SpringBoot 自定义注解(三)缓存

主要思想通过切面,对所有被注解修饰的方法进行切面处理@Target({ ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface MyCache { /** * 缓存的key值,也可以直接用方法的参数 * */ SString key() default "";}@Aspect@Componentpublic class MyCach

2021-07-20 11:01:37 246

原创 SpringBoot 自定义注解(二)权限校验

通过注解加上拦截器实现对指定注解参数的拦截注解类:@Target({ ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface PermissionCheck { // 根据参数判断 String resourceKey();}再对过滤的方法上面加注解:@GetMapping("v2")@PermissionCheck(resourceKey = "t

2021-07-20 10:59:48 1225

原创 SpringBoot 自定义注解(一)参数校验

SpringBoot 2.3.0版本之后就没有引入validation对应的包,需要手动引用,依赖如下<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId></dependency>SpringBoot有四个注解用来注解注解的@Retention

2021-07-20 10:56:41 1002

原创 SQL N+1问题

什么是N+1问题?在两个表存在一对一,一对多,多对一,多对多等关联信息时,查询一条数据会衍生N条查询的情况就是N+1问题。比如两个实体类A、B。A与B数一对多,B与A是多对一。在查询A时,会执行的语句如下:1.从A表查找符合要求的属性,此时符合条件的数据有N条,SQL语句执行了1次。2.对于每一条符合的数据,通过它的id去B表查关联信息,此时SQL语句执行了N次。总计查出A和A关联的B数据共执行SQL语句N+1条如何减少N+1通过连接(内,左、右连接)解决JPA的配置spring.jp

2021-07-19 11:06:03 1299

原创 SpringBoot java.lang.InstantiationException

原因是从数据库查出值返回到实体类时,需要有一个无参数的构造函数,如果通过lombok的@Data注解会帮你实现这个类。如果没使用,就需要自己在实体类里写一个无参构造函数,否则抛异常

2021-07-19 10:54:24 211

原创 JPA 多对多映射,查询死循环

解决方法:中断循环即可,首先这不是jpa的问题,是序列化的问题,我们只要中断序列化就可以了。通过注解@JsonIgnoreProperties(value = {"dblist"}),将产生死循环的属性忽略,中断死循环。例子:@Entity@Datapublic class M1 { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String dbn

2021-07-18 19:57:58 357

原创 Java synchronized的锁升级与对象头

1. 对象头存储加锁信息#1. 如何查看对象头通过依赖:<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9</version></dependency>查看方法:Object s=new Object();System.out.print

2021-07-18 19:51:11 314 1

原创 Java 静态代码块、代码块、构造函数什么时候调用

记住以下四点:1.一个类只有被创建实例的时候(new)才会被初始化2. 在被初始化的时候,如果是第一次初始化就会执行静态资源的加载,第一次以后静态资源就不会重复加载了3.静态资源加载的顺序在非静态资源之前4.代码块在每次创建实例的时候都会执行,在构造器之前看例子:public class sss { public static void main(String[] args) { new b(); new b(); }}class b {

2021-07-17 18:21:42 796

原创 PostGis部分时空索引函数

转换函数#1.合并geom:ST_Union(geometry)#2.geom转WKT: ST_AsText(geometry)#3.WKT转geom:ST_GeomFromText(text,4326)#4.获取点对象x、y坐标值:st_x(geometry)、st_y(geometry)#5.获取线/面对象四角点坐标:st_xmin(geometry)、st_ymin(geom)、st_xmax(geometry)、st_ymax(geometry)#6.计算两点之间距离:st_dista.

2021-07-17 18:08:31 405

原创 Spring 如何获得bean

获得bean的核心就是拿到ApplicationContext方法一:通过注入ApplicationContext,调用他的getBean方法:@Autowiredprivate ApplicationContext context;// 通过类获得beancontext.getBean(A.class);// 通过bean的名字获得beancontext.getBean("a")如果getBean()失败则抛异常方法二:可以通过注入ServletContext拿到Applicatio

2021-07-16 15:03:17 135

原创 Git 复制commit给其他分之:cherry-pick

git cherry-pick 可以实现将一个分支上的一部分commit,复制给另外一个分支如果一个分支master上面的提交记录为(git log 查看):a->b->c->d想把master的b提交复制给feature分支,过程:// 查看log,找到commit的hashgit log// 切换到目标分支git checkout feature// 复制commitgit cherry-pick commithash// 这时可能会出现冲突,进行冲突解决后,需要对修

2021-07-16 14:57:06 1343

原创 SpringBoot 拦截器

配置SpringBoot的拦截器分为两块:第一部分是编写拦截器类需要实现HandlerInterceptor第二部分是将自定义拦截器生效编写拦截器类public class AuthInterceptor implements HandlerInterceptor { // 请求处理之前进行拦截(Controller方法调用之前) @Override public boolean preHandle(HttpServletRequest request, HttpSer

2021-07-16 14:53:35 63

原创 SpringBoot 手动注册一个bean并对里面的属性赋值

被创建的bean为DefinedMetaData,里面有一个属性名为resultList的属性RootBeanDefinition metaDatabeanDefinition = new RootBeanDefinition(DefinedMetaData.class);MutablePropertyValues propertyValues = metaDatabeanDefinition.getPropertyValues();// 为创建的bean里面的属性赋值propertyValues.

2021-07-15 15:43:55 665

原创 序列化反序列化导致单例模式的破坏原因及解决方法

首先看一下序列化反序列化导致单例模式被破坏的例子:double-check单例class Singleton implements Serializable { private volatile static Singleton singleton; private Singleton() { } public static Singleton getInstance() { if (singleton == null) {

2021-07-15 11:02:17 1124

原创 SpringBoot @ConditionalOnProperty注解

通过属性值来控制Configuration。类似的注解有@ConditionalOnClass, @ConditionalOnBean,@ConditionalOnMissingbean以@ConditionalOnProperty()为例@ConditionalOnProperty()的参数:prefix:前缀name:属性名havingValue:属性的值matchIfMissing:value没有匹配,是否启用configuration,默认不启用没有前缀(prefix)时,匹配单一属性

2021-07-08 22:26:38 222

原创 JPA EntityManager 自定义语句执行方法:createQuery/createNativeQuery

EntityManager.createQuery()/createNativeQuery()函数的好处是可以根据参数匹配条件,动态生产sql语句去执行。几个通用方法:1.生产Query对象:Query query=EntityManager.createQuery(sql)/createNativeQuery(sql)2.设置分页:query.setFirstResult(第几页offset)query.setMaxResult(每页容量limit)3.执行Query:query.getR

2021-07-08 22:10:37 8908

原创 SpringBoot @Condition注解 实现通过方法来加载bean

相比@Profile,@Condition在控制bean加载的时候更加灵活。根据特定条件进行bean的加载@Condition判断的条件类需要实现Condition接口,并重写matches来实现判断条件注意实现的Condition为org.springframework.context.annotation.Conditionpublic class A implements Condition { @Override public boolean matches(Condition

2021-07-07 22:19:45 276

原创 SpringBoot @Profile注解 实现配置文件控制bean的加载

通过设置spring.profiles.active配置,来实现不同情况下选择实例化不同的Bean根据spring.profiles.active的值来决定加载哪个bean@Configurationpublic class Config { @Bean @Profile("dev") public User u1() { System.out.println("1111"); return new User("dev"); }

2021-07-07 22:07:00 323

原创 SpringBoot 根据自定义条件查找指定目录下的class

ClassPathScanningCandidateComponentProvider可以根据自定义条件查找指定目录下的class构造方法:true代表开启默认过滤TypeFilter,会查出很多不符合要求的类。一般使用false关闭默认过滤TypeFilter ClassPathScanningCandidateComponentProvider scanner=new ClassPathScanningCandidateComponentProvider(false);可以对组件类型进行过滤(是

2021-07-05 14:14:43 583

原创 Java SpringBoot @Import注解

@Import注解须知:1.@Import只能用在类上,@Import通过快速导入的方式实现把实例加入spring的IOC容器中,可以实现@EnableXXX开启bean的加载。2.加入IOC容器的方式有很多种,@Import注解就相对很牛皮了,@Import注解可以用于导入第三方包 ,当然@Bean注解也可以,但是@Import注解快速导入的方式更加便捷@Import的用法1.@Import({A.class,B,class,…})将括号里面的bean加入到spring容器中。可以结合自定义

2021-07-05 14:11:07 745

原创 Java IdentityHashMap与HashMap的区别

判断key是否相等的方式不同,具体看代码:public class IdentityHashMapT { public static void main(String[] args) { String s1="aaa"; String s2="aaa"; String s3=new String("aaa"); // true System.out.println(s1==s2); // false

2021-06-25 17:13:44 109

原创 Java 类加载器

类加载器根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为java.lang.Class对象实例,在虚拟机提供了3种类加载器:引导(Bootstrap)类加载器(启动类加载器)、扩展(Extension)类加载器、系统(System)类加载器(应用类加载器)。【启动(Bootstrap)类加载器】启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,它负责将<JAVA_HOME>/lib路径下的核心类库或-Xbootclassp

2021-06-20 18:08:03 53

原创 Java 四种引用类型及应用场景

强引用:Java中默认声明的就是强引用。只要强引用存在,JVM永远不会回收。//只要obj还指向Object对象,Object对象就不会被回收Object obj = new Object(); //手动置nullobj = null; 软引用:可以当成缓存使用,只有在内存不足的时候才会回收。弱引用:只要进行垃圾回收就会被回收。WeakHashMap,ThreadLocal中应用。虚引用:在回收时得到通知。Nio通过它来实现对直接内存的释放。...

2021-06-17 19:50:07 232

原创 SpringBoot @Scheduled 执行两次的问题

网上有各种说是Tomcat的解决方法,这些并不能解决我的问题。我的情况是这样的:我在写定时任务的时候,想通过配置文件的值来控制是否执行定时任务,于是有了以下的代码:@Configurationpublic class ScheduledConfig{ @ConditionalOnProperty(prefix="scheduled",value="enable",havingValue="true") @Bean public ScheduledAnnotationBeanPostPr

2021-06-16 16:40:49 2474 1

原创 SpringBoot 工具类项目打包问题

SpringBoot项目打包时出现:repackage failed: Unable to find main class Maven原因是没有主类(Main函数),由于是工具包,不需要主类。正常来说是可以打包的,但是有写引入的依赖会包含一个打包插件导致不能打包。解决方法是去掉这个插件:<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>

2021-06-15 16:24:42 455

原创 Java ExecutorService的execute方法和submit方法的区别

execute:提交后如果线程运行后,和主线程就脱离了关系了。当线程的执行过程中抛出了异常,主线程无法获取到异常的信息。submit:线程执行过程中,出现异常,主线程会得到异常直接使用submit,异常也不会显示可以通过sumbit返回Future对象,根据Future.get进行异常捕获...

2021-06-15 15:46:06 1319 1

原创 Java 1.7与1.8的ConcurrentHashMap的区别

【1.7】1.结构:Segment+hashEntry2.先找Segment然后上锁再找hashEntry,如果Segment被锁了就先自旋,一定次数转互斥锁3.通过UNSAFE.getObjectVolatile()保证Segment之间的可见性4.求size():不上锁执行三次计算size,如果相邻两次修改次数相同,则返回;如果三次都不同则锁住所有segment计算5.初始16个segment6.节点是hashEntry7.Segment通过继承ReentrantLock实现对Segmen

2021-06-15 15:39:38 1218 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除