论坛首页 Java企业应用论坛

软件设计经验谈

浏览 10100 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-20  
zuly 写道
Hibernate的性能关键体现在实体的模式抽象度是否足够!类似ejb的Session facade模式!至于集群的问题!我个人认为以product pre analyse不够充分!集群以硬件环境换软件环境是一种高成本,高维护的措施!

至于楼上列举的一种sql,这种无任何封装的业务模式是非常愚蠢的和不可取的!首先sql的操作是不保持连接的,这首先就是一种性能上的丧失!并且大量的曝露了数据结构,死板的设计模版.

其实业务的性能最多丧失在网络和数据库上!争对网络的优化我认为应该把重点放在锐化网络通行上!一如采用代理(agent)的模式来代替裸露的协议!对一些通信要尽可能的封装(单纯的把identify包装)!而争对数据库的优化要争对数据的sync和连接的保持!数据的sync是实时性要求很高的系统中经常遇到的!如果在sync的时候不保持连接(或者有效的保持连接或者条件性的保持的连接)是优化数据库的有效方法!


这位同学的行文看起来很夸张,每句话都是惊叹号结尾。我猜你写的程序里给用户的提示也是每句都是惊叹号吧。
0 请登录后投票
   发表时间:2007-01-20  
76052186 写道

3,对数据库而言,如何考增加服务器,来提高性能.分区数据库吗?可这个东西,连ibm自已的工程师都说这种方式不能提高性能。


这叫什么说法,数据库集群如果不能提高性能,那集群跟双机热备有什么区别,那一个集群里有几台几十台机器都是用来干什么的?

一般来说,对于简单的集群,比如CJDBC(复杂的集群没研究过),对于查询都是可以线性提高性能的,因为查询是只读的,可以分在不同的机器上独立执行,性能提升倍数基本上等于机器数;
而对于写操作,(insert update delete)需要在所有机器上同时执行,执行性能应该和单台机器基本相同。

76052186 写道

4,不用集群,提高单台服务器的硬件性能,我认为这是最不好的方式,软件太没伸缩性。这种方案会导至用户原来的硬件不在使用,用户会很不满意的。

提高硬件性能有很多方法,并不是直接需要弃用硬件,最简单的就是加内存,加CPU(如果支持的话),这样原来的硬件都保留了。
软件有没有伸缩性应该早考虑,项目都做完了,再说这个有点晚,寄希望于可后期优化来实现所谓伸缩性是很难的。当然,优化还是有很多潜力可挖的,但是前期没有做好应有的性能考虑,在后期就很被动了。


你还没有完全描述清楚你的问题。
1.你访问数据库是直接用的JDBC么?使用了PreparedStatement么?
2.选课似乎就是系统唯一的瓶颈,它主要依赖于那些功能,哪几个SQL,具体操作步骤,或者截图,都说说,性能优化最需要的就是对症下药,问题越明确,方案就越容易奏效。
0 请登录后投票
   发表时间:2007-01-20  
要说分区没用,我估计我们那客户会着急了,前年那项目,1千多万的硬件投入,分区没有用?搞么子哦。别人说没有用,可能是针对你的设备来说没用倒是可能。你搞一个SCSI硬盘用来分区当然没有什么大用了,分区有没有用,也得看你什么设备阿。
0 请登录后投票
   发表时间:2007-01-20  
Lucas Lee 写道

这叫什么说法,数据库集群如果不能提高性能,那集群跟双机热备有什么区别,那一个集群里有几台几十台机器都是用来干什么的?

分区与集群不一样哦。多分区就是多分区,集群是集群,数据库集群没见过,不过多分区用过。
0 请登录后投票
   发表时间:2007-01-20  
76052186 写道
不过这里我产生另外两个疑问,我本来相作实验的,但没做,偷一下懒,有人知到的回答一下。
1,对一个复杂的sql,我们是分成一个一个的小sql好,还是一个大sql好,我想分成一个一个的小sql可能在大并发时,能提高性能 ,

select * from (select teacher.*,student.*,rownumber() over(ORDER BY studnet.id ASC) AS rn  from select * from teacher left join studenton teacher.id =student.teacherId) where rn >=0 and rn <15,
对这样一个查询,我们一次只需取15条记录 ,如果我们改一下,改成如下方式  
select teacher.id from teacher,
select * from (select *,rownumber() over(order by id) from student where teacherid in("t1","t2",,,)) where rn>=0 and rn<15

这样一个(上面sql有优化的地方,只是示例用,就不优化了),sql是多了,数据库要多执行几次,但每次都是单表查询,数据库不会去做表间连接,响应更快,压力会分散在集群中的各个服务器上,减轻数据库服务器压力。不知可行不,有人做过没有,希望高手提提意见。


这个我在局域网内测试过,我测试的2张表分别有20多万条数据。结果反而比大sql还慢了1-3秒,用了30多秒。大sql其实还关联了一个辅助表。比小的sql还少个表用了30秒就查询出结果了。
我个人认为这种嵌套查询,千万不要写得太多,如果事物再没有控制好的话,在并发量高的时候,特别容易造成数据库死锁。
0 请登录后投票
   发表时间:2007-01-20  
Allen 写道
有时候也要考虑一些变通的办法,比如楼主提出的第一个学生选课的问题。

学校一般没什么钱来给你配置好的服务器(而且经常是一个服务器上跑着很多个应用,光是应用服务器和CMS通常都有运行着好几个不同的),数据库也基本用的是MySQL这样在他们看来“免费的软件”……

那么就可以尽量争取让服务器的内存容量大一些,MySQL允许的并发连接稍微多几条(同时一定要仔细谨慎地配置一个数据源/JDBC连接池来维护这些连接),MySQL可以获取使用的内存也适当加大一点……

如果使用了Hibernate的话,良好的持久化关联关系配置、合理的缓存规划、逻辑清醒的业务代码……这些都可以提升应用程序的可延展性。

最后,也是最现实的一点(也许可以说是最管用的一条)——和学校这方面的负责人协商一下,改善一下学生选课的流程,适当延长选课的时间段,不要让所有学生都同时在使用你们的选课系统。(一个普通的大学一般都有数以万计的学生,如果很短的时间段里他们同时在你们的系统上进行操作,那么很难相信学校这种近乎业余级别的服务器可以承受得住。)



曾在国内大学教务软件市场做得最好的公司工作过一年,学校的情况可不是这样的哦,硬件条件很不错,数据库也都是oracle的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics