Eclipse+Tomcat7.0+MySQL 连接池设置

http://blog.sina.com.cn/s/blog_85d71fb70101ab99.html

工程名:JavaWeb

第一步:配置server.xml

在Tomcat的server.xml文件中</host>之前添加如下配置信息:

<Context path="/JavaWeb" docBase="JavaWeb" debug="5" reloadable="true" crossContext="true" source="org.eclipse.jst.jee.server:JavaWeb">
        <Resource name="jdbc/DBCP"
                    auth="Container"
                    type="javax.sql.DataSource"
                    maxActive="100"
                    maxIdle="30"
                    maxWait="10000"
                    username="root"
                    password=""
                    driverClassName="com.mysql.jdbc.Driver"
                    url="jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true"/>
</Context>

<context>各属性的含义如下:

(1)path:web应用的context路径。catalina将每个URL的起始和context path进行比较,选择合适的web应用处理该请求。特定Host下的context path必须是惟一的。如果context path为空字符串(""),这个context是所属Host的缺省web应用,用来处理不能匹配任何context path的请求。

(2)docBase:该web应用的文档基准目录(Document Base,也称为Context Root),或者是WAR文件的路径。可以使用绝对路径,也可以使用相对于context所属的Host的appBase路径。

(3)debug:与这个Engine关联的Logger记录的调试信息的详细程度。数字越大,输出越详细。如果没有指定,缺省为0。

(4)reloadable:如果希望Catalina监视/WEB-INF/classes/和/WEB-INF/lib下面的类是否发生变化,在发生变化的时候自动重载web application,设为true。这个特征在开发阶段很有用,但也大大增加了服务器的开销。因此,在发布以后,不推荐使用。但是,你可以使用 Manager应用在必要的时候触发应用的重载。

(5)crossContext:如果想在应用内调用ServletContext.getContext()来返回在该虚拟主机上运行的其他web application的request dispatcher,设为true。在安全性很重要的环境中,设为false,使得getContext()总是返回null。缺省值为false。

(6)source:还没弄清楚是什么作用。

<Resource>各属性的含义如下:

(1)name:指定Resource的JNDI名字。

(2)auth:指定管理Resource的Manager,它有两个可选值:Container和Application。Container表示由容器来创建和管理Resource,Application表示由web应用来创建和管理Resource。

(3)type:指定Resource的Java类名。
(4)maxActive: 池中连接的最大数目。要确保让 MySQL 的最大连接数大于这个值。如果其值为 0,则没有最大数量限制。
(5)maxIdle:池中最大空闲数据库连接数。如果其值为-1,则没有限制。(有的博客说值为0表示不受限制)
(6)maxWait:等待一个连接变成可用的最长时间,单位是 ms。这个例子中该值为 10 s如果超时将抛出异常。如果设置为-1,将无限等待。
(7)username password:连接 MySQL 数据库的用户名和口令。
(8)driverClassNameMySQL 数据库的 JDBC 驱动程序的名字,这里的名字是'com.mysql.jdbc.Driver'
(9)urlJDBC 连接 MySQL 数据库的 url。其中'127.0.0.1'是要连接的数据库服务器的ip,'3306'是数据库服务器端口,'test'是数据库名。参数 autoReconnect=true 确保连接池能够重新连接。如果 8 个小时没有操作,MySQL 管理器会关闭连接。

第二步:配置WEB-INF/lib/web.xml文件

        如果web应用访问了有Servlet容器管理的某个JNDI资源,那么必须在web.xml文件中声明对这个JNDI资源的引用。表示资源引用的元素为<resource-ref>,以下是声明引用jdbc/BookDB数据源的代码:

<resource-ref>   
  <description>DB Connection</description>
  <res-ref-name>jdbc/DBCP</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

<resource-ref>属性说明:

1)description:对所引用的资源的说明。

2)res-ref-name:指定所引用资源的JNDI名字,与<Resource>元素中的name属性对应。

3)res-type:指定所引用资源的类名,与<Resource>元素中的type属性对应。

4)res-auth:指定管理所引用资源的Manager,与<Resource>元素中的auth属性对应。

第三步:Java调用

 1 //连接池
 2         try {            
 3             Context initContext = new InitialContext();
 4             Context envContext = (Context)initContext.lookup("java:/comp/env");
 5             DataSource ds = (DataSource)envContext.lookup("jdbc/DBCP");
 6             Connection connect = ds.getConnection();
 7             System.out.println("Success connect Mysql server (DBCP)!");
 8             res=true;
 9         } catch (Exception e) {
10             System.out.print("error connect Mysql server(DBCP)!");
11             e.printStackTrace();
12         }

其中第4行中lookup()的参数我是直接复制的,没有修改,还不懂是什么意思。

第5行中lookup()的参数是前两步中设置的JNDI名字

在程序中遇到了错误:org.apache.tomcat.dbcp.dbcp.BasicDataSource cannot be cast to org.apache.tomcat.jdbc.pool.DataSource

经查是引入的包不对。本项目中正确的包是

1 import javax.naming.Context;
2 import javax.naming.InitialContext;
3 //import org.apache.tomcat.jdbc.pool.DataSource;
5 import javax.sql.DataSource;

比较发现“javax.sql.DataSource”就是第一步中<Resource> 的type属性,也是第二步中<resource-ref>的<res-type>值。

原文地址:https://www.cnblogs.com/anan1688/p/4497583.html