架构师训练营第九周学习笔记
数据库基本原理
使用 PreparedStatement 必要性:
复用
防止 SQL 注入
聚簇索引和非聚簇索引:
聚簇索引:聚簇索引的数据库记录和索引存储在一起。MySQL 数据库的主键就是聚簇索引,主键 ID 和所在的记录行存储在一个 B+树中。
非聚簇索引:非聚簇索引在叶子节点记录的就不是数据行记录,而是聚簇索引,也就是主键。通过非聚簇索引找到主键索引,再通过主键索引找到行记录的过程也被称作回表。
使用合理的索引:
不要建大量索引:每个索引都是一棵树。有多个索引时,执行 ALTER 操作,需要更新每棵树,耗时长,在此期间所有的增删改都会阻塞。对应用而已,由于连接不能释放,所以查询也会被阻塞。
用更小的数据类型建立索引
数据库事务:
事务特性 ACID:
原子性(Atomicity):事务要么全部完成,要么全部取消。如果事务崩溃,状态回到事
务之前(事务回滚)。
隔离性(Isolation):如果 2 个事务 T1 和 T2 同时运行,事务 T1 和 T2 最终的结果是相同
的,不管 T1 和 T2 谁先结束,隔离性主要依靠锁实现。
持久性(Durability):一旦事务提交,不管发生什么(崩溃或者出错),数据要保存在数
据库中。
一致性(Consistency):只有合法的数据(依照关系约束和函数约束)才能写入数据库。
事务日志:
如果全部记录都更新成功,那么事务正常结束,如果过程中某条记录更新失败,那么整
个事务全部回滚,已经更新的记录根据事务日志中记录的数据进行恢复,这样全部数据
都恢复到事务提交前的状态,仍然保持数据一致性。
UNDO:取消本次操作的方法,按照此方法回滚
REDO:重复本次操作的方法
JVM 虚拟机架构原理
类加载器
Java 栈区:程序运行的时候,实际上是以线程为单位运行的,当 JVM 进入启动类的 main 方法的时候,就会为应用程序创建一个主线程,main 方法里的代码就会被这个主线程执行,每个线程有自己的 Java 栈,栈里存放着方法运行期的局部变量
方法区:主要存放从磁盘加载进来的类字节码
堆:程序运行过程中创建的类实例则存放在堆里
程序计数寄存器:当前线程执行到哪一行字节码指令,这个信息则被存放在程序计数寄存器
JVM 垃圾回收性能分析
参考本周的命题作业
Java 代码优化技巧与原理
允许被多个线程安全执行的代码称作线程安全的代码。
方法局部变量
局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。所以, 基础类型的局部变量是线程安全的。
方法局部的对象引用
如果在某个方法中创建的对象不会逃逸出该方法,那么它就是线程安全的。
对象成员变量
对象成员存储在堆上。如果两个线程同时更新同一个对象的同一个成员,那这个代码就不是 线程安全的。
ThreadLocal:
ThreadLocal 类是全局共享的,它为每个线程都分配了一个 map。通过给当前 Thread 绑定一个 map,用于存放当前线程相关的信息。
秒杀系统要点
参考本周的命题作业
版权声明: 本文为 InfoQ 作者【一马行千里】的原创文章。
原文链接:【http://xie.infoq.cn/article/1faf9cbf62cd677e181550d15】。文章转载请联系作者。
评论