JDBC 学习复习9 配置Tomcat数据源

在实际开发中,我们有时候还会使用服务器提供给我们的数据库连接池,比如我们希望Tomcat服务器在启动的时候可以帮我们创建一个数据库连接池,那么我们在应用程序中就不需要手动去创建数据库连接池,直接使用Tomcat服务器创建好的数据库连接池即可。要想让Tomcat服务器在启动的时候帮我们创建一个数据库连接池,那么需要简单配置一下Tomcat服务器。

JNDI技术简介
JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
  这 套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需 通过名称检索即可。其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。

查看Tomcat帮助文档得知 它的jndi配置如下

<Context>
  <Resource name="jdbc/datasource" auth="Container"
            type="javax.sql.DataSource" username="root" password=""
            driverClassName="com.mysql.jdbc.Driver" 
            url="jdbc:mysql://localhost:3306/weblib"
            maxActive="8" maxIdle="4"/>
</Context>

j2ee开发中服务器2各种创建资源方式

  • 第一种是通过方法参数的形式传递进来,比如我们在Servlet中写的doPost和doGet方法中使用到的request对象和response对象就是服务器以参数的形式传递给我们的
  • 第二种就是JNDI的方式,服务器把创建好的资源绑定到JNDI容器中去,应用程序想要使用资源时,就直接从JNDI容器中获取相应的资源即可

对于上面的配置文件可以这么拿取

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
dataSource = (DataSource)envCtx.lookup("jdbc/datasource");

记得引入数据库驱动jar包到lib 中,其次配置context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
   <Resource 
       name="jdbc/datasource" 
       auth="Container"
       type="javax.sql.DataSource" 
       username="root" 
       password=""
       driverClassName="com.mysql.jdbc.Driver" 
       url="jdbc:mysql://localhost:3306/libweb"
       maxActive="8" 
       maxIdle="4"/>
</Context>

在获取数据库连接的工具类(如DBUtil4)的静态代码块中获取JNDI容器中的数据 源

package dbex;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DBUtil4 {

	private static DataSource ds = null; // 所有的数据连接池 接口 java.sql.DataSource
	static{
		try {
			// 初始化JNDI
			Context initCtx = new InitialContext();
			// 得到JNDI容器
			Context envCtx = (Context) initCtx.lookup("java:comp/env");
			// 从JNDI容器中检索name为jdbc/datasource的数据源
			ds = (DataSource) envCtx.lookup("jdbc/datasource");
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	/**
	 * 
	 * @Title: geteConnection 
	 * @Description: 获取数据库连接
	 * @param @return
	 * @param @throws SQLException    
	 * @throws
	 */
	public static Connection getConnection() throws SQLException{
		return ds.getConnection();
	}
	/**
	 * 
	 * @Title: release 
	 * @Description:释放资源 
	 * @param     
	 * @throws
	 */
	public static void release(Connection conn,PreparedStatement ppst,ResultSet rs){
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(ppst!=null){
			try {
				ppst.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

最后我们来写一个Servlet测试 把我们查出来的数据通过浏览器页面显示出来

package dbex.server;

import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dbex.DBUtil3;
import dbex.DBUtil4;

/***
 * 
 * @ClassName: JNDISer 
 * @Description: 测试tomcat数据源
 * @author penny
 * @date 2017年12月3日 上午2:01:19 
 *
 */
public class JNDIServ extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
			PrintWriter out = resp.getWriter();
			Connection conn=null;
			PreparedStatement ppst =null;
			ResultSet rs= null;
			
			try {
				conn =DBUtil4.getConnection();
				out.println(conn);
				ppst = conn.prepareStatement("select * from user");
				rs=ppst.executeQuery();
				while(rs.next()){
					out.println(rs.getInt(1)+"	"+rs.getString(2));
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			DBUtil4.release(conn, ppst, rs);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}
}

最终效果

web.xml 配置如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.4">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>JNDI</servlet-name>
    <servlet-class>dbex.server.JNDIServ</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>JNDI</servlet-name>
    <url-pattern>/jndi</url-pattern>
  </servlet-mapping>
  
</web-app>
原文地址:https://www.cnblogs.com/humi/p/7958738.html