请教如何提高查询系统的性能?

04-07-14 dafeng
                   

我们图书馆图书查询系统,采用ORACLE+Tomcat,使用servlet+JavaBean通过Tomcat的连接池直接访问Oracle数据库做查询。

数据量大约为40万条图书信息,(图书信息采用类似xml的结构存储,每册图书的书名、作者等信息作为一个CLOB字段存储,由于不能直接建立索引,我们把其中的书名、作者等抽取出来存放在另外一个表中,这样查询时需要做两个表的连接查询),少量用户查询时还能及时响应,但是当同时查询的读者多,响应就特别慢。

请问各位大虾,我这个系统可以从哪些方面做性能改进??

                   

Azure_2003
2004-07-15 19:22

做cache,把数据库里面的数据放到内存里面,这样可以加快查询速度

banq
2004-07-19 09:44

提高查询性能需要从几个方面提升。

首先你选择的是原始的Jsp/Servlet + JavaBeans结构,jsp/Servlet其实就是线程,当并发用户发生访问时,就是多线程了,因此,在你的程序中,首先避免多线程访问同一个资源,特别是Singleton方式,这个问题前面帖子已经大量讨论,这比如:本来是并行前进的,到了一个独木桥,必须串行前进,那么性能大大折扣了。

最好的方式是,一个对象为一个线程服务,并发10个线程就有10对象被访问,这样效率最高,但是同时注意,如果你这个Javabeans对象每次被访问都要new创建,有可能浪费性能,特别是Javabeans代码很多,功能很多时,那么使用pool,在系统启动时,就启动生成这些JavaBeans对象在内存中。

我上面说的这些javaBeans是功能性Javabeans,通过Pool提高功能性JavaBeans的性能。还有一种是数据javabeans,专门装载数据的,这部分使用Cache来提高。

EJB中的无态Session Bean底层已经有Pool支持,如果你将功能性JavaBeans的代码移植到Session Beans中实现,那么会提高并发用户的处理性能,使用SLSB的Local,关闭其网络性能损耗;关闭SLSB事务机制(如果不需要),这样将SLSB变成一个纯的Pool支持的特殊javaBeans了。

由于EJB中实体bean底层是有Cache支持的,因此可以用实体bean实现数据javaBeans的缓存,但是一般推荐,最好在Web层自己做一些缓存,这样离客户端最近,性能最好。

总之,性能问题其实是架构选择不慎带来的问题,在这个论坛看到了太多Jsp+JavaBeans的性能问题,为什么我们从系统一开始时,不选择可伸缩强大的EJB架构呢? 这样 ,在你的系统扩大时,你就不必为系统性能问题头疼,甚至性能问题导致了你的Jsp+JavaBeans系统失败。

albert_qhd
2004-07-19 15:03

EJB并不是万能的,什么系统都推荐EJB,这是典型的误人子弟

系统性能出现问题,应该先找出瓶颈所在,可用一些性能测试工具来做

本应用中,你为什么要把信息存成xml保存在blob中呢?这样读起来要解析,肯定性能有问题

如果你把这些信息都独立成一个个字段,再对数据库进行一些性能优化,应该就没有问题了。

40万条记录很少的

leexhwhy
2004-07-20 09:08

1:利用cache

2:修改sql,用oracle的特有的sql

3:不要轻易修改架构,ejb不是万能的,很讨厌那种动辄就谈ejb,绝对是误导。

7Go 1 2 3 4 ... 7 下一页