文章目录
sprigMVC
SpringMVC工作原理
(1)客户端发送请求到 DispatcherServlet
(2)DispatcherServlet查询handlerMapping 找到处理请求的 Controller
(3)Controller 调用业务逻辑后,返回 ModelAndView
(4)DispatcherServlet查询ModelAndView,找到指定视图视图将结果返回到客户端
spring
IOC
控制反转,将类的对象的创建交给Spring类管理创建,所以它是基于工厂设计模式的
DI
依赖注入,创建对象实例时,同时为这个对象注入它所依赖的属性
注入方式
通过属性进行注入,通过构造函数进行注入
事务4种特性(属性)
原子性(Atomicity) 指事务是一个不可分割的工作单位,事务中的操作要么都发生, 要么都不发生
一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏)
隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰
持久性(Durability) 是指一个事务一旦被提交,
它对数据库中数据的改变就是永久性的.
7种事务传播行为(机制)
1、REQUIRED
spring默认的事务传播行为;
如果业务方法执行时已经在一个事务中,则加入当前事务,否则重新开启一个事务
2、REQUIRES_NEW
每次都是创建一个新事物,如果当前已经在事务中了,会挂起当前事务
3、NESTED
如果当前已经在一个事务中了,则嵌套在已有的事务中作为一个子事务。
5种事务隔离级别(为了解决读问题)
1.默认,使用数据库默认的事务隔离级别
2.未提交读(readuncommited),脏读,不可重复读,虚读都有可能发生
3.已提交读(readcommited):避免脏读。但是不可重复读和虚读有可能发生
4.可重复读(repeatableread):避免脏读和不可重复读.但是虚读有可能发生
5.串行化的(serializable):避免以上所有读问题
Oracle 默认:已提交读
Mysql 默认:可重复读
不可重复读是指在事务1内,读取了一个数据,事务1还没有结束时,事务2也访问了这个数据,修改了这个数据,并提交。紧接着,事务1又读这个数据。由于事务2的修改,那么事务1两次读到的的数据可能是不一样的,因此称为是不可重复读
幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。InnoDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题。
myBatis
#{}和${}的区别
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
而${}是直接替换成变量的值
如何获取自动生成的(主)键值
若数据库支持自动生成主键的字段(比如MySQL和SQL Server )
< parameterType="com.zz.test.Employee"databaseId="mysql"useGeneratedKeys="true"keyProperty="id">
insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
</insert>
对于不支持自增型主键的数据库(例如 Oracle),则可以使用 selectKey 子元素
<insert id="insertEmployee"parameterType="com.atguigu.mybatis.beans.Employee" databaseId="oracle">
<selectKey order="BEFORE" keyProperty="id" resultType="integer">
select employee_seq.nextval from dual
</selectKey>
insert into orcl_employee(id,last_name,email,gender) values(#{id},#{lastName},#{email},#{gender})
</insert>
Mybatis是否支持延迟加载
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,
association指的就是一对一,collection指的就是一对多查询。
在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false
Mybatis 提供的两级缓存,以及缓存的查找顺序
一级缓存是 SqlSession 级别的缓存,默认开启。
二级缓存是 NameSpace 级别(Mapper)的缓存,多个 SqlSession 可以共享,使用时 需要进行配置开启。
缓存的查找顺序: 二级缓存 一级缓存 数据库
MyBatis 一级缓存失效的几种情况
- 同一个 SqlSession 但是查询条件不同
- 同一个 SqlSession两次查询期间执行了任何一次增删改操作
- 同一个 SqlSession 两次查询期间手动清空了缓存
线程
五种状态
1、新建状态(New):新创建了一个线程对象
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的 start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取 CPU 的使用权
3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码
4、阻塞状态(Blocked):在某一时刻某一个线程在运行一段代码的时候,这时候另一个线程也需要运行,但是在运行过程中的那个线程执行完成之前,另一个线程是无法获取到CPU执行权的,这个时候就会造成线程阻塞
5、死亡状态(Dead):线程执行完了或者因异常退出了
java 线程池概述
java线程池的工作原理和数据库连接池的差不多,因为每次重新创建线程 都是很耗资源的操作,所以我们可以建立一个线程池,这样当需要用到线程 进行某些操作时,就可以直接去线程池里面找到空闲的线程,这样就可以直接使用,而不用等到用到的时候再去创建,用完之后可以把该线程重新放入线程池 供其他请求使用从而提高应用程序的性能
wait 和 sleep 的区别
wait释放资源,sleep不释放资源
servlet 线程安全描述
servlet是单列的,对于所有请求都使用一个实例,所以如果有全局变量被多 线程使用的时候,就会出现线程安全问题,解决方案3种:
1.实现singleThreadModel接口,这样对于每次请求都会创建一个新的servlet实例, 这样就会消耗服务端内存,降低性能,但是这个接口已经过时,不推荐使用
2.可以通过加锁(synchroniezd关键字)来避免线程安全问题。这个时候虽然还是单列, 但是对于多线程的访问,每次只能有一个请求进行方法体内执行,只有执行完毕后,其他线 程才允许访问,降低吞吐量
3.避免使用全局变量,使用局部变量可以避免线程安全问题,强烈推荐使用此方法来解 决 servlet 线程安全的问题
servlet
servlet 生命周期
Servlet 加载->实例化->服务->销毁
- init():在 Servlet 的生命周期中,仅执行一次 init()方法
- service():它是 Servlet 的核心,负责响应客户的请求。每当一个客户请求一个 HttpServlet对象,该对象的Service()方法就要调用
- destroy():仅执行一次,在服务器端停止且卸载 Servlet 时执行该方法
网络
在浏览器中输入url地址到显示主页的过程
http 的长连接和短连接
HTTP1.1默认保持长连接(HTTPpersistentconnection,也翻译为持久连接),
数据传输完成了保持TCP连接不断开等待在同域名下继续用这个通道传输数据;
相反的就是短连接
在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次 HTTP操作,就建立一次连接,任务结束就中断连接。
从HTTP/1.1起,默认使用的是长连接,用以保持连接特性
http 常见的状态码