2020-09-23java求职学习求职之路(bean的生命周期,springmvc的框架运行流程,redis当缓存时常见的问题,mysql数据库的调优,mysql索引种类,对spring的理解)

3.bean的生命周期

  1.bean实例化

  2.bean属性注入

  3.调用BeanNameAware的setBeanName()方法

  4.调用BeanFactoryAware的setBeanFactory()方法

  5.调用ApplicationContextAware的setAppliactionContext()方法

  6.调用BeanPostProcessor的预初始化方法

  7.调用InitializingBean的afterPropertiesSet()方法

  8.调用自定义初始化方法

  9.调用BeanPostProcessor的初始化后方法

  10.bean可以使用

  11.调用DisposableBean的destory()方法

  12.调用自定义销毁方法

  13.结束

 //解释

1.Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化

2.Bean实例化后对将Bean的引入和值注入到Bean的属性中

3.如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法

4.如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入

5.如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。

6.如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。

7.如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用

8.如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。

9.此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

10.如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

 

4.springmvc框架运行流程

1.用户将请求发送至DispatcherServlet;
2.DispatcherServlet收到请求查询一个或多个HandlerMapping,找到处理该请求的Handler;
3.HandlerMapping根据请求找到相应的Handler,生成Handler对象返回给DispatcherServlet;
4.DispatcherServlet通过HandlerAdapter调用Handler;
5.Handler(Controller)调用业务逻辑(service)进行处理,处理完成返回ModelAndView;
6.HandlerAdapter将Handler处理结果ModelAndView返回给DispatcherServlet;
7.DispatcherServlet查询一个或多个ViewReslover(视图解析器),将ModelAndView传给指定的ViewReslover;
8.ViewReslover解析后返回具体View给DispatcherServlet;
9.DispatcherServlet对View进行渲染(将模型数据填充至视图中);
10.DispatcherServlet响应用户,View将结果显示在客户端。

5.redis当做缓存时,容易遇见的三种问题:

   (1).击穿

   (2).穿透

     (3).雪崩

6.MySQL数据库怎么调优

  1、选取最适用的字段属性

1) 使用enum而不是varchar。实际上,enum保存的是tinyint类型,但其显示为字符串。用这个字段来作一些选项列表就变得很合适了。比如你有一个字段,比如“性别”、“状态”或“所属部门”等,你知道这些字段的值是固定且有限的,那么可以考虑使用enum。

2) 尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值。

2、优化SQL语句

1)当只需要一条数据时使用LIMIT 1.我们作为开发者,是能够知道我们需要的数据的条数的,若已经知道结果只有一条的时候,一定要使用limit 1 ,这样一来,MySQL在查询到一条数据之后,会立即停止搜索,这会带来性能上的提升。

2)任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描, 

 select id from t where num is null           
可以在num上设置默认值0,确保表中num列没有null值, 
然后这样查询:

      select id from t where num=0
      select id from t where num=10 or num=20
 

3、建立合适的索引。上面说到了其实表的主键就是一种索引。如果某个字段你总要拿来做搜索条件的话,那么为它建立索引吧。这里的原理是,普通的字段建立了索引,索引树的子节点其实是主键,也就是说搜索的时候,先通过普通索引找到主键,再通过主键去查找表中的数据(这个过程叫做回表)。必要的时候,我们还可以建立覆盖索引,比如,需要通过身份证去查询姓名的这个查询很频繁,我们可以建立覆盖索引,也就是对身份证和姓名建立索引,如(idcard,name),这样的话,在索引树中不仅仅有对应的id,还有该行对应的name的值,此时就不需要根据id进行回表操作了。并且建立覆盖索引时需要注意一些原则,比如我现在数据库里只有一个主键索引,身份证姓名索引,此时我们还有一个查询——通过身份证查找地址,但是这个查询并不是很频繁,此时需不需要建立(idcard,address)这个覆盖索引呢?我们需要知道的是,建立索引是会占据表的磁盘空间的,并不是没有任何消耗的。其实这个是没必要的,因为建立了(idcard,name)这个覆盖索引之后,就不用再建立idcard这个索引了。建立覆盖索引需要注意索引的顺序,如果通过建立覆盖索引可以少维护一个索引的话,这个顺序可以优先考虑。另一个就是空间的问题了。比如(name,age)索引,name是比age要大的,索引可以考虑一个(name,age),一个(age)。还有一点需要知道:加了索引是会影响对于数据库写操作的性能的。原因是:数据库需要维护索引树的正确的状态,增加数据就会改变原来的结构,这个过程会带来性能的损耗。但是,不要以为建立索引,就可以为所欲为。其中有一些常用的规则需要去遵循以下的。

面试问题: 做过数据库优化吗?大数据量基础过吗?系统反应慢怎么查询?

这时候就需要你谈一下sql优化相关的内容 以下几个方面:

1、慢查询

2、索引

 

1.慢查询日志

MYSQL的慢查询日志是Mysql提供的一种日志记录方式,它主要是用来记录mysql执行语句过程中,响应时间超过阀值的语句,这个阀值可以通过long_query_time去指定,比如说如果我们将long_query_time指定为5,则意思执行耗时5秒以上的语句都会被我们的慢查询日志给记录下来.

2.慢查询日志的作用

