请教:tomcat并发性问题.

04-03-11 zjujt
         

手上一套系统是用简单的jsp+servlet+javabean+oracle的系统,

环境是apache2.0+tomcat4.1+oracle8i

用户量是比较多的需要支持在500左右,

由于查询的数据量比较大,

一般是在几亿条中通过一定条件,聚组,排序生成几百条数据(sql语句速度

比较慢,sqlplus测试,优化也做了很多)

当用户并发请求多的时候,系统的链接池(用改造后的jive链接池)就被占光,系统就处于僵死状态.

做过很多改进但效果也不是很理想.

不知道大家有什么好的建议,十分感谢,由于做这方面的开发不久,还请大家

多多指教.

         

banq
2004-03-11 14:50

你这个问题和我在回“为什么要用EJB”的情况类似了。

为什么有的系统直接使用Tomcat的连接池就可以了呢?因为这个系统2/3操作都是数据库操作,没有在内存中的运算,而数据库连接池基本缓解提升系统方面的性能。

如果这样的系统日益复杂,要么自己做缓存,要么使用EJB了。

你这个案例就是明显需要优化逻辑运算的JavaBeans,不要把系统压力都通过数据库访问来解决,这样的系统和以前数据库系统没有什么区别了。

zjujt
2004-03-11 15:05

谢谢,现在改造架构可能已经来不及,代价也比较大.

还有个问题,系统僵死一段时间后,链接会慢慢释放,系统还能恢复运行.

也初步想了个方法,就是提供两套数据链接池(一部分提供给小型快速的操作,一部分提供给大数据查询),但效果也不是很明显.

不知道tomcat在一台服务器上可不可做动态均衡.

banq
2004-03-11 16:49

>系统僵死一段时间后,链接会慢慢释放,系统还能恢复运行

垃圾回收在运行。

tomcat有平衡的,但效果不明显,有很多问题。

starfeng
2004-03-11 19:03

考虑一下查询业务的响应时间,分三部份看

java代码 + 与DB建立连接的时间 + SQL查询时间

忙到系统僵死,那么单个的响应至少秒级以上。java代码的时间可以不计,采用了连接池,与DB建连接的时间也可不计,出问题就只可能在SQL查询上。

从你的这句话看:"一般是在几亿条中通过一定条件,聚组,排序生成几百条数据"

你这里说的“一定条件,聚组,排序”是指一条SQL中完成的情况吧,如果不是一条你就变成一条。

这里的问题不在连接池,不在缓存,所以你提的“两套数据链接池(一部分提供给小型快速的操作,一部分提供给大数据查询)”也会不明显。

另外我可以明确告诉你一点,这里cmp对你没帮助,几亿中抽出的结果是没任何缓存意义的。

我相信你的tomcat服务器的cpu的使用率也不高,相反,你的DB服务器的CPU在忙不过来,你去查一下看看。

解决DB上的问题,用下面的一些方法:

1. 由一个表变成多个表,比方变成A200401,A200402。。。,然后在查之前,在java函数中依条件判断一下要调哪几个表,再查DB

2. SQL语句的优化,比方where子句,过滤最多的条件放在最前。

3. DB做机群,小型快速的操作涉及的表 大数据查询涉及的表放不同的表空间和不同机器上。做oracle机群网上资料多的是

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