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)driverClassName:MySQL 数据库的 JDBC 驱动程序的名字,这里的名字是'com.mysql.jdbc.Driver'。
(9)url:JDBC 连接 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>值。