1. JNDI配置
第一步需要导入数据库连接需要用到的jar包。
1.1 web.xml配置
在java web项目中的WEB-INF目录下的web.xml中添加数据库资源的引用。
<!-- 配置连接池JNDI的引用 --><resource-ref><description>MySQL DataBase Connection</description><res-ref-name>jdbc/mysql</res-ref-name><!-- name应于context.xml中引用的名字相同 --><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>
1.2 context.xml配置
在java web项目中的META-INF目录下的context.xml中添加数据库配置资源,如果没有context.xml文件可以自行创建并添加。在tomcat运行时会自动的将项目下的该文件配置信息加载到服务器的contex.xml文件中,所以不需要像网上说的那样都配置。
<?xml version="1.0" encoding="UTF-8"?>
<Context><!-- 连接池属性配置 --><!-- name应于web.xml中引用的名字相同,maxTotal是最大连接人数maxIdle最大等待人数,maxWaitMillis最大的等待时间(以毫秒计算)--><Resource name="jdbc/mysql" auth="Container"type="javax.sql.DataSource"driverClassName="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost:3306/test"username="root" password="root"maxTotal="10" maxIdle="4" maxWaitMillis="6000"/></Context>
1.3 连接池工具类
import java.sql.Connection;
import java.sql.SQLException;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;public class ConnectionPoolUtil {// 内容环境固定写法private static final String ENVIRONMENT = "java:comp/env/";// web.xml配置文件中数据库资源的名称,需要web.xml和context.xml都一致private static final String RESOURCE_NAME = "jdbc/mysql";private static DataSource dataSoruce = null;static {try {// 初始化上下文内容对象Context context = new InitialContext();// 在上下文内容对象中寻找内容环境和配置信息dataSoruce = (DataSource)context.lookup(ENVIRONMENT.concat(RESOURCE_NAME));// 关闭内容对象context.close();} catch (NamingException e) {e.printStackTrace();}}/*** 获取数据库连接* @return 数据库连接对象*/public static final Connection getConnection() {Connection connection = null;try {// 获取数据库连接connection = dataSoruce.getConnection();}catch (SQLException e) {e.printStackTrace();}return connection;}}
2. JNDI测试
创建一个jsp文件,编写测试。连接池因为需要内容对象,所以只能通过服务器加载来进行测试。
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ page import="javax.naming.*,javax.sql.*,java.sql.*,util.ConnectionPoolUtil"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%Connection connection = ConnectionPoolUtil.getConnection();String sql = "select * from user";PreparedStatement preparedStatement;try {preparedStatement = connection.prepareStatement(sql);ResultSet resultSet = preparedStatement.executeQuery();int id;String name = null,sex = null;while(resultSet.next()) {id = resultSet.getInt("id");name = resultSet.getString("name");sex = resultSet.getString("sex");out.println("id:"+id+"name:"+name+"sex:"+sex+"<br>");}resultSet.close();preparedStatement.close();// 若想测试最大连接人数可以把下面这句注释掉,一直占用连接资源connection.close();} catch (SQLException e) {e.printStackTrace();}
%>
</body>
</html>