本文主要是介绍高并发的几个解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
经过查资料,方案如下所示。
1
从最基础的地方做起,优化我们写的代码,减少必要的资源浪费。
a、避免频繁的使用
new
对象,对于整个应用只需要存在一个实例的类,我们可以使用<a href=
"https://www.baidu.com/s?wd=%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y1nAD3rjNbPHc4uyc4uH6z0AP8IA3qPjfsn1bkrjKxmLKz0ZNzUjdCIZwsrBtEXh9GuA7EQhF9pywdQhPEUiqkIyN1IA-EUBtkrj61nHf4P1f3PHcsrHRzPH63"
target=
"_blank"
class
=
"baidu-highlight"
>单例模式</a>。对于String连接操作,使用 StringBuffer或StringBuilder,对于工具类可以通过静态方法来访问。
b、避免使用错误的方式,尽量不用
instanceof
做条件判断。使用java中效率高的类,比如ArrayList比Vector性能好。
2
html静态化
我们通过一个链接地址访问,通过这个链接地址,服务器对应的模块处理这个请求,转到对应的jsp页面,最后生成我们要的数据。但是,如果上千万个请求的话,有太多的高并发请求,那么就会加重服务器的压力,最坏的情况是把服务器down掉。那么如何避免这种情况的出现呢?如果我们把最初对test.
do
的请求结果保存成一个html文件,然后每次用户都去访问这个html文件,这样就不用再去访问服务器了,服务器的压力不就减少了?
那如何自动的生成静态页面,当用户去访问,会自动的生成test.html ,然后再显示给用户。
3
图片服务器分离
对于web服务器来说,图片是最消耗资源的,于是我们有必要把图片与页面进行分离,我们把图片放到独立的图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片的问题而崩溃。在图片服务器上,我们可以对不同的配置进行优化。
4
缓存
具体接触过的缓存机制是hibernate的缓存机制。为了避免每次都向数据库中取得数据,我们把用户常常访问到的数据放到内存中,甚至缓存十分大的时候我们可以把内存中的缓存放到<a href=
"https://www.baidu.com/s?wd=%E7%A1%AC%E7%9B%98&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y1nAD3rjNbPHc4uyc4uH6z0AP8IA3qPjfsn1bkrjKxmLKz0ZNzUjdCIZwsrBtEXh9GuA7EQhF9pywdQhPEUiqkIyN1IA-EUBtkrj61nHf4P1f3PHcsrHRzPH63"
target=
"_blank"
class
=
"baidu-highlight"
>硬盘</a>中。还有高级的分布式缓存数据库使用,都可以增加系统的抗压力。
5
分批传送
在做某项目的时候,一次传递的参数太多,而且数据库规定一次最多传递的参数最多是三万条,当时有五万条记录,那怎么传送呢?最终是分批传送,电梯里一次乘不下那么多的人,会报超重的bug,那就分批把人送上去。
还有一次在考试系统中,如果那么多的考试人员同时提交到数据库中,数据库的压力增大,有时会被down掉,当时采用的方法是使用ajax异步传输,没有等待考生点击提交按钮的时候,就把考生的答案自动提交,这样也避免了突然断电考生前面做过的题出现丢失的现象。
6
数据库集群
当面对复杂的应用,用户大量访问的时候,一台数据很快无法满足需求,于是我们需要使用数据库集群或者库表散列。
我们在应用程序中安装业务和应用或者功能模块将数据进行分离,不同的模块对应不同的数据库或表,再按照一定的策略对某个页面或者功能进行更小的数据库散列。
7
<a href=
"https://www.baidu.com/s?wd=DB&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y1nAD3rjNbPHc4uyc4uH6z0AP8IA3qPjfsn1bkrjKxmLKz0ZNzUjdCIZwsrBtEXh9GuA7EQhF9pywdQhPEUiqkIyN1IA-EUBtkrj61nHf4P1f3PHcsrHRzPH63"
target=
"_blank"
class
=
"baidu-highlight"
>DB</a>优化
a、在<a href=
"https://www.baidu.com/s?wd=%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y1nAD3rjNbPHc4uyc4uH6z0AP8IA3qPjfsn1bkrjKxmLKz0ZNzUjdCIZwsrBtEXh9GuA7EQhF9pywdQhPEUiqkIyN1IA-EUBtkrj61nHf4P1f3PHcsrHRzPH63"
target=
"_blank"
class
=
"baidu-highlight"
>数据库设计</a>的时候就要考虑到后期的维护,数据库三范式是我们设计数据库索要遵循的原则。
b、索引的建立:建立索引要适当,如果一个表经常用来被查询,对于增加和修改很少被用到,我们就可以为这个表建立索引,因为对于增加和修改和删除操作时,我们对索引的维护要大大超过索引给我们带来的效率。
c、表字段的类型选择要恰当
包括字段的长度、类型等,要根据实际存储的数据进行选择,长度不要过长,否则会影响效率。
d、外键要慎用,因为主键代表这一张表,而外键代表一群表,对表之间进行了关联,在删除修改等需要我们关联。
e、在数据库操作上
尽量使用prepareStatement,少用Statement,因为PrepareStatement是进行预编译的。
connection设置为readOnly,Connection是对书库连接,属于重量级,我们使用即可。
连接池的使用,我们可以修改数据库默认的连接数。
这篇关于高并发的几个解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!