1、springmvc 解决获取请求参数的乱码问题
1. GET请求乱码
在apache-tomcat-10.1.7\conf\server.xml中设置URIEncoing=“UTF-8”
<Connector port="8080" URIEncoing="UTF-8" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2. post请求乱码
tomcat初始化组件顺序:监听器–>过滤器–>servlet
<!--配置springMVC的编码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效
2、spring支持的常用数据库事务传播属性和事务隔离级别
事务的传播行为:当事务方法被另一个事务方法调用时,必须指定事务应该如何传播;方法可能继续在现有事务中运行,有可能开启一个新事务,并在自己的事务中运行;事务的传播行为可以由传播属性指定;
事务的属性可以通过@Transactional注解的propagation属性来设置;
数据库事务并发问题:
- 脏读:一个事务读取了另一个事务未提交的数据,如果未提交的事务回滚,读取到的数据就是脏数据。
- 幻读:一个事务在读取某一范围的数据后,由于其他事务对该范围内的数据进行了插入或删除操作,导致多次读取该范围的数据时结果不一致。
- 不可重复读:一个事务在读取某一数据后,由于其他事务对该数据进行了修改,导致多次读取该数据时结果不一致。
数据库事务的隔离级别:
- 读未提交(Read uncommitted):一个事务读到了另一个事务还没有提交的数据。
- 读已提交(Read committed):一个事务要等另一个事务提交后才能读取数据。
- 可重复读(Repeatable read):同一事务下,事务在执行期间,多次读取同一数据时,能够保证读取到的数据是一致的。
- 串行化(Serializable):它是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率最低,比较耗费数据库性能,一般不推荐使用。
事务的属性可以通过@Transactional注解的isolation属性来设置
3、springMVC的工作流程
SpringMVC的工作流程:
- 用户通过浏览器发起 HttpRequest 请求到前端控制器 (DispatcherServlet);
- DispatcherServlet 将用户请求发送给处理器映射器 (HandlerMapping);
- 处理器映射器 (HandlerMapping)会根据请求,找到负责处理该请求的处理器,并将其封装为处理器执行链 返回(HandlerExecutionChain)给 DispatcherServlet;
- DispatcherServlet 会根据 处理器执行链 中的处理器,找到能够执行该处理器的处理器适配器(HandlerAdaptor) --注,处理器适配器有多个;
- 处理器适配器 (HandlerAdaptoer) 会调用对应的具体的 Controller;
- Controller 将处理结果及要跳转的视图封装到一个对象ModelAndView 中并将其返回给处理器适配器(HandlerAdaptor);
- HandlerAdaptor 直接将 ModelAndView 交给 DispatcherServlet ,至此,业务处理完毕;
- 业务处理完毕后,我们需要将处理结果展示给用户。于是DisptcherServlet 调用ViewResolver,将 ModelAndView 中的视图名称封装为视图对象;
- ViewResolver 将封装好的视图 (View) 对象返回给 DIspatcherServlet;
- DispatcherServlet 调用视图对象,让其自己 (View) 进行渲染(将模型数据填充至视图中),形成响应对象 (HttpResponse);
- 前端控制器 (DispatcherServlet) 响应 (HttpResponse) 给浏览器,展示在页面上。
4、mybatis中当实体类中的属性表和表中的字段名不一样,怎么办?
- sql语句中起别名;
- 在mybatis全局配置文件中开启驼峰命名规则;
<setting name="mapUnderscoreToCamelCase" value="true"/>
- 在mapper映射文件中使用resultMap来自定义映射规则;
5、linux系统常用的服务类相关命令
- service(centos6)
service 服务名 start/stop/restart/reload/status
查看服务的方法 /etc/init.d/服务名
- systemctl(centos7)
systemctl start/stop/restart/reload/status 服务名(xxx.service)
查看服务的方法 /usr/lib/systemd/system
设置自启动 systemctl enable/disable service_name
6、git分支相关命令和实际应用
- 创建分支
git branch 分支名
git branch -v 分支名 查看分支
- 切换分支
git checkout 分支名
git checkout -b 分支名 一步完成分支创建并切换
- 合并分支
git checkout master 先切换到主干
git merge 分支名 其他分支何如到主干
- 删除分支
git checkout master 先切换到主干
git branch -D 分支名
7、redis持久化有几种类型,区别是什么
Redis提供了两种不同类型的持久化方式
- RDB (Redis DataBase)
在指定的时间间隔内将内存中的数据集快照写入磁盘,即snapshot快照,恢复时是将快照文件直接读取到内存中;redis备份默认方式 - AOF (Append Of File)
将 redis 执行过的所有写指令记录下来,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了
RDB优缺点
- 优势:
适合大规模数据恢复
对数据完整性和一致性要求不高更适合使用
节省磁盘空间
基于二进制存储的,恢复速度快 - 劣势:
Fork的时候,内存中的数据会被克隆一份,大致2倍的膨胀,需要考虑
虽然Redis在fork的时候使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能
在备份周期在一定间隔时间做一次备份,所以如果Redis意外down的话,就会丢失最后一次快照后所有修改
AOF优缺点
- 优势:
备份机制更稳健,丢失数据概率更低
可读的日志文本,通过操作AOF文件,可以处理误操作 - 劣势:
比RDB占用更多的磁盘空间
恢复备份速度要慢
每次读写都同步的话,有一定的性能压力
存在个别bug,造成不能恢复
8、MySQL 什么时候创建索引
索引:是帮助MySQL高效获取数据的数据结构
-
优点:
提高数据检索的效率,降低数据库的IO成本
通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗 -
缺点
索引在提高查询速度的同时,降低了更新表的速度,如对表进行增删改的操作
索引实际上也是一张表,保存了主键和索引字段, 并指向实体表的记录,所以索引也要占空间; -
哪些情况需要创建索引
主键自动建立唯一索引
频繁作为查询条件的字段应该创建索引
查询中与其他表关联的字段, 外键关系建立索引
单键/组合索引的选择问题, 组合索引性价比更高
查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
查询中统计或者分组字段 -
哪些情况不需要创建索引
表记录太少
经常增删改的表或者字段
where条件里用不到的字段不创建索引
过滤性不好的不适合建索引