MySQL数据库支持多种引擎,其中最为常用的是InnoDB和MyISAM
-
InnoDB,支持事务管理(ACID),支持行锁和外键,是MySQL的默认引擎。
- 支持事务
- 支持行锁
- 支持外键
-
MyISAM,是基于对ISAM存储引擎的扩展,不支持事务,但在数据查询和插入操作拥有较搞的效率。
- 不支持事务
- 查询效率高
- 支持全文检索
- 不支持外键
SQL优化
SQL优化的重心是查询优化,查询优化的重心是建立索引;所以SQL优化只要是避免出现导致索引失效的查询
- 避免在索引列上出现null
- 避免对索引列进行运算
- 避免使用!=(<>)、is null 、 is not null 、 in 、not in等可能导致全表遍历的操作
- 避免使用%进行模糊查询,即使要用尽量在关键词右边使用%
- 尽量避免使用嵌套查询
优化表结构
- 尽量将表字段定义为NOT NULL约束,这时由于在MySQL中含有空值的列很难进行查询优化,NULL值会使索引以及索引的统计信息变得很复杂。
- 对于只包含特定类型的字段,可以使用enum、set 等数据类型。
- 数值型字段的比较比字符串的比较效率高得多,字段类型尽量使用最小、最简单的数据类型。例如IP地址可以使用int类型。
- 尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED。但对整数类型指定宽度,比如INT(11),没有任何用,因为指定的类型标识范围已经确定。
- VARCHAR的长度只分配真正需要的空间
- 尽量使用TIMESTAMP而非DATETIME,但TIMESTAMP只能表示1970 - 2038年,比DATETIME表示的范围小得多,而且TIMESTAMP的值因时区不同而不同。
- 单表不要有太多字段,建议在20以内
- 合理的加入冗余字段可以提高查询速度。
Spring的AOP和IOC
AOP:
1、AOP是Spring中的另一个核心思想
2、AOP的思想面向切面编程
a)思想:在不改变的代码的情况下,动态的在某个方法之前或者之后干点事情。
b)实现
a)动态代理
IOC:
1、IOC是Spring中一大核心思想,指的是把对象的创建权限转交给Spring容器。
2、IOC到底是什么样的思想?
a)之前都是开饭人员自己new对象,生命周期都是开发人员自己负责。
b)把对象的创建,对象的初始化,对象的生命周期全部交给Spring容器的管理(工厂)
c)bean的得到了统一的管理
3、对象的创建
DI:
1、DI指的是依赖注入,某个bean依赖了spring容器中的bean
2、bean和benan之间的依赖关系
http 中重定向和请求转发的区别?
1、转发
a)服务端跳转,所以地址栏不会发送改变
b)如果数据是放到req作用域中,数据不会丢失
c)只能访问Web应用内部资源
d)什么时候要用到转发
1)需要携带数据
2)防止表单重复提交
e)在转发中"/"代表的项目的根目录
1)转发的时候回参考当前路径,需要添加"/ok.jsp"
2、重定向
a)客户端端的跳转,所以地址栏会发生改变
b)实际是发送了两次请求
c)可以访问到外部的资源
d)如果数据放到req作用域数据会丢失
e)什么时候要用到重定向
1)不携带数据
2)访问外部资源
f)在重定向中"/"代表的是站点的位置
1)重定向的时候也会参考当前路径,需要req.getContextPath()+"/ok.jsp"
Cookie 和 Session 的区别
1、Cookie
a)cookie中存的数据只能是字符串,大小是有限制
b)放到客户端,所以不安全
c)cookie中的数据格式是key-value形式的
d)Cookie可以设置最大的生命周期(-1)
2、session
a)数据是放到服务端的,所以很安全,大小没有限制
b)数据类型类型也没有限制
c)数据是key-value形式
d)生命周期是一个会话
1)浏览器关闭
2)服务器重启
3)session超时(默认30m)
4)用户自己注销
e)session底层是通过cookie实现
java双亲委派机制
- Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
- ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。
- AppClassLoader:主要负责加载应用程序的主函数类
作用就是防止类的重复加载,节约内存
SpringBoot启动流程
-
new springApplication对象,利用spi机制加载applicationContextInitializer, applicationLister接口实例(META-INF/spring.factories);
-
调run方法准备Environment,加载应用上下文(applicationContext),发布事件 很多通过lister实现
-
创建spring容器, refreshContext() ,实现starter自动化配置,spring.factories文件加载, bean实例化
SpringBoot自动配置的原理- @EnableAutoConfiguration找到META-INF/spring.factories(需要创建的bean在里面)配置文件
- 读取每个starter中的spring.factories文件
Spring Boot 的核心注解
核心注解是@SpringBootApplication 由以下三种组成
- @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
- @EnableAutoConfiguration:打开自动配置的功能。
- @ComponentScan:Spring组件扫描。
java内存区域
• 堆内存:new 创建的对象和数组,由 Java 虚拟机自动垃圾回收器管理,存取速度慢。
• 栈内存:基本类型的变量和对象的引用变量(堆内存空间的访问地址),速度快,可以共享,但是大小与生存期必须确定,缺乏灵活性。
方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字 节码)等数据
·
Java 中的类加载机制
CAP理论
一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。
开学了,你和同桌互对寒假作业答案,对到一半同桌去了厕所,恰好老师进来要收作业,你决定:AP【交就交吧,有错也无所谓了,交作业要紧】;CP【等同桌回来,把答案对完再交,满分要紧】
Eureak选择AP 保证了可用性降低了一致性 , Nacos 默认 AP ,可以 CP和AP可以切换 , Zookeeper 就是 CP ; Redis AP
synchronized和Lock的区别是什么?
区别:1、lock是一个接口,而synchronized是java的一个关键字。2、synchronized在发生异常时会自动释放占有的锁,因此不会出现死锁;而lock发生异常时,不会主动释放占有的锁,必须手动来释放锁,可能引起死锁的发生。
拦截器和过滤器的区别是什么
1、拦截器(Interceptor)只对action请求起作用 即对外访问路径
而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件
2、拦截器(Interceptor)是在Servlet和Controller控制器之间执行
而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。Filter生命周期
当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
内存泄露和内存溢出的区别是什么?
区别:内存溢出是指程序在申请内存时,没有足够的内存空间供其使用, 系统已经不能再分配出你所需要的空间;内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但是内存泄漏次数多了就会导致内存溢出。