a.什么是事务:html
事务是程序中一系列严密的操做,全部操做执行必须成功完成,不然在每一个操做所作的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。java
b.事务的四大特性:程序员
1.原子性(Atomicity):一个事务中全部对数据库的操做是一个不可分割的操做序列,要么全作要么全不作web
2.一致性(Consistency):数据不会由于事务的执行而遭到破坏spring
3.隔离性(Isolation):一个事务的执行,不受其余事务的干扰,即并发执行的事务之间互不干扰sql
4.持久性(Durability):一个事务一旦提交,它对数据库的改变就是永久的数据库
参考连接:http://www.javashuo.com/article/p-xqnzomen-dh.html浏览器
http://www.javashuo.com/article/p-peozvczh-cz.html缓存
http://blog.csdn.net/a19881029/article/details/7893622服务器
Hibernate中缓存分为:一级缓存、二级缓存
第一级别的缓存是 Session 级别的缓存,它是属于事务范围的缓存。这一级别的缓存由 hibernate 管理的
第二级别的缓存是 SessionFactory 级别的缓存,它是属于进程范围的缓存
A.为何要用缓存?
目的:减小对数据库的访问次数!从而提高hibernate的执行效率!
B.概念
1)Hibenate中一级缓存,也叫作session的缓存,它能够在session范围内减小数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!
2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。
3)Session的缓存由hibernate维护,用户不能操做缓存内容; 若是想操做缓存内容,必须经过hibernate提供的evict/clear方法操做。
C.特色
只在(当前)session范围有效,做用时间短,效果不是特别明显!
在短期内屡次操做数据库,效果比较明显!
a.缓存相关几个方法的做用:
session.flush(); 让一级缓存与数据库同步
session.evict(arg0); 清空一级缓存中指定的对象
session.clear(); 清空一级缓存中缓存的全部对象
b.批量操做怎样使用上面方法?
Session.flush(); // 先与数据库同步
Session.clear(); // 再清空一级缓存内容
c.不一样的session是否会共享缓存数据?
不会 。不一样的session使用不一样的缓存区,不能共享。
参考连接:详解Hibernate中的一级缓存
hibernate笔记--缓存机制之 一级缓存(session缓存)(这篇文章比较容易理解)
二级缓存是属于SessionFactory级别的缓存机制。第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,通常无需进行干预。第二级别的缓存是SessionFactory级别的缓存,是属于进程范围的缓存。
参考连接:详解Hibernate中的二级缓存
@Configuration把一个类做为一个IoC容器,它的某个方法头上若是注册了@Bean,就会做为这个Spring容器中的Bean。
@Scope注解 做用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件很差归类的时候,咱们可使用这个注解进行标注。
@Scope用于指定scope做用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将做为首选者,不然将抛出异常
@Autowired 默认按类型装配,若是咱们想使用按名称装配,能够结合@Qualifier注解一块儿使用。以下:
@Autowired @Qualifier("personDaoBean") 存在多个实例配合使用
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载
@Async异步方法调用
答:request--请求对象
response--响应对象
page--页面对象
pageContext--页面上下文对象
session--会话对象
application--应用程序对象
out--输出对象
config--配置对象
exception--例外对象
参考连接:jsp内置对象(百度百科)
1.返回的类型不同。list()返回List,iterate()返回Iterator,
2.获取数据的方式不同。
a.list()会直接查数据库,iterate()会先到数据库中把id都取出来,而后真正要遍历某个对象的时候先到缓存中找,若是找不到,以id为条件再发一条sql到数据库,这样若是缓存中没有数据,则查询数据库的次数为n+1。所以:对于list()方式的查询一般只会执行一个SQL语句,而对于iterator()方法的查询则可能须要执行N+1条SQL语句(N为结果集中的记录数).
b.list()方法没法利用一级缓存和二级缓存(对缓存只写不读),它只能在开启查询缓存的前提下使用查询缓存;
iterate()方法能够充分利用缓存,若是目标数据只读或者读取频繁,使用 iterate()方法能够减小性能开销。
c.list()中返回的List中每一个对象都是本来的对象,iterate()中返回的对象是代理对象.(debug能够发现)
3.结果集的处理方法不一样:
list()方法会一次取出全部的结果集对象,并且他会依据查询的结果初始化全部的结果集对象。若是在结果集很是庞大的时候会占据很是多的内存,甚至会形成内存溢出的状况发生。
iterator()方法在执行时不会一次初始化全部的对象,而是根据对结果集的访问状况来初始化对象。一次在访问中能够控制缓存中对象的数量,以免占用过多的缓存,致使内存溢出状况的发生。
总结:
list()方法在执行时,直接运行查询结果所须要的查询语句。
iterator()方法则是先执行获得对象ID的查询,而后在根据每一个ID值去取得所要查询的对象。
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员经过Filter技术,对web服务器管理的全部web资源:例如Jsp,Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Filter实现方式?
答:在HttpServletRequest到达 Servlet 以前,拦截客户的HttpServletRequest 。根据须要检查HttpServletRequest,也能够修改HttpServletRequest 头和数据。
在HttpServletResponse到达客户端以前,拦截HttpServletResponse 。根据须要检查HttpServletResponse,也能够修改HttpServletResponse头和数据。
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起做用,而过滤器则能够对几乎全部的请求起做用。
④拦截器能够访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器能够屡次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器能够获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,能够调用业务逻辑。
参考文章:
Java三大器之拦截器(Interceptor)的实现原理及代码示例
1.客户端发送请求给web容器
2.web容器将jsp首先转译成servlet源代码
3.web容器将servlet源代码编译成.class 文件
4.web容器执行.class 文件5.web容器将结果响应给客户端
参考连接:
方法一:继承Thread类,重写方法run();
方法二:实现Runnable接口,实现方法run();
实现同步有几种方法:例如:synchronized,wait,notify均可以实现同步。
对于GC来讲,当程序员建立对象时,GC就开始监控这个对象的地址、大小以及使用状况。一般,GC采用有向图的方式记录和管理堆(heap)中的全部对象。经过这种方式肯定哪些对象是"可达的",哪些对象是"不可达的"。当GC肯定一些对象为"不可达"时,GC就有责任回收这些内存空间。能够。程序员能够手动执行System.gc(),通知GC运行,可是Java语言规范并不保证GC必定会执行。强制执行垃圾回收:System.gc()。Runtime.getRuntime().gc()
静态类:static的是属于类的,而不是属于对象的,至关因而全局的,不可能被回收
静态变量自己不会被回收,可是它所引用的对象应该是能够回收的。
gc只回收heap里的对象,对象都是同样的,只要没有对它的引用,就能够被回收(可是不必定被回收). 对象的回收和是否static没有什么关系!
如:static Vector pane = new Vector(); pane = null; 若是没有其它引用的话,原来pane指向的对象实例就会被回收。
Java程序员在编写程序的时候再也不须要考虑内存管 理。因为有个垃圾回收机制,Java中的对象再也不有"做用域"的概念,只有对象的引用才有"做用域"。垃圾回收能够有效的防止内存泄露,有效的使用可使用的内存。垃圾回收器一般是做为一个单独的低级别的线程运行,不可预知的状况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或全部对象进行垃圾回收。
参考文章:http://www.cnblogs.com/sstarena/p/6004274.html
1.从地址栏显示来讲
forward 是服务器请求资源,服务器直接访问目标地址url,把那个url的响应内容读取过来,而后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来的,因此他的地址仍是原来的地址。
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器从新去请求那个地址,因此地址栏显示的是新的地址。
因此redirect等于客户端向服务器端发出两次request,同时也接受两次response。
2,从数据共享来看
forward:转发页面和转发到的页面能够共享request里面的数据
redirect:不能共享数据
3.从运用地方来讲
forward:通常用于用户登陆的时候,根据角色转发到相应的模块。
redirect:通常用于用户注销登陆时返回主页面,和跳转到其余网站。
4.从效率来讲
forward:高
redirect:低
a.好比在频繁查询更新较少的状况下使用索引
b.尽可能不要作全表扫描
c.慎用子查询和Union All
d.多表join时尽可能用小表去join大表
e.善用不一样的存储引擎,MySQL有多种不一样的存储引擎,InnoDB,Aria,MEMORY根据须要给不一样的表选择不一样的存储引擎,好比要支持transaction的话用InnoDB等
1.关系型数据库经过外键关联来创建表与表之间的关系,
2.非关系型数据库一般指数据以对象的形式存储在数据库中,而对象之间的关系经过每一个对象自身的属性来决定
参考文章:
参考连接:uml类图(Class Diagram)中类与类之间的关系及表示方式