通过使用慢查询日志,我们可以先捕获耗时的语句,然后再结合explain执行计划进行全面的分析,从而达到优化的目的。默认情况下,mysql数据库并没有开启慢查询日志,因为开启慢查询日志记录本身就需要消耗数据库服务器性能,需要我们手动来开启,如果不是专门做优化的话,不建议开启慢查询日志

 

7.MySQL的索引种类

一、简介

MySQL目前主要有以下几种索引类型:
1.普通索引
2.唯一索引
3.主键索引
4.组合索引
5.全文索引

二、语句

CREATE TABLE table_name[col_name data type]

[unique|fulltext][index|key][index_name](col_name[length])[asc|desc]

1.unique|fulltext为可选参数,分别表示唯一索引、全文索引
2.index和key为同义词,两者作用相同,用来指定创建索引
3.col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择
4.index_name指定索引的名称,为可选参数,如果不指定,默认col_name为索引值
5.length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度
6.asc或desc指定升序或降序的索引值存储

三、索引类型

1.普通索引
是最基本的索引,它没有任何限制。它有以下几种创建方式:
(1)直接创建索引

CREATE INDEX index_name ON table(column(length))

(2)修改表结构的方式添加索引

ALTER TABLE table_name ADD INDEX index_name ON (column(length))

(3)创建表的时候同时创建索引

CREATE TABLE `table` (

    `id` int(11) NOT NULL AUTO_INCREMENT ,

    `title` char(255) CHARACTER NOT NULL ,

    `content` text CHARACTER NULL ,

    `time` int(10) NULL DEFAULT NULL ,

    PRIMARY KEY (`id`),

    INDEX index_name (title(length))

)

(4)删除索引

DROP INDEX index_name ON table

2.唯一索引
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
(1)创建唯一索引

CREATE UNIQUE INDEX indexName ON table(column(length))

(2)修改表结构

ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))

(3)创建表的时候直接指定

CREATE TABLE `table` (

    `id` int(11) NOT NULL AUTO_INCREMENT ,

    `title` char(255) CHARACTER NOT NULL ,

    `content` text CHARACTER NULL ,

    `time` int(10) NULL DEFAULT NULL ,

    UNIQUE indexName (title(length))

);

3.主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引:

CREATE TABLE `table` (

    `id` int(11) NOT NULL AUTO_INCREMENT ,

    `title` char(255) NOT NULL ,

    PRIMARY KEY (`id`)

);

4.组合索引
指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合

ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);

5.全文索引
主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
(1)创建表的适合添加全文索引

CREATE TABLE `table` (

    `id` int(11) NOT NULL AUTO_INCREMENT ,

    `title` char(255) CHARACTER NOT NULL ,

    `content` text CHARACTER NULL ,

    `time` int(10) NULL DEFAULT NULL ,

    PRIMARY KEY (`id`),

    FULLTEXT (content)

);

(2)修改表结构添加全文索引

ALTER TABLE article ADD FULLTEXT index_content(content)

(3)直接创建索引

CREATE FULLTEXT INDEX index_content ON article(content)

四、缺点

1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存一下索引文件。
2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。
索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

五、注意事项

使用索引时,有以下一些技巧和注意事项:
1.索引不会包含有null值的列
只要列中包含有null值都将不会被包含在索引中,复合索引中只要有一列含有null值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为null。
2.使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3.索引列排序
查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
4.like语句操作
一般情况下不推荐使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
5.不要在列上进行运算
这将导致索引失效而进行全表扫描,例如

SELECT * FROM table_name WHERE YEAR(column_name)<2017;

6.不使用not in和<>操作

 

      

8.谈谈你对spring的理解

1、IOC做什么

答:帮助我们管理bean、生产bean、管理bean与bean之间的依赖关系。

2、AOP做什么

答:面相切面编程,使用动态代理机制;

动态代理中:

       jdk动态代理:

              传入被代理对象返回代理对象,调用被代理对象中任何一个方法时,可以在其前后加上动作;(被代理对象必须实现接口)

       cglib动态代理:

              传入被代理对象返回代理对象,代理对象是被代理对象的子类,调用被代理对象中任何一个方法时,可以在其前后加上动作;(被代理对象可以不实现接口)

           根据AOP中对于切面、切入点、通知、连接点,可以完成对具体一个package下的类进行拦截管理;

      

3、在你使用的框架中起到了一个什么作用

答:项目在启动时会去加载web.xml,根据xml之中配置内容进行加载,先去加载spring配置文件;根据spring-ioc,加载数据源或的数据信息,

根据SqlSessionFactoryBean向其内部注入数据源配置信息、mybatis配置信息(实体类地址)、映射文件地址,创建出sqlsessionfactory,使用IOCbean与bean之间依赖关系进行注入(ref),通过MapperScannerConfigurer对映射接口与映射文件进行绑定(映射接口在注入过程是通过MapperProxy进行实现的,FactoryBean完成注入和实例化,当调用映射接口时实际调用的是MapperProxy进行操作,调用的是映射文件中的namespace地址下的标签中的id,sqlsession同时在这时创建的),通过管理数据库事务,创建事务管理器(transactionManager),使用springAOP对事务进行管理,通过切点表达式与通知关联,定义需要开启事务的切面(package)和开启的方法名前缀(advice通知),事务的传播(REQUIRED),回滚机制(Throwable),并且开启事务的注解支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值