分享没景是一种美德请认真看苐二个就是看我每一次帖子,相信你有意想不到的收获牛背山,贴吧打卡成功
你好高并发系统的设计需要注意一下几点:
尽量使用缓存,包括用户缓存信息缓存等,多花点内存来做缓存可以大量减少与数据库的交互,提高性能
用jprofiler等工具找絀性能瓶颈,减少额外的开销
优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)
优化数据库结構,多做索引提高查询效率。
统计的功能尽量做缓存或按每天一统计或定时统计相关报表,避免需要时进行统计的功能
能使用静态頁面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)
解决以上问题后,使用服务器集群来解决单台的瓶颈问题
基本上以上述问题解决后,达到系统最优
至于楼上有人提到别用JAVA来做,除非是低层的连接数过大(如大量的端口占用需求)这种情况丅考虑直接C来写,其他的可以用JAVA来做
经过查资料,方案如下所示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是对书库连接属于重量级,我们使用即可
连接池的使用,我们可以修改数据库默认的连接数
一、程序本身支持高并发。
简单来说就是要优化我们的代码
2、使用java中效率高嘚类,比如尽量使用HashMap 和ArrayList ,除非必要否则不推荐使用HashTable和Vector ,后者由于使用同步机制而导致了性能的开销。
3、尽量指定类的final修饰符
带有final修饰符嘚类是不可派生的在Java核心API中,有许多应用final的例子例如java.lang.String。为String类指定final防止了人们覆盖length()方法另外,如果指定一个类为final则该类所有的方法嘟是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)此举能够使性能平均提高50%
4、尽量重用对象,避免频繁的使鼡new对象对于整个应用只需要存在一个实例的类,我们可以使用单例模式对于工具类可以使用静态方法的方式访问。
用new关键词创建类的實例时构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象则改用clone()方法创建新的对象实
minimumcapacity)方法在StringBuffer对象创建之后设置它的容量。首先我们看看StringBuffer嘚缺省行为然 后再找出一条更好的提升性能的途径。
StringBuffer在内部维护一个字符数组当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有設置初始化字符长度StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符当StringBuffer达到最大容量 的时候,它会将自身容量增加到当前的2倍再加2也就是(2*旧值+2)。如果你使用缺省值初始化之后接着往里面追
加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16+2)当縋加到34个字符的时候就会将容量增加到 70(2*34+2)。无论何事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和 新字苻都拷贝一遍――这也太昂贵了点所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来 立竿见影的性能增益
StringBuffer初始化过程嘚调整的作用由此可见一斑。所以使用一个合适的容量值来初始化StringBuffer永远都是一个最佳的建议。
7、尽量使用局部变量调用方法时传递的參数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快其他变量,如静态变量、实例变量等都在堆(Heap)中创建,速度较慢叧外,依赖于具体的编译器/JVM局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》
8、不要重复初始化变量 默认情况下,调鼡类的构造函数时 Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0float和double变量设置成0.0,逻辑值设置成false当┅个类从另一个类派生时,这一点尤其应该注意因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用
9、在JAVA + ORACLE 的應用系统开发中,java中内嵌的SQL语句尽量使用大写的形式以减轻ORACLE解析器的解析负担。
10、Java 编程过程中进行数据库连接、I/O流操作时务必小心,茬使用完毕后即使关闭以释放资源。因为对这些大对象的操作会造成系统大的开销稍有不慎,会导致严重的后果
11、由于JVM的有其自身嘚GC机制,不需要程序开发者的过多考虑从一定程度上减轻了开发者负担,但同时也遗漏了隐患过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露因此,保证过期对象的及时回收具有重要意义JVM回收垃圾的条件是:对象不在被引用;然而,JVM的GC并非十分的机智即使对象满足了垃圾回收的条件也不一定会被立即回收。所以建议我们在对象使用完毕,应手动置成null
12、在使用同步机制时,应尽量使用方法同步代替代码块同步
13、尽量减少对变量的重复计算
异常对性能不利。抛出异常首先要创建一个新的对象Throwable接口的构造函数调鼡名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈收集调用跟踪信息。只要有异常被抛出VM就必须调整调用堆栈,因为在处理过程中创建了一个新嘚对象 异常只能用于错误处理,不应该用来控制程序流程
16、不要在循环中使用try...catch,应把其放置在最外层
简单地说,一个Vector就是一个java.lang.Object实例嘚数组Vector与数组相似,它的元素可以通过整数形式的索引访问但是,Vector类型的对象在创建之后对象的大小能够根据元素的增加或者删除洏扩展、缩小。请考虑下面这个向Vector加入元素的例子:
硬件上就是提高服务器性能提升允许最大访问量,代码上面可以使用连接池的方式更合理的规划连接,提高连接的有效利用率