java面试题整理1
一.http协议
二.hibernate缓存模式,级别;Hibernate和mybatis的区别和优缺点
三.SQL优化经验
四.分布式集群和Redis
五.Spring Aop,动态代理;
六.多线程安全问题,多线程实现 thread local
一.HTTP协议(HyperText Transform protocal 超文本协议)
1.超文本协议是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,http1.1版本是一种连续性连接机制,绝大多数web开发都是构建在http协议之上。
2.网页响应过程:输入www.baidu.com回车
域名响应-》发起TCP的3次握手-》建立TCP的连接后发起http请求-》服务器响应http请求,浏览器得到HTML代码-》浏览器解析HTML代码-》页面渲染
3.http 无状态的
协议对于事务处理没有记忆能力
- 主要方法get和post请求方法的区别
1 Get方法主要是向服务器获取资源,post重点是向服务器发送数据;
2.Get传输数据通过URL请求,数据可见,用?连接。对用户可见,明文不安全,Post是通过http的post机制,将字段对应封存在请求实体中发送给服务器,对用户不可见,安全性高;
3.Get方式只支持ASCII字符,中文可能乱码。Post支持标准字符集,可以传输中文。
4.Get传输的数据量小,受URL长度的限制,但是效率高。Post可以传输大量数据,所以上传文件时只能用post;
二.Hibernate
- Hibernate缓存机制和三种状态
缓存就是要将一些经常使用的数据缓存到内存或者各种储存介质中,当再次使用时可以不用去数据库中查询,减少与数据库的交互,提高性能。
再说明一级与二级缓存的作用:一级缓存是Session级别的,也就是说在一个事务中才会启作用。比如在一个事务中同时查询同一个对象,则不会两次去数据库中查询。
而二级缓存是sessionFactory级别的,不同的事务之间是可以共享的,有些权限,当用户首次登陆后便将关联的权限放到二级缓存中,这样每次需要权限时就无需再查询数据库了。
最后再说明为什么这样设计:一般情况下,我们查询的数据一般是实时的,使用二级缓存肯定不行,使用一级缓存既利用了缓存又不会影响实时。
使用二级缓存是为了存储一些比较稳定的数据,如权限,只有在用户修改了权限且重新登录时才能生效。
SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它可以被所有session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。
三种状态:
1. 零时状态(瞬时状态Transient) ,new对象开辟内存空间 User user=new User();
- 持久状态(persistent)
该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识.通过session的 get()、load() 等方法获得的对象都是持久对象。持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化对象是脏的。
- 游离状态(托管状态Detached)
当与某持久对象关联的 session 被关闭后,该持久对象转变为游离对象.当游离对象被重新关联到session上 时,又再次转变成持久对象(在Detached其间的改动将被持久化到数据库中)。游离对象拥有数据库的识别值,但已不在持久化管理范围之内。
2、Hibernate和mybatis区别
Mybatis优势 面向过程
- MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
- MyBatis容易掌握,而Hibernate门槛较高。
- Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
- Hibernate对对象的维护和缓存要比MyBatis好,对增删改查对象的维护要方便。
- Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
- Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳
Hibernate优势 面向对象
相同点:Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。
4.Hibernate工作原理
- 读取并解析配置文件
- 读取并解析映射信息,创建session Factory
- 打开session
- 创建事务transation
- 持久化操作
- 提交事务
- 关闭session
- 关闭session factory
5.为什么要用hibernate
1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他能很大程度的简化DAO层的编码工作
3.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4.hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
6.Hibernate是如何延迟加载
涉及延迟加载的有get和load方法,get不会延迟加载,load会延迟加载。另外在many-to-one关系中可以通过lazy属性设置是否延迟加载。
延迟加载的解释是动态代理机制,在设置延迟加载后,hibernate返回给我们的对象其实是一个代理对象,并不是真正的对象,该对象没有真实对象的数据,只有在真正用到对象时(调用get方法时)时,才会触发hibernate去数据库查找对象的数据,而且返回的数据不会存储在代理对象中,是调试窗口查看不到的值。
- Hibernate类之间的关系
配置many-to-one,one-to-many,many-to-many来实现类之间的关系
三.SQL优化经验
1.用exists代替in,not exists代替not in;in是全表扫描
2.用in代替多个or;用union代替or(适用于索引列)
3.避免在索引列上进行计算,将会全表扫描;在索引列上使用is null和is not null
4.SQL语句大写,因为Oracle是将其转化成大写再执行的
5.union all效率高,但是会有重复数据;
6. 先用where过滤再group by比用group by再having效率高
数据库查询优化
- 对where和order by后的列添加索引;2.尽量避免在where中用null值判断,这样索引会失效对全表扫描,可添加默认值再过滤。同理where中用<>或!=,函数操作(索引失效)
四.分布式集群
上一篇: 引流变现之大学生如何兼职赚钱?
下一篇: Java中的IO流