21.JDBC开发(4)开源数据库连接池(javaEE笔记)

一、开源数据库连接池

  • 现在很多web服务器都提供了DataSource的实现,即连接池的实现。通常我们把DataSource的实现按其英文含义称为数据源,数据源中都包含了数据库连接池的实现。

  • 也有一些开源组织提供了数据源的独立实现:
    DBCP数据库连接池
    C3P0数据库连接池
    使用tomcat数据源

  • 实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编写时也尽量使用这些数据源的实现,以提升程序的数据库访问性能。

二、DBCP数据源(工程day16

  • DBCP是Apache软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个jar文件:
    commons-dbcp.jar:连接池的实现
    commons-pool.jar:连接池实现的依赖库

  • tomcat的连接池正式采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

使用此数据源需要一个配置文件:
dbcpconfig.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3305/day15
username=root
password=walp1314

#
initialSize=10

#最大连接数量
maxActive=50

#
maxIdle=20

#
minIdle=5

#
maxWait=60000

#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=UTF8

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可以看文档)NONE,READ_UNCOMMITED,READ_COMMITED,REPEATABLE_READ,SERIALIZABLE
#但是注意:以上是mysql的隔离级别,Oracle有些不同,Oracle最低要求READ_COMMITED
defaultTransactionIsolation=READ_UNCOMMITED

JdbcUtils_DBCP.java

package cn.itcast.utils;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

public class JdbcUtils_DBCP {
    
    private static DataSource ds = null;
    static{
        try{
            InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
            Properties properties = new Properties();
            properties.load(in);
            //先new一个工厂
            BasicDataSourceFactory factory = new BasicDataSourceFactory();
            //使用工厂生成数据源
            ds = factory.createDataSource(properties);
            System.out.println(ds);
        }catch(Exception e){
            throw new ExceptionInInitializerError(e);
        }
    }
    public static Connection getConnection() throws SQLException{
        return ds.getConnection();
    }
    
    
    public static void release(Connection conn, Statement ps , ResultSet result){
        if(result != null){
            try {
                result.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            result = null;
        }
        if(ps != null){
            try {
                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            ps = null;
        }
        if(conn != null){
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

说明:这里我们可以使用之前的例子(如Demo1.java)进行测试,但是当我们使用的DBCP是版本1,那么是可以测试成功的,但是如果用DBCP的版本2,那么会出现异常,此时我们需要再导入一个jar包:commons-logging-1.2.jar。这样才能测试成功。

C3P0数据源(工程day16

首先需要导入相关的jar包:

c3p0-0.9.5.1.jar
mchange-commons-java-0.2.10.jar

使用此数据源需要的配置文件是:
c3p0-config.xml




    
  
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3305/day16
    root
    walp1314
    
    5
    10
    5
    20
  

  
   
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/day16
    root
    walp1314

    5
    10
    5
    20

    
   
  
  
   
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/day16
    root
    walp1314

    5
    10
    5
    20

  

说明:如果我们在后面程序中如果不指定使用哪个数据库配置,那么就使用默认的配置。

JdbcUtils_C3P0.java

package cn.itcast.utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils_C3P0 {
    
    private static ComboPooledDataSource ds = null;
    static{
        try{
            //使用配置文件时,配置文件必须放在src下,同时配置文件名不要改,如果不指定配置文件名,则使用默认的配置
            ds = new ComboPooledDataSource("mysql");
        }catch(Exception e){
            throw new ExceptionInInitializerError(e);
        }
    }
    public static Connection getConnection() throws SQLException{
        return ds.getConnection();
    }
    
    public static void release(Connection conn, Statement ps , ResultSet result){
        if(result != null){
            try {
                result.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            result = null;
        }
        if(ps != null){
            try {
                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            ps = null;
        }
        if(conn != null){
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

说明:我们也可以直接在程序中对其驱动等信息进行设置,但是那样太麻烦,这里我们使用配置文件,如果不具体指定使用哪个配置,那就使用默认配置。同样我们可以使用之前的程序进行测试。

四、使用tomcat数据源(工程day16_web

我们可以在tomcat服务器中配置一个数据源,这个数据源使用的JNDI技术。

所谓JNDI:

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

首先我们需要配置tomcat的Context,配置Context可以有多种方式,这里我们使用一个配置文件放在META-INF/context.xml



  

ServletDemo1.java

package cn.itcast.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.dao.BaseDao;
//记得mysql的驱动一定要加到tomcat的lib中
public class ServletDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        BaseDao dao = new BaseDao();
        dao.add();

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

BaseDao.java

package cn.itcast.dao;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class BaseDao {
    
    public void add() {
        try {
            // 此时我们所有的程序都是在服务器中,在一般的类中我们也可以拿到数据库链接
            Context initCtx = new InitialContext();// 初始化JNDI
            Context envCtx = (Context) initCtx.lookup("java:comp/env");// 得到JNDI容器
            DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB");// 从容器中检索一个链接池
            Connection conn = ds.getConnection();// 获取到一个链接
            System.out.println(conn);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

说明:这里一定注意要将mysql的jdbc驱动放在tomcat的lib目录中。

最后:其实还有一些开源的数据源可以使用,比如阿里巴巴的数据源druid-1.0.19.jar,在以后的项目中可以使用,而且其功能强大。

你可能感兴趣的:(21.JDBC开发(4)开源数据库连接池(javaEE笔记))