使用今天的多层结构,当出现问题时(性能),你只需要将精力关注在连接池的效率上。
http://www.theserverside.com/news/thread.tss?thread_id=24515
A minor question: assume there are 500 records qualified for the search criteria, will user have to get all of them at once, all they just need to see the first portion of it?
"Starfeng" made very good points about tuning. I was involved in a 1,600 concurrent user system 2 years back, though our implmentation is not exact the same, performance bottleneck areas are identical.
Cheers,
-Jevang
查询慢的话可以看一下connection的设置,我听同事说可以一次返回多条结果集的查询.可以大大提高查询返回的速度.可能有一点帮助吧.不过你的瓶颈不在这.
1.检查java程序,看ResultSet,Statement和Connection是否都及时关闭、释放。
在使用连接池的情况下,尤其要保证在关闭Connection前确实关闭了ResultSet和Statement。因为实际上Connection并没有关闭只是释放到pool中,如果statement未关闭则相应的数据库cursor也不能及时释放
2.使用oracle物化视图
物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。对大数据量、多表连接的查询效果很好
也可以建立临时表来缓存多表连接查询的结果,以后的查询只需要基于此临时表即可。这种方法需要修改查询的流程:第一步是聚集数据(粗条件查询,如查询条件只有开始、结束时间或只有分支机构),第二步是细化查询(基于临时表操作)
Host name="www.example.com" appBase="/home/example/webapp"
Context path="" docBase="."/
/Host
没有想到,居然还只是用javabean来写,太夸张了!!!
1。使用cache
cache的本意是减少I/O操作,因为I/O操作非常的费时,但是cache的设计应该使命中率提高才有实际意义。cache设计出来之后,个人的理解是最好创建一个线程(或其他更系统的方法)监视数据库,如果有变动,可以及时更新到cache中,不用等请求来了再手忙脚乱的玩cache。为了解决cache快照之类的问题,也许可以采用双缓冲,轮流上阵(设想中。。。)。照一楼的描述来看,虽说数据量大,但是如果数据库的插入和更新操作不是那么频繁的话,我觉得cache确实还是很有意义的。
2。http连接数控制
连接数不要那么大,把连接数改那么大并不是一种好想法。连接数增大的目的是使前端的响应看起来快一点(只是看起来快一点而已,实际上对单个客户端来说处理速度更慢,响应速度和处理速度不是同一回事)。当连接池的线程都忙于处理时请求接收线程应该向前端返回一个服务器忙的友好信息,而不是傻傻的停在哪里。
3。线程的问题
java线程如果是用户级线程,当某个线程中使用阻塞调用时,整个系统都将停顿(好像死掉了一样),不过看来java线程好像没有这个问题。
4。数据库设计问题
数据库设计的问题不能光从性能上考虑而忽略了合理的设计,数据库的设计仍然应该按照面向对象的思想来分析。好的数据库设计可以省去应用层复杂的算法,因为一个复杂的、差的算法带来的性能损失也相当惊人,且系统易产生不稳定的现象。至于分不分表,应以分析结果为准。
5。分布式数据库的问题
分布式数据库的目的其实是为了分散I/O操作压力,把一定时间内的所有的I/O操作分散到几个物理服务器上,相当于提高了单位时间内的I/O吞吐量,性能当然会提高。但是这里面要考虑一个问题,即数据库的数据分布也应该具备分布式的特性,因为虽然数据库分布式了,可是大量经常查询的数据还是集中在其中的某一台物理服务器上,这分布式就算是白做了。为了达到数据呈分布式特征,就需要对数据的特征做一些设计,然后在应用层根据请求的数据特征把请求发送到某台具有这一数据特征的数据库服务器上。如果这些特征能在服务器上按哈希分布,其查询性能我觉得应该会比较高。
解决方法建议按上述思路思考。
楼主也说过更多数据以前也处理过
我只想说一点:
SQL SORT
不要搞太复杂的算法,象数据挖掘就坏了
结果集太分散
几亿条数据,再怎么搞,也不够败家
a.估计一下数据的实际的两有多大,100G+? need cluster index?
2.解决问题之前先看看到底瓶颈在哪里.
a.比如Unix上面的top,windows上面的filemon
b.oracle的优化上面,索引的问题到底怎样?是否有更好的办法去得到数据而不是乱用join.
3.用loadrunner测试一下
4.是否有OLTP和DSS的基本概念,如果有的话
5.问题解决的成本很高,所以,动手之前先推理一下,看看有什么疑点,列一下成本/受益看看合不合算.
解决建议
1、拆分表,使你操作的数据集尽量的小
2、建立中间表,对于统计类信息查询中间表,定时生成中间表
3、做数据库的负载均衡