查看: 10695|回复: 2

[精华] 在Tomcat 7配置Servlet 3.0项目的MySQL 5.5的DBCP连接池

[复制链接]
论坛徽章:
63
2010广州亚运会纪念徽章:台球
日期:2010-10-18 12:43:48茶鸡蛋
日期:2013-01-09 10:59:002013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:帆船
日期:2013-04-02 17:07:052013年新春福章
日期:2013-04-08 17:42:48奥运纪念徽章
日期:2013-07-18 13:55:12优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11
跳转到指定楼层
1#
发表于 2012-6-5 16:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
《在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.xTomcat 6.x等版本下配置JNDI数据源有很多不同。
二、JAR
MySQLJDBC驱动包是必须的,下载mysql-connector-java-5.1.19.zip,并解压;
再把文件mysql-connector-java-5.1.19-bin.jar复制到Tomcat\lib目录;
DBCP连接池依赖于两个包:commons-dbcp.jarcommons-pool.jar。但这两个库都已经被封装到Tomcat/lib/tomcat-dbcp.jar文件中,而且,对类的包名重新命名,以避免与应用程序发生干扰。
Tomcatlib目录已经包含了tomcat-dbcp.jar库。
三、Tomcat配置MySQL数据源
Tomcat配置数据源,不同的数据库有不同的配法,基本上相同,仅仅是具体的参数略有不同。这里配置MySQL数据源。
Tomcatconf子目录内,打开context.xml配置文件,看这里:
  1. <?xml version='1.0' encoding='utf-8'?>
  2. <Context>
  3.     <!-- Default set of monitored resources -->
  4.     <WatchedResource>WEB-INF/web.xml</WatchedResource>

  5.     <!-- Uncomment this to disable session persistence across Tomcat restarts -->
  6.     <!--
  7.     <Manager pathname="" />
  8.     -->

  9.     <!-- Uncomment this to enable Comet connection tacking (provides events
  10.          on session expiration as well as webapp lifecycle) -->
  11.     <!--
  12.     <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
  13.     -->
  14. </Context>
复制代码

<context>标签内增加一个<Resource>标签,并去除注释,内容如下:
  1. <?xml version='1.0' encoding='utf-8'?>
  2. <Context>
  3.         <WatchedResource>WEB-INF/web.xml</WatchedResource>
  4.         <Resource name="jdbc/mysql5" auth="Container"
  5.               type="javax.sql.DataSource"
  6.                           maxActive="80" maxIdle="20" maxWait="10000" removeAbandoned="true"
  7.               username="guan" password="guan123456"
  8.                           driverClassName="com.mysql.jdbc.Driver"
  9.               url="jdbc:mysql://localhost:3306/webt3" />
  10. </Context>
复制代码
注意:黄色强调的内容为新增内容。四、验证
构建一个简单的Web项目,项目使用了Tomcat 7DBCP连接池,从MySQL数据库读写数据。具体如下:
1、创建MySQL数据库
创建了数据库、表、用户,并对用户的访问权限进行授权,最后插入一点数据。
  1. mysql> CREATE DATABASE webt3;
  2. mysql> CREATE USER 'guan'@'%' IDENTIFIED BY 'guan123456';
  3. mysql> GRANT ALL ON webt3.* TO 'guan'@'%';
  4. mysql> USE webt3;
  5. mysql> DROP TABLE IF EXISTS `student`;
  6. mysql> CREATE TABLE `student`(
  7. `id` INT(11) NOT NULL AUTO_INCREMENT,
  8. `name` VARCHAR(20) DEFAULT NULL,
  9. `record` INT(11) DEFAULT NULL,
  10. PRIMARY KEY(`id`)
  11. ) ENGINE=INNODB DEFAULT CHARSET=utf8;
复制代码
向表中插入几条数据:
  1. mysql> INSERT INTO student VALUES(NULL, 'hello', 12345);
  2. mysql> INSERT INTO student VALUES(NULL, '张素钠', 98373);
  3. mysql> INSERT INTO student VALUES(NULL, '万科', 33238);
复制代码
2、创建动态Web项目
EclipseJEE版中创建动态Web项目,项目的各项设置如下图所示:

注意是Servlet 3.0项目,为了配置使用数据库连接池,要生成web.xml部署描述符文件。

生成的项目结构如下图所示:

3、修改web.xml部署描述符
打开项目下WebContent/WEB-INF目录的web.xml文件,修改内容:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.         xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4.         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5.         id="WebApp_ID" version="3.0">
  6.         <display-name>webt3</display-name>
  7.         <welcome-file-list>
  8.                 <welcome-file>index.jsp</welcome-file>
  9.         </welcome-file-list>
  10.         <resource-ref>
  11.                 <description>Tomcat 7 DBCP</description>
  12.                 <res-ref-name>jdbc/mysql5</res-ref-name>
  13.                 <res-type>javax.sql.DataSource</res-type>
  14.                 <res-auth>Container</res-auth>
  15.         </resource-ref>
  16. </web-app>
