- 博客(26)
- 收藏
- 关注
原创 Java线上排查
一般Java线上问题不外乎CPU,内存,磁盘,网络,垃圾回收这几个方面,用linux命令简述一下就是top、free、df,然后jstack、jmap。CPU1.top看一下那些进程占用比较高2.top -H -p pid(进程号),找到占用比较高的线程3.将占用最高的pid转换为16进制printf ‘%x\n’ pid得到nid4.在jstack中找到相应的堆栈信息jstack pid |grep ‘nid’ -C5 –color对jstack文件进行分析,通常我们会比较关注WAITING、
2021-01-30 21:00:06 289 2
原创 如何解决数据库主从数据不一致的问题
数据库集群架构目前流行的数据库集群架构包括以下三点:一主多从:高可用方案,主库挂掉,从库会变成主库;读写分离:减少单机数据库压力,主库提供写服务,从库提供读服务;主从同步:为了保证一致性,从库会实时与主库同步数据,但是会有延迟。可能会产生的问题同步延迟可能会导致主从数据不一致。例如:主库正在进行写操作,从库同时也正在读操作,但此时从库还未同步到主库的最新数据,导致从库读到脏数据。如何解决忽略:在业务不保证数据强一致性的情况下,可以选择忽略(技术永远是为业务提供服务的!);强制性读写主库:
2021-01-23 16:03:12 4437 4
原创 SQL慢的原因
读操作慢在大部分的项目中,对于数据库的读操作是要比写操作多的,所以首先来谈一下读操作慢的原因。如何定位慢SQLMySQL中有慢查询日志,默认是关闭的,需要手动打开。1.查询慢日志是否开启mysql> show variables like '%slow_query_log%';OFF 为关闭 ON为开启2.开启慢查询日志mysql> set global slow_query_log='ON';这种方式只对当前数据库生效,MySQL重启后则会失效。如果要永久生效,就必须修改
2021-01-16 13:47:13 638
原创 数据库大表优化
单表优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万级以下是没有太大问题的。字段:1.尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED2.VARCHAR的长度只分配真正需要的空间3.使用枚举或整数代替字符串类型4.尽量使用TIMESTAMP而非DATETIME,5.单表不要有太多字段,建议在20以内6.避免使用NUL
2021-01-10 15:39:24 533 2
原创 数据库事务
事务是逻辑上的⼀组操作,要么都执⾏,要么都不执⾏事务的四大特性(ACID)原⼦性(Atomicity): 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么完全不起作⽤;⼀致性(Consistency): 执⾏事务前后,数据保持⼀致,多个事务对同⼀个数据读取的结果是相同的;隔离性(Isolation): 并发访问数据库时,⼀个⽤户的事务不被其他事务所⼲扰,各并发事务之间数据库是独⽴的;持久性(Durability): ⼀个事务被提交之后。它对数据库中数据的改变是持久的
2021-01-09 19:48:12 114
原创 关于http
在浏览器中输入url地址到显示主页的过程DNS解析TCP连接发送HTTP请求服务器处理请求并返回HTTP报⽂浏览器解析渲染⻚⾯连接结束来源于《图解HTTP》HTTP长连接,短连接在HTTP/1.0中默认使⽤短连接。也就是说,客户端和服务器每进⾏⼀次HTTP操作,就建⽴⼀次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web⻚中包含有其他的Web资源(如JavaScript⽂件、图像⽂件、CSS⽂件等),每遇到这样⼀个Web资源,浏览器就会重新建⽴⼀个HTTP会
2021-01-04 19:59:16 3217
原创 OSI与TCP/IP
上图来源于 科来网络通讯协议图结合 OSI 和 TCP/IP 的优点,采⽤⼀种只有五层协议的体系结构。应用层应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应⽤层协议定义的是应⽤进程(进程:主机中正在运⾏的程序)间的通信和交互的规则。对于不同的⽹络应⽤需要不同的应⽤层协议。在互联⽹中应⽤层协议很多,如域名系统DNS,⽀持万维⽹应⽤的 HTTP协议,⽀持电⼦邮件的 SMTP协议等等。我们把应⽤层交互的数据单元称为报文。运输层运输层(transport .
2020-12-27 14:27:43 315
原创 Java类加载过程
类加载过程加载->连接->初始化。连接过程⼜可分为三步:验证->准备->解析加载通过全类名获取定义此类的⼆进制字节流将字节流所代表的静态存储结构转换为⽅法区的运⾏时数据结构在内存中⽣成⼀个代表该类的 Class 对象,作为⽅法区这些数据的访问⼊⼝⼀个⾮数组类的加载阶段(加载阶段获取类的⼆进制字节流的动作)是可控性最强的阶段,这⼀步我们可以去完成还可以⾃定义类加载器去控制字节流的获取⽅式(重写⼀个类加载器的 loadClass() ⽅法)。数组类型不通过类加载器创建,它
2020-12-26 14:50:07 323 2
原创 Java垃圾回收机制
堆空间的基本结构eden区、s0区、s1区都属于新生代,tentired 区属于老年代。⼤部分情况,对象都会⾸先在 Eden 区域分配,在⼀次新⽣代垃圾回收后,如果对象还存活,则会进⼊ s0 或者 s1,并且对象的年龄还会加 1(Eden区->Survivor 区后对象的初始年龄变为1),当它的年龄增加到⼀定程度(默认为15岁),就会被晋升到⽼年代中。对象晋升到⽼年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。另外,⼤对象和⻓期存活的对象会直接进⼊⽼年代。M
2020-12-22 20:16:42 153
原创 Java对象的创建过程
1.类加载检查: 虚拟机遇到⼀条 new 指令时,⾸先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引⽤,并且检查这个符号引⽤代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执⾏相应的类加载过程。2.分配内存: 在类加载检查通过后,接下来虚拟机将为新⽣对象分配内存。对象所需的内存⼤⼩在类加载完成后便可确定,为对象分配空间的任务等同于把⼀块确定⼤⼩的内存从 Java 堆中划分出来。分配⽅式有 “指针碰撞” 和 “空闲列表” 两种,选择那种分配⽅式由 Java 堆是否规整(没有内存碎片)决
2020-12-21 18:25:27 151
原创 Java内存区域
线程私有程序计数器1.可以看作是当前线程所执⾏的字节码的⾏号指示器,字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执⾏、选择、循环、异常处理;2.在多线程的情况下,程序计数器⽤于记录当前线程执⾏的位置,从⽽当线程被切换回来的时候能恢复到正确的执⾏位置,所以每条线程都需要有⼀个独⽴的程序计数器。虚拟机栈是由⼀个个栈帧组成,⽽每个栈帧中都拥有:局部变量表、操作数栈、动态链接、⽅法出⼝信息。局部变量表主要存放了编译器可知的各种数据类型(boolean、byte、cha.
2020-12-15 20:30:28 102
原创 Java线程的关键字
synchronizedsynchronized关键字解决的是多个线程之间访问资源的同步性,可以保证被它修饰的⽅法或者代码块在任意时刻只能有⼀个线程执⾏。synchronized使用方式修饰实例方法: 作⽤于当前对象实例加锁,进⼊同步代码前要获得当前对象实例的锁修饰静态方法: 也就是给当前类加锁,会作⽤于类的所有对象实例,因为静态成员不属于任何⼀个实例对象,是类成员( static 表明这是该类的⼀个静态资源,不管new了多少个对象,只有⼀份)。所以如果⼀个线程A调⽤⼀个实例对象的⾮静态 synch
2020-12-13 18:02:55 1576
原创 Java线程总结
线程和进程进程(Process)是系统进行资源分配和调度的基本单位;线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程的六种基本状态1.NEW:线程刚创建,此时没有调用start()方法;2.RUNNABLE: 在JVM中正在运行的线程,其中运行状态可以有运行中RUNNING和READY两种状态,由系统调度进行状态改变;3.BLOCKED: 线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行;4.WAITING : 等待状态,需
2020-12-07 22:02:50 145
原创 Java集合
ArrayList 、LinkedList和Vector1.线程安全:ArrayList 和LinkedList线程都不安全,而Vector是线程安全的,但是性能远不及前两者;2.数据结构:ArrayList使用数组,而LinkedList使用双向链表(JDK1.6前为循环链表,JDK1.7取消了循环);3.时间复杂度:ArrayList:查询get(),因为有数组下标,时间复杂度为O(1);执行add(e)方法时,默认会将元素e追加到末尾,时间复杂度为O(1);指定位置做增删的话(add(i,e)/
2020-12-06 21:14:13 115
原创 对于Java中==、equals()和hashCode()的理解
==和equals()的区别==:基本数据类型比较的是值,引用数据类型比较的是内存地址;equals():1.类没有重写equals()方法时,等价于" == ";2.类重写了equals()方法时,一般是重写用来比较对象的内容。比如:经常使用的String类型数据中equals()方法是用来判断字符串值是否相等(String类中的equals()方法是被重写过的,而Object类的equals()是比较对象的内存地址)hashCode ()hashCode()的作用是获取对象的哈希码(实际上
2020-12-06 16:49:05 125
原创 Java接口和抽象类的区别
接口接口是对行为的抽象,是一种行为的规范;接口中可以有变量和方法,但是变量会被隐式的指定为public static final变量,而方法会被指定为public abstract【所有方法在接口中不能有实现,也说明接口中都是抽象方法】,(Java 8 开始接⼝⽅法可以有默认实现);一个类可以实现多个接口。抽象类抽象类是对类的抽象,是一种模板设计;如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰;一个类只能继承一个抽象类。总结1.成员变量:接口中的成
2020-12-06 15:13:33 2170
原创 Java重载和重写的区别
Java重载和重写的区别重载发生范围:同一个类发生阶段:编译必须相同:方法名可以不同:参数类型、个数、顺序、返回值以及访问修饰符重写发生范围:子类发生阶段:运行必须相同:⽅法名、参数列表、返回值可以不同:抛出的异常范围⼩于等于⽗类,访问修饰符范围⼤于等于⽗类注意:父类方法访问修饰符为private/final/static,则子类不能重写该父类方法。附:Java访问修饰符访问权限访问修饰符同类同包不同类不同包子类不同包private 私有√×××
2020-12-06 13:23:18 134
转载 Mybatis教程四(动态SQL语句)
MyBatis动态SQL语句总体说来mybatis 动态SQL 语句主要有以下几类:if 语句 (简单的条件判断)choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)where (主要是用来简化sql语句中where条件判断的,...
2019-02-21 15:54:11 799
转载 Mybatis教程三(与Spring集成+整合SpringMVC)
Mybatis与Spring集成前面讲到有关 mybatis 连接数据库,然后进行进行数据增删改查,以及多表联合查询的例子,但很多的项目中,通常会用 spring 这个粘合剂来管理 datasource 等。整个Mybatis与Spring集成示例要完成的步骤如下:1、示例功能描述2、创建工程3、数据库表结构及数据记录4、实例对象5、配置文件6、测试执行,输出结果1、示例功能描述...
2019-02-21 11:08:24 353
转载 MyBatis教程二(表关联(一对多+多对一))
Mybatis表关联一对多在Java实体对象对中,一对多可以根据List和Set来实现,两者在mybitis中都是通过collection标签来配合来加以实现。应用场景:首先根据用户 ID 读取一个用户信息,然后再读取这个用户所发布贴子(post)。1、先做一些准备工作创建一个 java 工程,工程名称为:mybatis04-one2many,还需要创建两张表,它们分别是用户表 user,...
2019-02-20 18:04:29 207
转载 MyBatis教程一(入门示例+接口注解+增删改查)
MyBatis教程MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFac...
2019-02-20 16:49:50 437
转载 SpringMVC 框架
SpringMVC 框架教程Spring web MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活、松散耦合的 web 应用程序的组件。MVC 模式导致了应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑)的分离,同时提供了在这些元素之间的松散耦合。模型封装了应用程序数据,并且通常它们由 POJO 组成。视图主要用于呈现模型数据,并且通常它生成客户端的浏览器...
2019-02-14 18:21:58 230
转载 Spring教程四(面向切面编程AOP)
Spring 框架的 AOPSpring 框架的一个关键组件是面向方面的编程(AOP)框架。面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样的常见的很好的方面的例子,如日志记录、审计、声明式事务、安全性和缓存等。在 OOP 中,关键单元模块度是类,而在 AOP 中单元模块度是方...
2019-02-13 17:25:56 169
转载 Spring教程三(注解)
Spring 基于注解的配置从 Spring 2.5 开始就可以使用注解来配置依赖注入。而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身。在 XML 注入之前进行注解注入,因此后者的配置将通过两种方式的属性连线被前者重写。注解连线在默认情况下在 Spring 容器中不打开。因此,在可以使用基于注解的连线之前,我们将需要...
2019-02-13 15:34:36 303
转载 Spring教程二(依赖注入DI+Beans自动装配)
Spring 依赖注入Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系。依赖注入每个基于应用程序的 java 都有几个对象,这些对象一起工作来呈现出终端用户所看到的工作的应用程序。当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能独立于其他 Java 类来增加这些类重用的可能性,并且在做单元测试时,测试独立于其他类的独立性。依赖注入(或有时称为布线)...
2019-02-13 10:50:37 191
转载 Spring教程一(核心概念+IoC容器+Bean定义)
大部分内容源自于网络,主要用于记录笔记心得和与网友分享,非商业用途,侵删。Spring核心概念依赖注入(DI)Spring 最认同的技术是控制反转的依赖注入(DI)模式。控制反转(IoC)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。将依赖关系部分转化为两个类之间的关联。例如,类 A 依赖于类 B。现在,让我们看一看第二部分,注入。所有这一切都...
2019-02-12 17:11:06 412
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人