测试环境: MySql5.5 , Tomcat7.0
第1步:因为Tomcat已经将DBCP整合到项目中,所以只需将MySql的驱动jar拷贝到Tomcat安装目录下的lib
目录中:
第2步:在web项目的META-INF下创建context.xml文件,在其中添加JNDI数据源的配置:
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <Context> <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="100" maxIdle="40" maxWait="4000" name="jdbc/test" username="root" password="avisionav" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/mercury?useUnicode=true&characterEncoding=UTF-8" /> </Context>
配置参数说明:
maxActive 连接池支持的最大连接数
maxIdle 连接池中最多可空闲maxIdle个连接
minIdle 连接池中最少空闲maxIdle个连接
initialSize 初始化连接数目
maxWait 连接池中连接用完时,新的请求等待时间,毫秒
timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用,每 timeBetweenEvictionRunsMillis 毫秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis 毫秒的连接断开,直到连接池中的连接数到minIdle为止
minEvictableIdleTimeMillis 连接池中连接可空闲的时间,毫秒 removeAbandoned true,false,是否清理removeAbandonedTimeout 秒没有使用的活动连接,清理后并没有放回连接池
removeAbandonedTimeout 活动连接的最大空闲时间
logAbandoned true,false, 连接池收回空闲的活动连接时是否打印消息
minEvictableIdleTimeMillis,removeAbandonedTimeout这两个参数针对的连接对象不一样,
minEvictableIdleTimeMillis 针对连接池中的连接对象,
removeAbandonedTimeout 针对未被close的活动连接.
第3步:在index.jsp中添加如下代码:
<%@ page language="java" import="java.util.*,javax.naming.*,java.sql.*,javax.sql.*" pageEncoding="UTF-8"%>
<%
Context ctx = new InitialContext();
String strLookup = "java:comp/env/jdbc/test";
DataSource ds =(DataSource) ctx.lookup(strLookup);
Connection con = ds.getConnection();
if (con != null){
out.print("success");
}else{
out.print("failure");
}
%>
第4步:发布测试成功:
其它:基于JNDI数据源的数据库工具类:
public class DBUtil {
private static DataSource ds = null;
static {
try {
Context ctx = new InitialContext();
String rsName = "java:comp/env/jdbc/test";
ds = (DataSource) ctx.lookup(rsName);
} catch (NamingException e) {
e.printStackTrace();
}
}
public static Connection getConn() {
Connection conn = null;
try {
conn = ds.getConnection();
} catch (SQLException e) {
System.out.println("无法获得数据库链接");
}
return conn;
}
}
另外要注意,此工具一定要运行在web容器中,应为此JDNI是由TOMCAT提供的,假如单独写一个main方法调用工具类的getConn()方法,会报如下错误:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at com.study.DBUtil.<clinit>(DBUtil.java:19)