java整理1


一.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中用<>或!=,函数操作(索引失效)

 

四.分布式集群


作者:Hannah_He,发布于:2018/08/29
原文:https://www.cnblogs.com/Hannahhe/p/8909795.html