Tomcat数据库连接池参数测试
刚刚进入公司,实习生一个,被分配任务找出Oracle数据库连接失败的原因。第一直觉,数据库连接操作没有关闭,导致数据库连接被阻塞。
查看数据库SQL语句如下:
select MACHINE,username from v$session order by MACHINE ---查看当前连接数据库的机器和用户名
select count(*) from v$process --当前数据库被连接的次数
select value from v$parameter where name = 'processes' --数据库允许的最大连接数
发现数据库最大连接数为150(应该是Oracle默认连接数大小,未深研究)。而当前连接数已经为150,阻塞已成必然。
查看代码,果然发现许多conn未被关闭。在某个小角落阻塞这数据库连接。。。
既然找到问题,说干就干,关掉这些connection对象。全部关闭后,发现阻塞的情况得到了环境,然而网站的性能仍然不高。
调查发现,是因为我们的系统要随时向数据库里写入一些log信息,频繁的与数据库建立连接、断开连接确实很耗费性能。
这样子一定不可以满足需求,没办法,改! 突然想到,学校不是讲过连接池这个东西嘛,干嘛不用呢。
找来找去,发现采用Tomcat自带的一个数据库连接池,应该可以满足需求。配置简单,性能还可以得到保证。于是google,baidu了一圈,最后Tomcat 6.0的方法如下:
在tomcat的安装目录小找到conf/context.xml文件,打开后,在<Context>中加入如下的配置:
<Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource"
maxActive="300" maxIdle="30" maxWait="10000" username="****" password="****"
driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@***.**.**.***:1521:databasename"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
/>
具体含义可以网上google一些,相信具体含义可以找到。重启tomcat后,连接池的配置就已经生效了。
下一步就是获取连接池中的connection对象了。
java 具体代码如下:
Context context = new InitialContext();
DataSource ds =(DataSource) context.lookup("java:/comp/env/jdbc/oracleds");
conn = ds.getConnection();
在导入需要的Oracle驱动包后,你就可以正常使用Tomcat连接池中被管理的connection对象了。
在用完的时候,正常调用conn.close()方法就可以了。
在做完这个Task的过程中,我做了几个测试。用来理解数据库配置中的几个参数的作用。
准备工作:
a.把参数按如下方式修改:maxActive="15" maxIdle="10" removeAbandonedTimeout="20"
b.使用一款叫做LambdaProbe的工具监测Tomcat的状态。
测试一:
测试目的:找到Abandoned Connection是指哪一类的connection。
1.在JSP中打开一个数据库连接,不关闭。
刷新页面13此,发现数据库连接数为13,20秒过后,发现连接数仍未13.
2.修改上面JSP页面,使用完毕后,调用close()方法,关闭数据库连接。
快速刷新13次,发现数据库连接为13。20秒后,发现连接数变为10(默认空闲连接为10)。说明一部分连接被Tomcat连接池回收。
由此可见,所谓的AbandonedConnection不是指未关闭的connection,而是指那些曾经连接,后来关闭的close。
测试二:
测试目的:找到Tomcat连接池回收那些没有关闭的数据库连接的时刻。
1.在JSP中打开一个数据库连接,不关闭,即不调用conn.close()方法。
刷新页面13此,发现数据库连接数为13,20秒过后,发现连接数仍未13.
2.在JSP中打开一个数据库连接,不关闭。
刷新页面16此,发现数据库连接数为15,20秒过后,发现连接数为10.查看logs/stdout_20100816.log输出日志:可以看到具体哪个页面报出异常。
由此可见,Tomcat对于那些没有释放的连接。也会采取一定的处理,但是不是马上处理,在连接数达到maxActive所规定的值之前,所有未释放的连接都会被标记为忙连接。当达到maxActive时,如果继续想Tomcat连接池申请连接
Tomcat会报出异常,并在stdout.log日志中输出。从异常中可以查看到具体是哪个页面没有释放。Tomcat抛出异常后,连接池会强制回收那些连接未释放的连接,并使连接池中的连接数量保持在maxIdle所规定的数量。
小提示:一个查看Tomcat当前状态很有用的工具叫做:LambdaProbe。很好用噢,网上可以下载到所需probe.war和相关使用方法。
页:
[1]