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