欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java面试题整理1

程序员文章站 2022-09-24 19:02:40
一.http协议 二.hibernate缓存模式,级别;Hibernate和mybatis的区别和优缺点 三.SQL优化经验 四.分布式集群和Redis 五.Spring Aop,动态代理; 六.多线程安全问题,多线程实现 thread local 一.HTTP协议(HyperText Transf ......

一.http协议

二.hibernate缓存模式,级别;Hibernatemybatis的区别和优缺点

三.SQL优化经验

四.分布式集群和Redis

五.Spring Aop,动态代理;

六.多线程安全问题,多线程实现 thread local

 

一.HTTP协议(HyperText Transform protocal 超文本协议)

1.超文本协议是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,http1.1版本是一种连续性连接机制,绝大多数web开发都是构建在http协议之上。

 

2.网页响应过程:输入www.baidu.com回车

域名响应-》发起TCP3次握手-》建立TCP的连接后发起http请求-》服务器响应http请求,浏览器得到HTML代码-》浏览器解析HTML代码-》页面渲染

 

3.http 无状态的

协议对于事务处理没有记忆能力

 

  1. 主要方法getpost请求方法的区别

1 Get方法主要是向服务器获取资源,post重点是向服务器发送数据;

2.Get传输数据通过URL请求,数据可见,用?连接。对用户可见,明文不安全,Post是通过httppost机制,将字段对应封存在请求实体中发送给服务器,对用户不可见,安全性高;

3.Get方式只支持ASCII字符,中文可能乱码。Post支持标准字符集,可以传输中文。

4.Get传输的数据量小,受URL长度的限制,但是效率高。Post可以传输大量数据,所以上传文件时只能用post

 

二.Hibernate

  1. Hibernate缓存机制和三种状态

缓存就是要将一些经常使用的数据缓存到内存或者各种储存介质中,当再次使用时可以不用去数据库中查询,减少与数据库的交互,提高性能。
再说明一级与二级缓存的作用:一级缓存是Session级别的,也就是说在一个事务中才会启作用。比如在一个事务中同时查询同一个对象,则不会两次去数据库中查询。
而二级缓存是sessionFactory级别的,不同的事务之间是可以共享的,有些权限,当用户首次登陆后便将关联的权限放到二级缓存中,这样每次需要权限时就无需再查询数据库了。
最后再说明为什么这样设计:一般情况下,我们查询的数据一般是实时的,使用二级缓存肯定不行,使用一级缓存既利用了缓存又不会影响实时。
使用二级缓存是为了存储一些比较稳定的数据,如权限,只有在用户修改了权限且重新登录时才能生效。

SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它可以被所有session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。

三种状态:

1. 零时状态(瞬时状态Transient) new对象开辟内存空间 User user=new User();

  1. 持久状态(persistent)

该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识.通过session的 get()、load() 等方法获得的对象都是持久对象。持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化对象是脏的。

  1. 游离状态(托管状态Detached)

当与某持久对象关联的 session 被关闭后,该持久对象转变为游离对象.当游离对象被重新关联到session上 时,又再次转变成持久对象(在Detached其间的改动将被持久化到数据库中)。游离对象拥有数据库的识别值,但已不在持久化管理范围之内。

 

2Hibernatemybatis区别

Mybatis优势 面向过程

  • MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
  • MyBatis容易掌握,而Hibernate门槛较高。
  • HibernateDAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
  • Hibernate对对象的维护和缓存要比MyBatis好,对增删改查对象的维护要方便。
  • Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL
  • Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳

Hibernate优势 面向对象

相同点:HibernateMyBatis都可以是通过SessionFactoryBuiderXML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuiderSessionFactorySession的生命周期都是差不多的。

4.Hibernate工作原理

  1. 读取并解析配置文件
  2. 读取并解析映射信息,创建session Factory
  3. 打开session
  4. 创建事务transation
  5. 持久化操作
  6. 提交事务
  7. 关闭session
  8. 关闭session factory

5.为什么要用hibernate

1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他能很大程度的简化DAO层的编码工作
3.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4.hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

6.Hibernate是如何延迟加载

涉及延迟加载的有getload方法,get不会延迟加载,load会延迟加载。另外在many-to-one关系中可以通过lazy属性设置是否延迟加载。

延迟加载的解释是动态代理机制,在设置延迟加载后,hibernate返回给我们的对象其实是一个代理对象,并不是真正的对象,该对象没有真实对象的数据,只有在真正用到对象时(调用get方法时)时,才会触发hibernate去数据库查找对象的数据,而且返回的数据不会存储在代理对象中,是调试窗口查看不到的值。

  1. Hibernate类之间的关系

配置many-to-one,one-to-many,many-to-many来实现类之间的关系

 

三.SQL优化经验

1.exists代替innot exists代替not inin是全表扫描

2.in代替多个or;用union代替or适用于索引列)

3.避免在索引列上进行计算,将会全表扫描;在索引列上使用is nullis not null

4.SQL语句大写,因为Oracle是将其转化成大写再执行的

5.union all效率高,但是会有重复数据;

6. 先用where过滤再group by比用group byhaving效率高

数据库查询优化

  1. whereorder by后的列添加索引;2.尽量避免在where中用null值判断,这样索引会失效对全表扫描,可添加默认值再过滤。同理where中用<>或!=,函数操作(索引失效)

 

四.分布式集群