不信网恋 发表于 2017-1-27 13:13:53

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]
查看完整版本: Tomcat数据库连接池参数测试