MyBatis的特点
轻量级半自动ORM模型;(jdbc手动,灵活,代码繁琐,大批量快;hibernate全自动,不用写SQL)
SQL与代码分离,便于统一管理维护;
动态SQL,结果集映射;
SQL编写量较大,不同数据库移植语法可能不同。
jdbc连接流程
加载驱动 Class.forName("com.mysql.jdbc.Driver");
创建数据库连接 con=DriverManager.getConnection(url,name.pwd);
创建Statement实例 pst=con.prepareStatement(sql);
执行SQL ResultSet res=pst.executeQuery(sql)或int rows=pst.executeUpdate(sql);
遍历结果集 res.next();res.getString();
处理异常,关闭资源 res.close();pst.close();con.close();
线程池的优点
降低系统消耗、提高响应速度、方便统一管理。
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
Redis的部署方式
单机模式,一台机器;
主从模式,主数据库负责写操作,从数据库负责读操作,读写分离。
哨兵模式,哨兵通过发送命令,等待Redis服务器响应,从而监控运行多个Redis实例,具备自动故障转移、集群监控、消息通知等功能,主挂了一个从变主;
集群模式,由多个Redis主从组成,数据分片备份;
Spring Bean 默认是单例的,如何保证并发安全
类成员变量线程不安全。
1.@Scope由singleton改为prototype或request,但会增大资源开销
2.使用ThreadLocal存放,可以达到线程隔离,但同线程无法隔离
3.尽量避免成员变量
4.使用并发安全的容器,比如ConcurrentHashMap
、ConcurrentHashSet
等
参考虾皮二面:Spring Bean 默认是单例的,如何保证并发安全?
String为什么不可变,好处
原因:数组变量和类被final修饰,变量被private修饰。
好处:安全。
String ns=Test.appendStr(s),s不会改变。
可能会破坏HashSet等键值的唯一性。
序列化的应用场景
网络传输、对象文件存储、对象缓存存储。
缓存读写策略
1.旁路缓存模式(Redis)。写:先写DB再删除Cache;读:先读Cache,没有再读DB并更新Cache。
2.读写穿透。写:先查Cache,无的话直接写DB,有的话更新Cache,Cache自动更新到DB;读:先读Cache,没有再读DB并更新Cache。
3.异步缓存写入。只更新缓存,不直接更新 DB,而是改为异步批量的方式来更新 DB,对数据一致性带来了更大的挑战。
数据库分区分库分表
参考数据库分区、分表、分库_VickW的博客-优快云博客_数据库分区分表
分区,物理存储分区,均摊到不同的硬盘、系统或服务器中:
水平分区,数据量大,按行分区
垂直分区,列太多或某些列数据量大,按列分区
分表,将一张表分成多张表。而分区只是一张表中的数据存储位置发生改变。
分库,突破单节点数据库服务器I/O能力限制,比如单台DB的存储空间不够。
水平分库,将一张表分成多张表并存放在不同的数据库中。问题:影响主键自增;单表查询会变成多表(如count函数操作)。
垂直分库,将系统中不存在关联关系或需要join的表放在不同数据库或服务器中。问题:ACID被打破;Join操作困难;外键约束受到影响。
工行软开杭州
RPC 参考(看总结)分布式 - 公司使用什么RPC框架,聊聊你理解的RPC原理_Q.E.D.的博客-优快云博客_大公司都用什么rpc框架
重写和重载及原理
重载是静态分派,重写是动态分派;
静态分派发生在编译期,动态分派发生在运行期;
编译看左边,运行看右边;
private,static,final 方法发生在编译期,不能被重写,一旦发生了重写,将会在运行期处理。
数据库优化 语句 索引 建库 慢查询日志 分区分库分表
IOC