java web的并发处理

来源:互联网 发布:手机网络棋牌作弊器 编辑:程序博客网 时间:2024/05/21 03:24

并发是什么,之前我觉得就是对数据的一个安全性操作,这样理解也没有错,因为这是数据的并发,那么什么是并发呢?

并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。这也是我之前的理解。


现在我认为对于web系统并发是分为两类的:1.用户量的并发;2.数据的并发

那么怎么处理这两类并发呢,在真实的项目中我也没实践过,仅仅整理了一下别人的成果,如下:


针对用户量的并发处理:

1.网页静态化。

先说说静态化的好处:

1.搜索引擎优化是细节上的优化, 从网站优化来分析,搜索引擎更喜欢静态的网页

2.提高了网站反映速度(或许指的是纯HTML网页,非JSP网页) 

3.静态网页化之网站稳定,从安全角度讲,静态网页不宜遭到黑客攻击,从网站稳定性来讲,如果程序、数据库出了问题,会直接影响网站的访问,而静态网页就避免了如此情况,不会因为程序等,而损失网站数据,影响正常打开

在第一次请求web服务时会执行如下过程:

1.客户端发送请求给web容器 

2.web容器将jsp首先转译成servlet源代码

3.web容器将servlet源代码编译成.class 文件

4.web容器执行.class 文件

5.web容器将结果响应给客户端
所以web第一次为请求提供服务比较慢,从第二次请求开始会省略2、3两个步骤。

在网上有看到有两种方法做Jsp的静态化:

1.部分文章直接用JspWriter的方式输出jsp,我没有经过测试,不知道这种方式性能是不是真的能提升,但是我觉得这种方式还是逃不开上面的5步,所以自我感觉没有意义。

2.部分文章是把要输出的jsp直接编译用HTML的方式保存在服务器了,当用户调用的时候不用查询数据库,而是直接返回该HTML页面,这样也省去web容器对JSP的操作

理论上确实有效果的,但是保存的HTML文件都是些不会变动内容,变动了还要重新保存HTML,感觉吃力不讨好的样子。


对于所谓的静态化,感觉做一下伪静态化倒是个不错的主意,不知道猫扑和天涯是采用的什么方式去做的,或许真的有好的办法也说不定,欢迎大家留言告诉我。

2.图片服务器分离

这种方式主要是减轻服务器的压力,基于带宽和服务器的处理性能的优化,当客户端的浏览器解析服务端传回来的HTML时,会远程调用图片服务器的图片下载,这样就减小了主服务器的压力。

说到图片的话,也要说一下图片缓现技术了,jquery有一个插件lazyload.js,它可以在图片很多的网页中使用,当用户滚动到哪里时哪里再加载图片,可以有效的使用服务器带宽,用户体验也不错,貌似就发现这么一款插件,欢迎大家给我推荐。

3.ajax异步请求

有人说用ajax请求也能减轻服务器的压力,可以不用传整个页面给客户端了,确实是这样。不过我觉得也不能太依赖ajax,要看场合的使用吧,比如说添加和修改等操作还是用表单提交的好。

4.对系统做数据缓存、系统负载均衡处理

数据的缓存缓存都是指放在内存里面的,方便快速读取而不用重新去数据库查询的数据。据说spring对ehchache的支持特别好,看了其它的帖子介绍,hibernate和JDBC都是能够使用这种第三方的缓存机制的,Apache也有相应的缓存机制,不过没用过,个人倾向于ehcache。

再来就是对系统做负载均衡的处理了,这一块的话没有什么太多建议,因为没有从事过,只知道概念,以后再单独写给大家。

5.数据库集群和库表散列

这是针对数据库做的数据库服务器集群,数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可,有时间再具体讨论吧。

6.镜像站点

镜像站其实就是主服务器系统的一个备份,除了带宽和服务器性能可能有差异外,其它都是一样,而且域名也不一样,这样也能起到分散主服务器压力的效果,就是有点麻烦。


一些常用的系统架构服务器分类:图片服务器,页面服务器,数据库服务器,应用服务器,日志服务器等等


针对数据的并发处理:

1.在方法调用时使用synchronize机制。

在调用java方法时,可以使用这种同步机制,只允许一个线程操作里面的数据,也就不会发生脏读,幻读了。

2.给数据库加锁,利用事务的隔离级别

数据库有各种的锁机制,可以避免数据的并发操作,这个大概只能数据库用得到,比如存储过程。JDBC的预编译PreparedStatement 只能对事务进行管理,不会锁表的,所以若是代码去处理可以利用spring的事务管理机制中的隔离级别去处理了。

3.hibernate使用的是version字段判断。

以前做项目用的是hibernate,那时候为了防止数据的并发,就在每个bean中设计了version的字段,当查出来的数字和要更新时的数字显示不相同时,就说明该数据已经被其它用户给操作了,从而判断是否数据安全,这种方式是hibernate倡导的。


暂时知道的也就这么多了,希望大家多提点建议让我改进改进吧,回头熟悉了服务器集群和数据库集群再和大家讨论讨论。


参考资料:

http://baike.baidu.com/view/1417314.htm?fr=aladdin

http://blog.csdn.net/dyllove98/article/details/8588790

http://www.cmhello.com/jquery-lazyload-js.html

0 0
原创粉丝点击