复制代码
注:黄色强调部分是新增内容,要与Tomcatserver.xml的配置保持一致。
4、编写代码
4.1、创建实体类ch.entity.Student.java,如下:
  1. package ch.entity;

  2. import java.io.Serializable;

  3. public class Student implements Serializable {
  4.         private static final long serialVersionUID = -2851451446149648542L;

  5.         private int id;
  6.         private String name;
  7.         private int record;

  8.         public int getId() {
  9.                 return id;
  10.         }

  11.         public void setId(int id) {
  12.                 this.id = id;
  13.         }

  14.         public String getName() {
  15.                 return name;
  16.         }

  17.         public void setName(String name) {
  18.                 this.name = name;
  19.         }

  20.         public int getRecord() {
  21.                 return record;
  22.         }

  23.         public void setRecord(int record) {
  24.                 this.record = record;
  25.         }

  26.         @Override
  27.         public String toString() {
  28.                 return "Student [id=" + id + ", name=" + name + ", record=" + record
  29.                                 + "]";
  30.         }

  31. }
复制代码
4.2、创建数据库访问类ch.dao.DBconn.java,如下:

  1. package ch.dao;

  2. import java.sql.*;
  3. import java.util.List;
  4. import java.util.ArrayList;
  5. import javax.naming.Context;
  6. import javax.naming.InitialContext;
  7. import javax.naming.NamingException;
  8. import javax.sql.DataSource;
  9. import ch.entity.Student;

  10. public class DBconn {
  11.         Context context = null;
  12.         DataSource ds = null;
  13.         Connection conn = null;
  14.         List<Student> students;
  15.        
  16.         public DBconn(){
  17.                 initConnection();
  18.                 this.students = new ArrayList<Student>();
  19.         }
  20.        
  21.         private void initConnection(){
  22.                 try {
  23.                         context = new InitialContext();
  24.                 } catch (NamingException e) {
  25.                         System.err.println("连接池上下文不存在! " + e.getMessage());
  26.                 }
  27.                 try {
  28.                         ds = (DataSource)context.lookup("java:comp/env/jdbc/mysql5");
  29.                 } catch (NamingException e) {
  30.                         System.err.println("数据源没发现! " + e.getMessage());
  31.                 }
  32.                 try {
  33.                         conn = ds.getConnection();
  34.                 } catch (SQLException e) {
  35.                         System.err.println("获取连接失败! " + e.getMessage());
  36.                 }
  37.         }
  38.        
  39.         private void freeConnection() {
  40.                 try {
  41.                         conn.close();
  42.                 } catch (Exception e) {
  43.                         System.err.println("释放连接出错! ");
  44.                         e.printStackTrace();
  45.                 }
  46.         }
  47.        
  48.         public List<Student> getAllStudents() {
  49.                 Statement stmt = null;
  50.                 ResultSet rs = null;
  51.                 String sql = "SELECT id, name, record FROM student";
  52.                 try {
  53.                         stmt = conn.createStatement();
  54.                         rs = stmt.executeQuery(sql);
  55.                         rs = stmt.getResultSet();
  56.                         while (rs.next()) {
  57.                                 Student tmp = new Student();
  58.                                 tmp.setId(rs.getInt(1));
  59.                                 tmp.setName(rs.getString(2));
  60.                                 tmp.setRecord(rs.getInt(3));
  61.                                 students.add(tmp);
  62.                         }
  63.                         if (rs != null)
  64.                                 rs.close();
  65.                         if (stmt != null)
  66.                                 stmt.close();
  67.                 } catch (SQLException ex) {
  68.                         System.out.println("SQLException: " + ex.getMessage());
  69.                         System.out.println("SQLState: " + ex.getSQLState());
  70.                         System.out.println("VendorError: " + ex.getErrorCode());
  71.                 } finally{
  72.                         freeConnection();
  73.                 }
  74.                 return students;
  75.         }
  76. }
复制代码
4.3、在WebContent目录下创建JSP文件:index.jsp
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.     pageEncoding="UTF-8"%>
  3. <%@ page import="ch.entity.Student, ch.dao.DBconn, java.util.*"  %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  5.   "http://www.w3.org/TR/html4/loose.dtd">
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  9. <title>测试连接池</title>
  10. </head>
  11. <body>
  12. <%
  13. DBconn conn = new DBconn();
  14. List<Student> students = conn.getAllStudents();
  15. if(students!=null && students.size()>0){
  16.         for(Student student : students){
  17.                 out.println(student.toString());
  18.         }
  19. }
  20. %>
  21. </body>
  22. </html>
复制代码
5、部署项目并运行
把项目部署到Tomcat 7,并运行Tomcat应用服务器,显示结果如下:

6、结论
证明数据库连接池配置成功!
















论坛徽章:
63
2010广州亚运会纪念徽章:台球
日期:2010-10-18 12:43:48茶鸡蛋
日期:2013-01-09 10:59:002013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:帆船
日期:2013-04-02 17:07:052013年新春福章
日期:2013-04-08 17:42:48奥运纪念徽章
日期:2013-07-18 13:55:12优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11
2#
 楼主| 发表于 2012-6-5 16:21 | 只看该作者
在代码中加入黄色的效果未能体现出来,我重新截图如下,大家自行对照。


使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
3#
发表于 2012-6-7 12:25 | 只看该作者
好文。连接池虽然不算新技术,但Servlet 3.0是新技术。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表