java高并发的经验

1:什么是高并发?

什么是高并发,比如从网上下载一个电影,全国有很多人同时在下载这个电影。

比如某个淘宝店铺,有很多店员,某个用户买了这个店铺的商品,多个店员同时去处理这个订单。

从程序的角度来讲,高并发,就是很多人同时访问同一段程序代码,同一个网页,同一个web服务器,同一个数据库,数据表。

2:高并发会引起那些问题?

还是上面的例子,多个人同时去下载一个服务器上的电影,如果服务器不够好,是不是容易挂掉?如果服务器允许的最大连接数不够大,那么是不是有很多用户需要等待,给用户带来的体验效果就会很差。从这个角度来讲,并发会引起反应慢,效率低,用户体验差的问题。

我们的第二个例子,多个店员同时处理一个订单,如果多个店员都成功处理这个订单,那么是不是用户花一份的前,买到了多份的东西,这个例子最经典的银行卡取钱的,两张一样的银行卡,同时去自动取款机取钱,本来银行卡中只有1000元,但是如果并发了,两张卡取钱的时候卡内都有余额1000,那么就可以取出2000元钱。(这里不仅涉及到事务的问题,还涉及到并发的问题)

3:高并发系统的设计需要注意一下几点:
尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。
用jprofiler等工具找出性能瓶颈,减少额外的开销。
优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。
优化数据库结构,多做索引,提高查询效率。
统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。

能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。
解决以上问题后,使用服务器集群来解决单台的瓶颈问题。
基本上以上述问题解决后,达到系统最优。

4:经过查资料,方案如下所示。

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

java高并发的经验相关推荐

  1. Java 高并发_JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过!...

    JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过! 1.JPG (37.82 KB, 下载次数: 0) 2018-12-3 09:40 上传 2.JPG (28 ...

  2. 《重学Java高并发》你管这“破玩意儿”叫锁(没有高并发经验的朋友们看过来,该专栏结合笔者的实战来讲高并发)

    专栏特色:结合10余年的工作经验,在实践中提炼总结高并发经验,将理论落到实处,不仅助力面试,更是真正提高技能. 专栏目录: <重学Java高并发>Sempahore的使用场景与常见误区 & ...

  3. cpu高 thread vm_阿里大佬总结,Java高并发必读!

    作者:wxdoop 原文:https://blog.csdn.net/qq_36235098 来源:前程有光 前言 进程是计算机中程序关于某几何数据集合上的一次运行活动,是系统进行资源分配和调度的基本 ...

  4. 玩转高并发,17年开发经验架构师,历时三年编写Java高并发三部曲

    前言 5G,IO,多屏合一,方物互联时代来了!太分n式.高并发.微服务架构己经成为Java后端应用的主流架构.但是对Java高并发,springcloudRPC底层原理.Nginx底层原理等核心知识, ...

  5. Java高并发三部曲

    疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典极品 : 极致经典< Java 高并发 三部曲 > 面试必备 + 大厂必备 + 涨薪必备 疯狂创客圈 经典图书 : <Ne ...

  6. Java高并发编程学习(三)java.util.concurrent包

    简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...

  7. JAVA高并发(一)——了解并行世界

    最近不知道怎么了,感觉什么东西都需要画画图,梳理梳理思路.写写,而且每每晚上坐到自己的位置上,打开本书,打开篇文章,打开思维导图,打开onenote,再打开音乐,然后就开始静静理解着,梳理着,画图着, ...

  8. java unsafe获取指针_【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  9. Java高并发编程:活跃性危险

    Java高并发程序中,不得不出现资源竞争以及一些其他严重的问题,比如死锁.线程饥饿.响应性问题和活锁问题.在安全性与活跃性之间通常存在依赖,我们使用加锁机制来确保线程安全,但是如果过度地使用加锁,则可 ...

最新文章

  1. python开发需要掌握哪些知识-Python基础学习需要掌握哪些知识
  2. c# 泛型有什么作用?
  3. 进击的二维码 | ArcBlock 课堂预告
  4. 全国Python科研应用专题实操培训班
  5. 洛谷 P4503 [CTSC2014]企鹅QQ 解题报告
  6. 理解分布式和集群的区别
  7. c语言中stdio什么意思6,求助,return,stdio是什么意思,在C语言中又是什么意思
  8. 禁忌搜索算法c语言代码,禁忌搜索算法
  9. Nik Collection 3.0.8 Mac/Win PS/LR超强调色滤镜合集Nik3插件中文版+中文视频教程
  10. 多力食用油:技术赋能产品品质,健康深植品牌理念
  11. IC验证面试必考-跨时钟域
  12. R语言forestplot 根据分组设置不同颜色
  13. arm shell 获取本地键盘输入值_arm Linux 如何自动检测并mount SD卡,以及如何得知已经mount...
  14. python代码画word文档(python+pycharm)
  15. MySQL 多表关联修改语句
  16. 日常吐槽系列~背锅篇
  17. python打包成.exe文件时出现“系统找不到指定路径”
  18. 看雪论坛 android,[分享] KSMA -- Android 通用 Root 技术
  19. 声称代码已开源却迟迟没更新,网友等了好几个月,最终一怒之下把作者挂网上
  20. c语言第4份实验报告,C语言实验报告(四)

热门文章

  1. OpenMV常用函数整理
  2. 【C语言】运算符与操作符的用法全面汇总(非常有用)
  3. [读书笔记] - 《深度探索C++对象模型》第2章 构造函数语意学
  4. 操作系统中分页、分段、交换空间、页面置换算法等相关概念
  5. vscode-textlive-paper学习记录
  6. 2017提高组D1T1 洛谷P3951 小凯的疑惑
  7. ArrayList源码阅读
  8. SPOJ-New Distinct Substrings,注意会爆int
  9. Web前端的学习路线,你真的知道吗?
  10. SDUT oj 选拔赛1 迷之好奇