最近 公司wap服务器 tomcat出现重大问题,报错:200个线程被用完,导致所有的系统无法运行,必须重启tomcat,之后发现是tomcat连接池的问题, maxWait="-1" 导致服务器处于无限的等待之中。后来改成maxWait="5000"。服务器不再报线程用完的错误,但是产生了新的错误;
什么是连接池:
1)存放Connection对象的容器;
2)减少连接数据库的开销;
3)程序请求连接时,在Connection Pool中取连接;
4)连接使用完后,放回Connection Pool,不释放;
5)Connection Pool对连接进行管理:计数、监控连接状态;
tomcat 中<Context path="/gnx" docBase="d:/gnx/" reloadable="true"/>
在Tomcat的安装目录下conf目录下的server.xml文件中
增加一个xml代码片段
<Context path="/gnx" docBase=”d:/gnx” reloadable=”true” />,
该代码片段中每个属性的含义与用途是什么?
contex指上下文,实际上就是一个web项目;
path是虚拟目录,访问的时候用localhost:8080/gnx/*.jsp访问网页,gnx前面要加/;
docBase是网页实际存放位置的根目录,映射为path虚拟目录;
reloadable="true"表示你修改了jsp文件后不需要重启就可以实现显示的同步。
数据库连接池可以再这里配置,例子
<Context path="/gnx" docBase="D:/common/Tomcat 6.0/webapps/gnx" debug="0" reloadable="true" cookies="false"> <Resource name="oraPool" type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@192.168.0.211:1521:csdb"
maxIdle="2"
maxWait="5000"
username="WAPUSER"
password="WAPUSER"
maxActive="50"/>
</Context>
maxIdle 表示活动连接数;
maxActive 表示最大连接数;
maxWait 表示当数据库连接用完了,等待的时间,单位是 ms。默认是 -1 表示无限等待。
程序用完连接后,应该马上释放,也就是放回连接池。
当程序中某一个连接没有释放,会导致连接池中的可用的连接耗尽:org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool exhausted
不能创建新连接,连接池耗尽。因为数据库连接个数已经达到最大,不能再新建了。
此时,如果 maxWait="-1",tomcat 将彻底完蛋。所有系统将无法访问,系统处于无限的等待之中。
将 maxWait="5000",也就是等待5秒钟。由于系统中有处于活动的连接 maxIdle="2"。在5秒之内,可以使用这个2个活动连接。超时,系统将报错。
但此时,由于有很多未关闭的数据库连接,整个系统中,也只有两个活动连接 可以使用了。
因此,数据库释放 是非常重要的。
当然,我们完全可以把这些数据库释放的工作,交给 hibernate 了。这也是为什么要使用hibernate的原因之一了。
少了 path="/gnx" 会出现
javax.naming.NameNotFoundException: Name XXX is not bound in this Context