zoukankan      html  css  js  c++  java
  • 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>
    
  • 相关阅读:
    20170809--JS操作Select备忘
    20160711--C# 委托的三种调用示例(同步调用 异步调用 异步回调)【转载】
    C# 内存建表备忘
    富文本编辑器 CKeditor 配置使用
    20160520—JS打分控件
    20160513--js 弹出窗口带有iframe控件 备忘
    chart 简单应用
    mvc 简单整理
    ObjectDatasourse 的绑定及显示
    GridView 详述
  • 原文地址:https://www.cnblogs.com/humi/p/7958738.html
Copyright © 2011-2022 走看看