《在Tomcat 7配置Servlet 3.0项目的MySQL 5.5的DBCP连接池》
2012-6-5
版权声明:本文属于原创,版权归作者chszs所有,使用源码无任何限制,但转载文章需经作者同意。一、简介
数据库连接池的基本原理是,在内部对象池中维护一定数量的数据库连接,并对外暴露从连接池获取数据库连接和释放连接的方法。
数据库连接池技术的优点:
² 资源重用。避免频繁创建连接、释放连接带来的性能开销。
² 更快的系统响应速度。减少了初始化数据库连接的时间,因为数据库连接池在初始化时,已经创建了一定数量的数据库连接。
² 统一的连接管理。避免数据库连接的内存泄漏。
本文教你如何在Tomcat 7.0.27应用服务器上配置Jakarta Commons Database Connection Pool(DBCP连接池),配置的连接池在Servlet 3.0项目中运行正常。
DBCP是一个数据库连接池工具,而Tomcat Servlet引擎中包含了该技术。
注意:在Tomcat 5.x和Tomcat 6.x等版本下配置JNDI数据源有很多不同。二、JAR包
MySQL的JDBC驱动包是必须的,下载mysql-connector-java-5.1.19.zip,并解压;
再把文件mysql-connector-java-5.1.19-bin.jar复制到Tomcat\lib目录;
DBCP连接池依赖于两个包:commons-dbcp.jar和commons-pool.jar。但这两个库都已经被封装到Tomcat/lib/tomcat-dbcp.jar文件中,而且,对类的包名重新命名,以避免与应用程序发生干扰。
Tomcat的lib目录已经包含了tomcat-dbcp.jar库。三、Tomcat配置MySQL数据源
Tomcat配置数据源,不同的数据库有不同的配法,基本上相同,仅仅是具体的参数略有不同。这里配置MySQL数据源。
在Tomcat的conf子目录内,打开context.xml配置文件,看这里:
WEB-INF/web.xml
复制代码
在标签内增加一个标签,并去除注释,内容如下:
WEB-INF/web.xml
type="javax.sql.DataSource"
maxActive="80" maxIdle="20" maxWait="10000" removeAbandoned="true"
username="guan" password="guan123456"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/webt3" />
复制代码注意:黄色强调的内容为新增内容。四、验证
构建一个简单的Web项目,项目使用了Tomcat 7的DBCP连接池,从MySQL数据库读写数据。具体如下:1、创建MySQL数据库
创建了数据库、表、用户,并对用户的访问权限进行授权,最后插入一点数据。
mysql> CREATE DATABASE webt3;
mysql> CREATE USER 'guan'@'%' IDENTIFIED BY 'guan123456';
mysql> GRANT ALL ON webt3.* TO 'guan'@'%';
mysql> USE webt3;
mysql> DROP TABLE IF EXISTS `student`;
mysql> CREATE TABLE `student`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`record` INT(11) DEFAULT NULL,
PRIMARY KEY(`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;复制代码
向表中插入几条数据:
mysql> INSERT INTO student VALUES(NULL, 'hello', 12345);
mysql> INSERT INTO student VALUES(NULL, '张素钠', 98373);
mysql> INSERT INTO student VALUES(NULL, '万科', 33238);复制代码2、创建动态Web项目
在Eclipse的JEE版中创建动态Web项目,项目的各项设置如下图所示:
1.jpg (44.9 KB, 下载次数: 31)
2012-6-5 16:12 上传
注意是Servlet 3.0项目,为了配置使用数据库连接池,要生成web.xml部署描述符文件。
2.jpg (19.19 KB, 下载次数: 29)
2012-6-5 16:13 上传
生成的项目结构如下图所示:
3.jpg (19.89 KB, 下载次数: 21)
2012-6-5 16:14 上传
3、修改web.xml部署描述符
打开项目下WebContent/WEB-INF目录的web.xml文件,修改内容:
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
webt3
index.jsp
Tomcat 7 DBCP
jdbc/mysql5
javax.sql.DataSource
Container
复制代码注:黄色强调部分是新增内容,要与Tomcat的server.xml的配置保持一致。4、编写代码
4.1、创建实体类ch.entity.Student.java,如下:
package ch.entity;
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = -2851451446149648542L;
private int id;
private String name;
private int record;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRecord() {
return record;
}
public void setRecord(int record) {
this.record = record;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", record=" + record
+ "]";
}
}复制代码
4.2、创建数据库访问类ch.dao.DBconn.java,如下:
package ch.dao;
import java.sql.*;
import java.util.List;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import ch.entity.Student;
public class DBconn {
Context context = null;
DataSource ds = null;
Connection conn = null;
List students;
public DBconn(){
initConnection();
this.students = new ArrayList();
}
private void initConnection(){
try {
context = new InitialContext();
} catch (NamingException e) {
System.err.println("连接池上下文不存在! " + e.getMessage());
}
try {
ds = (DataSource)context.lookup("java:comp/env/jdbc/mysql5");
} catch (NamingException e) {
System.err.println("数据源没发现! " + e.getMessage());
}
try {
conn = ds.getConnection();
} catch (SQLException e) {
System.err.println("获取连接失败! " + e.getMessage());
}
}
private void freeConnection() {
try {
conn.close();
} catch (Exception e) {
System.err.println("释放连接出错! ");
e.printStackTrace();
}
}
public List getAllStudents() {
Statement stmt = null;
ResultSet rs = null;
String sql = "SELECT id, name, record FROM student";
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
rs = stmt.getResultSet();
while (rs.next()) {
Student tmp = new Student();
tmp.setId(rs.getInt(1));
tmp.setName(rs.getString(2));
tmp.setRecord(rs.getInt(3));
students.add(tmp);
}
if (rs != null)
rs.close();
if (stmt != null)
stmt.close();
} catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
} finally{
freeConnection();
}
return students;
}
}复制代码
4.3、在WebContent目录下创建JSP文件:index.jsp
pageEncoding="UTF-8"%>
/p>
"http://www.w3.org/TR/html4/loose.dtd">
测试连接池DBconn conn = new DBconn();
List students = conn.getAllStudents();
if(students!=null && students.size()>0){
for(Student student : students){
out.println(student.toString());
}
}
%>
复制代码5、部署项目并运行
把项目部署到Tomcat 7,并运行Tomcat应用服务器,显示结果如下:
4.jpg (18.94 KB, 下载次数: 30)
2012-6-5 16:16 上传
6、结论
证明数据库连接池配置成功!