Java部分常见面试题(六)

1:servlet的生命周期
1:加载并实例化
2:初始化 通过调用init() 方法
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样
3:服务 通过service() 方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端
4:销毁 通过调用destroy() 方法
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动
容器启动的时候,会加载servlet的class,并new出这个对象,然后,当用户请求这个servlet的时候,容器会调用init方法初始化这个servlet,这也是整个生命周期中只会调用一次的方法,然后,会调用service方法,由这个方法调用doGet或doPost方法来响应用户,然后,容器在可用资源紧张或是长期没有对Servlet发出请求的情况下,会销毁这个servlet
2:mybatis的生命周期
(一)、SqlSessionFactoryBuilder
  SqlSessionFactoryBuilder的作用就是在于创建SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder就失去了作用,所以它只能存在于创建SqlSessionFactory的方法中,而不要让其长期存在
(二)、SqlSessionFactory
  SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession接口对象。因为MyBatis的本质就是Java对数据库的操作,所以SqlSessionFactory的生命周期在于于整个MyBatis的应用之中,所以一旦创建了SqlSessionFactory的生命周期就等同于MyBatis的应用周期。
(三)、SqlSession
  如果说SqlSessionFactory相当于数据库连接池,那么SqlSession就相当于一个数据库连接(Connection对象),你可以在一个事务里面执行多条SQL,然后通过它的commit、rollback等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给SqlSessionFactory,否则数据库资源就很快被消耗精光,系统应付瘫痪,所以用try…catch…fanally语句来保证其正确关闭
(四)、Mapper
  Mapper是一个接口,它由SqlSession所创建,所以它的最大生命周期至多和SqlSession保持一致,尽管它很好用,但是由于SqlSession关闭,它的数据库连接资源也会消失,所以它的生命周期应该小于等于SqlSession的生命周期。Mapper代表是一个请求中的业务处理,所以它应该在一个请求中,一旦处理完了相关的业务,就应该废弃它
3:mybatis的工作原理
MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。
4:如何优化Hibernate
1、使用双向一对多关联,不使用单向一对多
2、在one-to-many 关系中,将many一方设为主动方(inverse=false)将有助性能的改善。
3、ibernate可以通过设置hibernate.jdbc.fetch_size,hibernate.jdbc.batch_size等属性,对Hibernate进行优化。
fetch_size:
对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,
再去数据库取Fetch Size条数据。因此大大节省了无谓的内存消耗。
当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。
batch_size:
Batch Size是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。
Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。
测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!!!
4、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会 严重显示性能,
所以在使用Hibernate处理大数据量的,可以使用session.clear()或者session.evict(Object)来清除全部或单个的缓存。
5、使用二级缓存
6、查询时:
get()和load方法得到单个对象
list()和iterator()方法得到结果集
load()方法会使用二级缓存,
get()方法在一级缓存没有找到的情况下会直接查询数据库,不会去二级缓存中查找。
对使用了二级缓存的对象进行查询时最好使用load()方法,以充分利用二级缓存来提高检索的效率。
list()方法会一次获得所有的结果集对象,而且它会依据查询的结果初始化所有的结果集对象。
这在结果集非常大的时候会非常占内存。
list()方法只能使用二级缓存中的查询缓存,而无法使用二级缓存对单个对象的缓存,
所以,除非重复执行相同的查询操作,否则无法利用缓存的机制来提高查询的效率。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。
iterator()方法则可以充分利用二级缓存,根据ID检索对象的时候会首先到缓存中查找,
只有在找不到的情况下才会执行相应的查询语句,
转摘 详细提供:
https://blog.csdn.net/sprita1/article/details/9289971
5:SpringMvc的优点
一:完全基于接口编程,真正实现了视图无关。除了jsp,还可以使用Velocity和xstl或其他视图技术,甚至是自定义的视图技术–只需要简单的实现view接口
二:Spring MVC框架以DispatchServlet为核心控制器,该控制器负责拦截用户的所有请求
三:Spring MVC所有控制器都必须实现Controler接口,该接口定义了ModelAndView handleRequest(request,response)方法,通过实现该接口实现用户的业务逻辑控制
四:清晰的角色划分:控制器(controller)、验证器(validator)、命令对象(command obect)、表单对象(form object)、模型对象(model object)、Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、试图解析器(view resoler)等等。每一个角色都可以由一个专门的对象来实现
五:文件的上传
六:项目层次构架的清晰
6:什么是Spring Beans
Spring Beans是构建Spring应用的Java对象 这是对象有Ioc容器来进行实例化 组装和管理
7:Spring 配置Bean的方式
1:基于xml的配置
2:基于注解的配置 spring注解
3:基于类的Java的配置
8:applicationcontext有哪些类
ApplicationContext由BeanFactory派生
主要使用类有
1:ApplicationContext
2:AnnotationConfigApplicationContext
3:WebApplicationContext
4:ConfigurableWebApplicationContext
等等…
9:Mybatis动态Sql是做什么的?有哪些动态sql
解决mysql的变量拼接 可以间接的理解为使用标签来减少sql语句的书写量
动态标签
if 、choose (when ,otherwise) 、trim(where,set)、foreach
10:#{}和${}的区别是什么

 #{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。

11:谈谈SpringIOC的优点
IOC(Inversion of Control),即“控制反转” 一种设计思想 依赖倒置原则
并且通过bean注入的方式将其所需要的功能注入到某个需求当中 当Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关系业务逻辑本身就可以了
12:include的静态以及动态引用的区别
1:静态include主要是对静态页面的引入,不会检查所包含文件的变化
2:动态include主要是对动态页面的引入,它总是会检查所引入的页面的变化,如果所包含的资源在请求间发生变化,则下一次请求包含jsp:include动作的jsp时,将包含资源的新内容。
优点:
1:引入和同步一个动态的页面,使jsp页面更具灵活性
2:能和不同页面之间进行信息的交互和快捷的实现方式
3:改变了原始的所有页面编码都放在一个jsp上,使不同的功能分别写在不同页里
4:jsp页面代码的归纳整理 如通用css样式 js脚本 则可通过include包含进行调用
13:List Map Set 的区别
1.List可以有重复对象
2.Set不可以有重复对象
3.Map是键值对的
4.List Set 都是实现 collection 接口,Map是一个独立的接口
14:ArrayList的储存方式
线性存储
内存采用 Object[]数组来进行保存数据

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值