数据库四大特性:
原子性:要么执行要么不执行
隔离性:正在操作的数据不能被其他事务访问
一致性:要么都成功,要么都失败
持久性:事务提交后,对数据的改变是持久的
数据库隔离级别:
脏读:事务B读取了事务A还没有提交的数据
幻读:事务A修改数据、事务B修改数据,在事务A看来,明明修改了数据,但是结果不符合预期
不可重复读:两个事务读到的数据不一致
mysql两种引擎:
myisam:不支持外键、表锁、查总表数,不需要全表扫描
innodb:支持外键、行锁,查询总表、需要全表扫描
索引:
hash:等值查询快,不能范围查
b+树:数据有序,范围查询
优缺点:索引建的好,查询速度快。更新数据需要更新索引,效率低,如若频繁更改数据,不推荐使用索引
sql优化:
子查询左连接
or条件优化,多个or使用去重
去除不必要的排序
where代替having
联合索引
避免嵌套查询
数据库表结构优化
硬件优化
分库分表:读从库,写主库
spring配置两个数据源,通过AOP,在读或写方法前面进行判断得到动态切换数据源
三大范式:
1NF:属性不可分
2NF:非主键属性,完全依赖主键属性
3NF:非主键属性无传递依赖
java类加载知识
加载、链接、初始化
加载:查找并加载类的二进制数据
链接:
验证:确保加载类无错误
准备:为类静态变量分配内存、并将其初始化为默认值
解析:将类中的符号引用转换为直接引用。
初始化:为累的静态变量赋予正确的初始值。
类的加载内存:
将.class文件中的二进制数据读入内存汇总,将其放在方法区内,在堆区创建这个类的对象,
1)Bootstrap ClassLoader
负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类
2)Extension ClassLoader
负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/ext/*.jar或-Djava.ext.dirs指定目录下的jar包
3)App ClassLoader
负责加载classpath中指定的jar包及目录中class
4)Custom ClassLoader
属于应用程序根据自身需要自定义的ClassLoader,如tomcat
类加载机制
双亲委派机制
JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成类加载任务,就成功返回;只有父加载器无法完成此加载任务时,才自己去加载。