六、Ajax要求Session超时问题
我在做项目时有时会碰着session超时问题,如果session超时,平常要求没有什么问题,通过拦截器可以精确跳到上岸页面,可是你如果用ajax要求的话这就涌现问题了,由于ajax是异步的,局部刷新,以是上岸界面不会再全页面中显示,他只会显示到页面的一部分当中。以是根据我这几年的履历找到了我认为比较好的一种方法。由于那我用的框架是和struts2集成的,以是就在拦截器中进行设置:
首先判断session是否为空便是判断session是否超时,如果超时就取出要求的head头信息request.getHeader(\公众x-requested-with\"大众),如果不为空就和XMLHttpRequest(Ajax标识)进行比较 (request.getHeader(\公众x-requested-with\公众).equalsIgnoreCase(\公众XMLHttpRequest\"大众))) 如果相等解释此要求是ajax要求。
如果是ajax要求就可以用response.setHeader(\公众键\"大众,\"大众值\"大众)来设置一个标识来见告用户这是ajax要求并且session超时时发出的,这样我就可以在回调函数中取出自己设置的那个唯一标识:XMLHttpRequest.getResponseHeader(\公众\"大众);如果取出的值是和自己在后台中设置的值一样的话,就证明session已经超时,这样就可以设置window.location.replace(\"大众上岸界面\公众),来跳转到上岸界面了。
这样做虽然办理了问题,但是,会在每个回调函数中写入那些代码,这样的话代码就会显得特殊零散,以是就想能不能定义一个全局的设置以是就找到了jqery的ajaxSetUp方法,通过ajaxSetUp对jqery的ajax进行全局的判断(ajaxSetUp就相称于ajax的拦截器),通过设置ajaxSetUp里的complete,它就相称于回调函数,这样那就填补了上一方法的不敷。
我做项目时还用到$(document).ajaxStart(),这是ajax要求时的事宜;$(document).ajaxSuccess(),这是AJAX要求成功后的事宜。我一样平常用他们来显示遮罩层和隐蔽遮罩层用的加遮罩层是为了不让用户重复提交,更提高了用户体验度,让用户知道已经提交了。
七、java线程池概述
java线程池的事情事理和数据库连接池的差不多,由于每次重新创建线程
都是很耗资源的操作,以是我们可以建立一个线程池,这样当须要用到线程
进行某些操作时,就可以直接去线程池里面找到空闲的线程,这样就可以直接
利用,而不用等到用到的时候再去创建,用完之后可以把该线程重新放入线程池
供其他要求利用从而提高运用程序的性能。
线程池的核心流程:
1.构建一个 ThreadPoolExecutor 并指定默认要创建的线程的数量
2.通过 threadPool.execute()
去添加一个个要实行的线程即实现了Runable接口的java类
3.在实现了Runable接口的java类的run方法中写入详细的业务代码
线程池的业务场景:
我在事情的时候,当时一个同事给我提了一个需求,目前有大量的图片
须要处理生产缩略图并进行加水印,由于按照普通的处理方法一个个的
进行处理太慢了,问我有没有好的办理方案,这个时候我就想到了java中
的线程池,我构建了一个线程数为5个线程池,然后采取分段批量提取的
办法每500条为一组数据进行图片信息的提取,然后再把这些通过Threadpool的
execute方法交给线程池中的线程进行处理,即充分利用了CPU硬件资源又加快
了大数据情形下程序的处理效率。
我当时在事情的过程中,认识一个做电商的朋友,他们当时公司才起步,很多
技能都不成熟,以是就常常和我磋商一些技能问题,有次他向我请教一个问题,
问我如何才能提高网站的性能,我根据自己在项目中的履历以及自己以前阅读的
关于优化方面的资料给他提出了很多建议,如用lucene进行全文检索,用memcached
进行分布式缓存,以及通过spring定时器结合freeMarker模板引擎来天生静态
页面,由于要天生的页面的数量比较多,考虑到程序的性能,我建议他结合
java的线程池进行事情,这样就可以充分利用了CPU硬件资源又加快
了大数据情形下程序的处理效率。
八、OSCache概述
oscache是一个高性能的j2ee框架,可以和任何java代码进行集成,并且还可以通过标签对页面内容进行缓存,还以缓存要求。
我们常日将那些频繁访问但是又不是常常改变的数据进行缓存。为了担保缓存数据的有效性,在数据发生改变的时候,我们要刷新缓存,避免脏数据的涌现。刷新缓存的策略有两种,一种是定时刷新,一种手动刷新。
缓存数据的机遇常日也分为两种,即在tomcat(web容器)启动时候加载数据进行缓存,其余也可以在用户第一次访问数据的时候进行缓存,这个相称于缓存的立即加载和按需加载。
缓存的层次如下:jsp-->action-->service-->dao,缓存越靠前对性能的提升越大
一个action里面可以有多个service,一个service中可以有多个dao或者多个service
任何类之间都可以进行相互调用,可以通过布局函数传参,set,get传参或者是方法传 参将干系的类连接起来。
九、OSCache+autocomplete+单例业务场景
在我以前做某项目的过程中,个中我们在做产品列表的查询的时候为了提高用户的体验度,我们利用了autocomplete插件来代替select进行品牌的选择,才开始的时候每次都要根据用户输入的信息去查询数据库进行模糊匹配返回结果,后来我们考虑到系统的性能,因此我们采取了oscache缓存,才开始这个功能是交给我们项目组中的其余一个同事来做的,但是他做完后,我们在利用这个工具类的时候,创造有时缓存中明明已经有时我们须要的数据,但是从缓存里面取的时候,创造没有,之后项目经理让我去帮这个同事看看这个问题,我经由阅读他的代码创造,它里面在利用缓存的时候,针对付每次方法的调用都产生一个新的实例,结果导致了上面的问题,这个时候我想起了可以利用设计模式中的单例模式来办理这个问题,才开始我直接采取了普通的单列模式,但是后来在测试的过程中,创造当用户并发量大的时候还是会涌现上面的问题,之后我再次考虑了代码,末了创造是由于没有给单列模式加锁的缘故原由,从而导致了大用户并发的时候,线程安全的问题,之后我便在方法上加上了synchronized关键字,办理上述的问题,但是后来测试职员反馈,觉的这段的性能有问题,我考虑之后便采取在方法体内加锁并结合双重剖断的办法办理了上面的问题。我们是将数据在tomcat启动的时候加载到缓存中,之后用户进行查询的时候直接从缓存中获取数据,根据前缀匹配进行查询,将结果返回给用户。这样在提高用户体验度的同时也提高性能。
十、缓存概述
运用程序为了提高性能,可以通过利用缓存来达到目的,缓存的存储介质可以
内存或者硬盘,常日将数据存储在内存里,确切的说是jvm的内存中,缓存是
基于Map这种思想构建的,以键值对的办法进行存取,之以是还可以将
缓存的数据存储在硬盘中,是由于内存资源相称有限和宝贵,以是当内存资源
不敷的时候,就可以将其存储到硬盘中,虽然硬盘的存取速率比内存要慢,但是
由于减少了网络通信量,以是还是提高程序的性能。缓存可以分为客户端缓存和
做事器端缓存,所谓的客户端缓存常日指的是IE浏览器的缓存,做事器端缓存指
的web做事器的缓存,常日可以通过第三方组件实现,如oscache,memcache
我们常日将那些频繁访问但是又不是常常改变的数据进行缓存。为了担保缓存数据的
有效性,在数据发生改变的时候,我们要刷新缓存,避免脏数据的涌现。刷新缓存的
策略有两种,一种是定时刷新,一种手动刷新。
缓存的层次如下:jsp-->action-->service(常日放置在service)-->dao,
缓存越靠前对性能的提升越大
缓存的策略:(缓存空间不敷须要进行清理的时候利用)
LRU:最近最少利用原则.(理解:存储书)
FIFO:前辈先出的缓存策略.(理解:排队)
你来说说缓存?说说你对缓存的理解(如果碰着重复的,就可以省略)
我们在项目中利用缓存的目的是为了提高运用程序的性能,减少访问数据库
的次数,从而提高运用程序的吞吐量。我们常日将权限,菜单,组织机构
这些频繁访问但是不常常改变的根本数据进行缓存,个中我在做()某某项目的时候
就通过oscache对ZTree的树形菜单进行了缓存,并且在做的时候和单列设计
模式进行结合,考虑到多线程下的安全问题,还对单例模式加入了双重剖断锁
的检讨办法。