今天学会了用tomcat配置连接池。从网络上看了很多资料,走了很多弯路,终于配置成功。感觉自己利用互联网和原始文档的功夫还不行,仍需锻炼。
言归正传:
环境:Window XP,Tomcat5.5,MySQL5.0
配置连接池有两种主要的方法。一种(方法一)是在Tomcat的server.xml中配置Global DataSource,然后再在要使用该DataSource的Project的web.xml中配置。另外一种(方法二)是直接写一个跟Project名相同的xml文件,将其放入conf\Catalina\localhost 目录之下。
假定项目名称为Liberary,具体方法如下:
方法一:
① 在server.xml文件的<GlobalNamingResources></GlobalNamingResources>之间增加<Resource>标签,具体内容如下:
<Resource
name="MySQL DataSource for Liberary"
type="javax.sql.DataSource"
password="12345"
driverClassName="com.mysql.jdbc.Driver"
maxIdle="2"
maxWait="5000"
username="root"
url="jdbc:mysql://localhost:3306/booklib"
maxActive="4"/>
其中name可以随意选取,但是注意后面的配置中要使用到name的值。username和password以及url根据实际情况选取。
另外,这一步也可以在http://localhost:8080/admin即Tomcat的管理员控制台完成,这需要另外下载admin包并仔细阅读http://localhost:8080首页的文字(即要求配置用户名为admin类型,这需要在中修改tomcat的conf\tomcat-users.xml中配置)。我下载的是apache-tomcat-5.5.25-admin.tar.gz。
② 继续在server.xml中的<Host></Host>之间增加<Context>标签,具体如下:
<Context crossContext="true" path="/Liberary"
docBase="Liberary" reloadable="true" debug="5">
<ResourceLink global="MySQL DataSource for Liberary"
name="MySQL DataSource for Liberary"
type="javax.sql.DataSource"/>
</Context>
其中docBase=”Liberary” 表示你执行止程序时路径名称,例如以下的执行路径就是http://localhost:8080/Liberary,path定义你的应用程序的目录所在,这里表示在Tomcat的webapps/Liberary目录下。debug参数的具体含义可以参考相关文档。
以上的两步也可以替代成这样子:直接将如下信息增加到server.xml的<Host></Host>之间:
<Context crossContext="true" path="/Liberary"
docBase="Liberary" reloadable="true" debug="5">
<Resource
name="MySQL DataSource for Liberary"
type="javax.sql.DataSource"
password="12345"
driverClassName="com.mysql.jdbc.Driver"
maxIdle="2"
maxWait="5000"
username="root"
url="jdbc:mysql://localhost:3306/booklib"
maxActive="4"/>
</Context>
③ 在要使用该DataSource的webapp的web.xml文件的<web-app></web-app>中间加入<resource-ref>标签,具体内容如下:
<resource-ref>
<description>Tomcat Datasource</description>
<res-ref-name>MySQL DataSource for Liberary</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
通过以上的步骤,连接池的配置已经完成。
方法二:写一个跟开发项目名相同的xml文件Liberary.xml,将其放入conf\Catalina\localhost目录之下,具体写法如下:
<Context path="/Liberary" reloadable="true" docBase="Liberary">
<Resource name="MySQL DataSource for Liberary" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="MySQL DataSource for Liberary">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value>12345</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/MySQL DataSource for Liberary</value>
</parameter>
<parameter>
<name>initialSize</name>
<value>20</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>4</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>5000</value>
</parameter>
</ResourceParams>
</Context>
注:实际上以上的代码也可以加入server.xml中,如若加入server.xml,则仍需要在webv.xml中做同方法一的操作。实际上,这也是方法一。
通过以上的步骤,连接池的配置已经完成
然后就可以利用DataSource对数据库进行连接了。例如:
1.在某个类外部中做如下声明:
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
2.然后写如下方法:
public static Connection getConn() {
Connection conn=null;
try {
Context ctx = new InitialContext();
DataSource ds=(DataSource)ctx.lookup(
"java:comp/env/MySQL DataSource for Liberary");
conn=ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
return conn;
}
总结:
(一)通过配置连接池反映了自己在依靠外文文档获取知识的能力还是很弱,亟需提高。
(二)我的实验采用的是方法一的???步骤,程序运行之后发现原来JSP页面运行缓慢的问题得到解决,速度大幅度加快。之前一个JSP页面中用了List,根本无法访问,最后不得不重启Tomcat。现在很快就出结果。由此,凡是需要频繁与数据库进行交互的Web应用能是用连接池就使用连接池。
(三)在Tomcat的连接池被使用之后发现,每次关闭Connection都会报错Connection is closed却不影响程序的运行。错误未能得到解决,仍需进一步学习。