Tomcat下使用C3P0配置JNDI数据源


转自:

一、C3P0下载

  C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar

  下载完成之后得到一个压缩包。

二、使用C3P0配置JNDI数据源

  Tomcat6.x中配置JNDI数据源时默认使用的是Tomcat6.x自带的DBCP连接池,Tomcat6.x使用DBCP连接池配置JNDI数据源如下:

 1 

  如果想让Tomcat6.x使用C3P0连接池配置JNDI数据源,在配置时,以下配置项需要修改

  1、 type和factory的值发生变化

  2、username=>user

  3、url=>jdbcUrl

  4、driverClassName=>driverClass

  创建一个Web测试项目C3P0_JNDI_Config,解压压缩包,找到c3p0-0.9.5-pre9\lib目录下的相关Jar包如下图所示:

  将C3P0的相关Jar包添加到项目中,在项目的META-INF目录下创建一个context.xml文件,目录结构如下图所示:

  在tomcat服务器的lib目录下添加Oracle、MySQL、SQLServer三种数据库的驱动jar包,如下图所示:

  1、在context.xml文件中加入如下配置信息

 1 
 2     
 3     
16         
17     
18     
31         
32         
33     
34     
47 

  2.在web.xml引用JDNI数据源:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 7   
 8     index.jsp
 9   
10   
11   
17    
18   
19       Oracle DB Connection
20       jdbc/OracleDataSource
21       javax.sql.DataSource
22       Container
23  
24   
25   
26   
27       MySQL DB Connection
28       jdbc/MysqlDataSource
29       javax.sql.DataSource
30       Container
31   
32   
33   
34   
35       SQLServer DB Connection
36       jdbc/SqlServerDataSource
37       javax.sql.DataSource
38       Container
39   
40   
41 

  3.部署C3P0_JNDI_Config Web应用到Tomcat服务器测试JNDI数据源

  部署到tomcat服务器的webapps目录之后,tomcat服务器就会自动在\conf\Catalina\localhost目录下生成一个C3P0_JNDI_Config.xml文件,如下图所示:

  C3P0_JNDI_Config.xml文件中的内容就是我们在META-INF目录的context.xml文件中配置的那些内容。

  jsp测试页面如下:

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%--引入JSTL标签库 --%>
 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
 5 
 6 
 7   
 8     C3P0配置JNDI数据源连接测试
 9   
10   
11   
12         

针对MySQL数据库JNDI数据源测试

13 <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%> 14 15 <%--MySQL JNDI数据源测试 SQL--%> 16 select * from ld_user 17 18 <%--使用c:forEach标签遍历查询结果集rs中的每一行--%> 19 20 <%--${row.字段名}获取字段的值--%> 21 ${row.id}---${row.username}---${row.password}
22
23
24

针对Oracle数据库JNDI数据源测试

25 <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%> 26 27 <%--Oracle JNDI数据源测试 SQL--%> 28 SELECT * FROM LEAD_OAMS_DBSOURCES 29 30 <%--使用c:forEach标签遍历查询结果集rs中的每一行--%> 31 32 <%--${row.字段名}获取字段的值--%> 33 ${row.RESOURCEID}---${row.DBSOURCE_NAME}---${row.DBSOURCE_TYPE}
34
35
36 37

 C3P0 自动重连相关参数
     idleConnectionTestPeriod:C3P0会有一个Task检测pool内的连接是否正常,此参数就是Task运行的频率。默认值为0,表示不进行检测
    acquireRetryAttempts:pool请求取新连接失败后重试的次数
     C3P0目前存在问题:
     当数据库重启后,C3P0不会自动重新初始化数据库连接池,当新的请求需要访问数据库的时候,此时回报错误(因为数据库重启,连接失效),同时刷新数据库连接池,丢弃掉已经失效的连接,当第二个请求到来时恢复正常。
  C3P0目前没有提供当获取已建立连接失败后重试次数的参数,只有获取新连接失败后重试次数的参数(acquireRetryAttempts )。
要解决此问题,可以通过设置idleConnectionTestPeriod 参数折中解决,该参数的作用是设置系统自动检查连接池中连接是否正常的一个频率参数,时间单位是秒。