最近维护的一个项目出了问题,最后分析是卡在数据库连接池上,然后就做了些学习。
先把我自己的方法写出来,再说下网上其他的没有成功的方法。
1、首先当然是先把mysql的jar包放在lib目录下,toncat的或者自己项目的lib下都可以。
2、在tomcat的conf目录下的server.xml里添加如下内容,要添加在 <Host></Host>之间
<Context path="/myexample" docBase="myexample" crossContext="true">
<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"
username="root"
password="root"
maxActive="850"
maxidle="80"
removeAbandoned="true"
removeAbandonedTimeout="5"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test?autoReconnect=true"
minEvictableIdleTimeMillis="4000"
timeBetweenEvictionRunsMillis="5000"/>
</Context>
或者在 Tomcat 的 conf\Catalina\localhost 下新建一个 项目名.xml 文件 (推荐这个方式)
里面的内容为
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/myexample" docBase="myexample" crossContext="true">
<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"
username="root"
password="root"
maxActive="850"
maxidle="80"
maxWait="10000"
removeAbandoned="true"
removeAbandonedTimeout="5"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test?autoReconnect=true"
minEvictableIdleTimeMillis="4000"
timeBetweenEvictionRunsMillis="5000"/>
</Context>
下面对里面几个比较重要的参数进行一下说明:
name:表示你的连接池的名称也就是你要访问连接池的地址
auth:是连接池管理权属性,Container表示容器管理
type:是对象的类型
driverClassName:是数据库驱动的名称
url:是数据库的地址
username:是登陆数据库的用户名
password:是登陆数据库的密码
maxActive:最大连接数据库连接数,设 0 为没有限制
maxIdle:最大等待连接中的数量,超过空闲时间,数据库连 接将被标记为不可用,然后被释放。设为0表示无限制。
maxWait:最大建立连接等待时间, 单位为 ms, 如果超过此时间将接到异常。设为-1表示 无限制。
一般把maxActive设置成可能的并发量就行了
然后配置就完成了,下面就是使用。
try {
// 初始化查找命名空间
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
// 找到DataSource
DataSource ds = (DataSource)envContext.lookup("jdbc/mysql");
Connection connection = ds.getConnection();
……之后就和普通的数据库连接使用是一样的。
}catch(Exception ex) {
out.println(ex.toString());
}
最好用try catch 包裹下。
下面说下网上看的别的没有成功的,有的说在项目目录的META-INF 目录下建一个content.xml放上上面的内容,我试了,没成功。
还有的说需要应用程序下的web.xml中的之间加入:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/sample</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
我试了,加不加这个没什么影响。
不成功或没影响的可能和版本有关,我没有试他们说的那个6.0的版本,我用的8.*的版本。