请教jdon关于连接池对应的游标问题

04-07-09 dabb
我用的是oracle8i的数据库,9ias903服务器。

用连接池的时候发现游标数长的很快,而数据库连接池的连接数很稳定。(通过

select count(*) from v$session 和select count(*) from v$open_corsor查看获知)

一天之内连接数已经涨到900个左右,而连接数稳定在10个左右。可以排除没有关闭statement造成的游标没关闭。我做过实验,statement关闭后一般open cursor就关闭了,但是如果是调用存储过程的话(而存储过程里面又打开cursor进行操作,然后关闭cursor),这样的话,即使关闭statement,但通过select * from v$open_cursor还是可以看到它的。估计是数据库吧它cache了???因为我再次重复调用该页面,open cursor数就不加了,但是如果并发多个用户调用的话(或则狂按f5刷新页面),open cursor数就“蹭蹭”上去了。而kill掉某个连接的话,它对应的open cursors就没掉了。但是这样的话这是游标数好象是一直往上涨的。不知道会不会对系统有影响。有无解决方法?

         

dabb
2004-07-12 11:05
jvm是hotspot 1.3 。我想如果用1.4的会好一些,因为1.4jvm的垃圾回收是可并行的。但是好象不知道哪里知道的oracle9ias903在1。4下会有问题。。

dabb
2004-07-12 11:10
现在我们的系统还是有问题的.就是有时候会不挺的死掉,重起1,2个小时后就死了.有时候运行几天也很正常。有时候变的很慢,查看进程,发现有一个oc4j进程一直在占用cpu资源,从60%到30%不等。而且一直在运行几个小时。而这时系统的访问量已经很少了。oracle的人来了说是我们db connection没有关闭的问题,但是我们现在重整了后,statement和connnection应该是完全关闭了。但还是有那个问题。我以为是因为在做垃圾回收的 时候出现问题,所以调大了jvm heap的新生代的大小,现在是320m,新生代(推荐新生代大小为jvm heap总大小的1/4,但是为了保险,我弄的更大了)。现在我们的参数配置是:-server^@-verbose:gc^@-XX:NewSize=320m^@-XX:MaxNewSize=320m^@-XX:SurvivorRatio=8^@-Xms768m^@-Xmx768m^。

原先设置了1G heap 大小。但是发现很快进程就上到了1G(几个小时)。现在增大新生代后,虽然增长比较慢,但还是有增加的趋势。一天大概10-20m的增加吧。查看垃圾回收记录,它占用的内存还是不大的,现在是318349K->56717K(753664K)。实际占用的也就50多m.我们的平台是:

oracle9ias903,oracle8i(9i),redhat advaced server2.1.硬件配置.双700m cpu,2G的pc server.系统性能不是瓶径。用户总量不大(100来个左右),并发高峰期也就30-40来个。架构是jsp+javabean实现。哪位大侠帮忙分析一下可能原因及解决方法。多谢了!(我已经搞了几个星期了,虽然解决了不少问题,但最终的问题还没有解决:( )

banq
2004-07-12 13:29
我认为还是你Jsp+JavaBeans架构选择欠妥,这种结果小系统可以,对于你这样系统问题就多了。

使用Jsp+JavaBeans无法从代码上真正限制connection的关闭,因为Jsp运行是按照线程运行的,并发时先后次序不定,因此,你按照你想像的逻辑检查发现没有connection没有关闭,实际情况还是不一定。

还有,存储过程语言一定要少用,我建议开发J2EE系统采用面向Model模型设计,这样,数据库只是持久层的一个具体实现,在J2EE中是一个非常具体次要的位置,不涉及数据库。这样,将原来集中在数据库上的负载可以分散到中间件EJB上,而EJB可以分布式集群计算,无疑提高了原来单纯数据库系统的运算性能。

真不好意思,你这个具体问题因为不在现场无法详细回答,以上仅仅供参考。

dabb
2004-07-12 18:59
谢谢答复。我们的系统是2000期间开发的 ,现在做重整。说是javabean+jsp,其实唯有的几个类除了一两个web helper类外,主要就是一个封装数据库操作的类(其他都是jsp),该类主要有几个类似如下的方法:

ResultSet ExecuteQuery(String sql)。所有的jsp页面都是调用该方法获取resultset,然后在jsp里关闭相应的数据库资源。但是该类封装及为混乱(有多个public的statement,connection成员变量)。导致我们想通过修改该类来解决jsp页面里面的statement ,connection资源泄露的想法不可行。最后只好自己写了个cache(MyResultSetCache implements ResultSet),让上面说的ExecuteQuery(String sql)方法返回该cache类。然后直接在该方法的finally关闭resultset,statement,connection等。虽然这样性能会差一点,但是我们的性能不是瓶经。所以说我们基本是解决了statement,connection没有关闭的问题。但是系统仍旧存在上述问题。这两天修改了jvm参数,希望能够解决该问题。。(只是在观察中,不敢向老板说解决了该问题)。

猜你喜欢
7Go 1 2 3 4 ... 7 下一页