数据库连接池c3p0和Druid详解

1、数据库连接池
1.概念

其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

2.好处
  1. 节约资源
  2. 用户访问高效
3.实现
  1. 标准接口:DataSource(数据源/连接池)-- javax.sql包下
  2. 方法:
    1. getConnection() 获取链接
    2. ==Connection.close()==归还链接,注意,不是关闭链接
4.介绍
  1. c3p0数据库连接池技术
  2. Druid数据库连接池技术
  3. SpringJDBC数据库连接池技术
2、C3P0连接池技术
1.与 Druid相比的
  1. 优点:资源文件自动读取
  2. 缺点:资源文件名固定
2.步骤
  1. 导入开发jar包,注意不要忽略了驱动包
    • c3p0-0.9.5.2.jar
    • mchange-commons-java-0.2.12.jar
    • mysql-connector-java-5.1.37-bin.jar
  2. 创建和编写配置文件
    • c3p0-config.xml
    • 注意:文件名称不能改变,当加载驱动时会自动寻找这个名称的配置文件后缀名只能是xml或者properties。
    • 位置:直接放在src目录下
  3. 获取连接池对象
    • new出来的,new ComboPooledDataSource()
  4. 编写sql语句
  5. 获取执行sql语句对象
    • executeQuery()
    • executeUpdate()
  6. 执行sql语句,返回结果集
  7. 处理结果集 ResultSet
  8. 关闭资源
3.演示
  1. 创建和编写配置文件

    <c3p0-config>
      <!-- 使用默认的配置读取连接池对象 -->
      <default-config>
      	<!--  连接参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</property>
        <property name="user">root</property>
        <property name="password">root</property>
        
        <!-- 连接池参数 -->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">10</property>
        <property name="checkoutTimeout">3000</property>
      </default-config>
    
    </c3p0-config>
    
  2. demo1(数据库自己事先写好)

    /*
     * 数据库连接池
     * 利用连接池获取表中的信息
     */
    
    public class demo1 {
    	public static void main(String[] args) throws SQLException {
    
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs;
    
    		// 1. 导入jar包(两个),不要忘记导入驱动包
    		// 2.写配置文件
    		// 3.获取连接池对象
    		DataSource ds = new ComboPooledDataSource();
    		conn = ds.getConnection();
    		// 4.编写sql语句
    		String sql = "select * from account";
    		// 5.获取sql语句执行对象
    		pstmt = conn.prepareStatement(sql);
    		// 6.执行sql语句
    				rs = pstmt.executeQuery();
    		// 7.处理结果
    		while(rs.next()){
    			int id = rs.getInt(1);
    			String name = rs.getString("name");
    			System.out.println(id + "---" + name);
    		}
    		// 8.释放资源(将链接放回连接线池)
    		 rs.close();
    		pstmt.close();
    		conn.close();
    
    	}
    
    }
    
    

    输出结果
    在这里插入图片描述

3、Druid连接池技术
1.概述
  1. 由阿里巴巴提供,号称世界上最好用的数据库连接池之一
2.步骤
  1. 导入开发jar包,注意不要忽略了驱动包

    • mysql-connector-java-5.1.37-bin.jar
    • druid-1.0.9.jar
  2. 创建和编写配置文件

    • 配置文件名称可以自定义,后缀名为properties
  3. 加载配置文件

    	    Properties pro = new Properties();
    		InputStream is = demo1.class.getClassLoader().getResourceAsStream("druid.properties");
    		pro.load(is);
    
  4. 获取连接池对象

    • 通过工厂来获取 DruidDataSourceFactory
           // 获取连接池对象
    		DataSource ds = DruidDataSourceFactory.createDataSource(pro);
    
  5. 获取链接对象

    conn = ds.getConnection();
    
  6. 编写sql语句

  7. 获取执行sql语句对象

    • conn.prepareStatement(sql);
  8. 执行sql对象

    • executeQuery()
    • executeUpdate()
  9. 处理结果集,返回ResultSet

  10. 关闭资源

3.演示
  1. 创建和编写配置文件,druid.properties

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/db3
    username=root
    password=root
    initialSize=5
    maxActive=10
    maxWait=3000
    
  2. demo1(数据库自己事先准备好)

    public class demo1 {
    	public static void main(String[] args) throws Exception {
    
    		PreparedStatement pstmt = null;
    		Connection conn = null;
    		ResultSet rs = null;
    		// 1.导入jar包
    		// 2.编写配置文件(druid.properties)
    		
    		// 3.加载配置文件
    		Properties pro = new Properties();
    		InputStream is = demo1.class.getClassLoader().getResourceAsStream("druid.properties");
    		pro.load(is);
    		
    		// 4.获取连接池对象
    		DataSource ds = DruidDataSourceFactory.createDataSource(pro);
    		// 5.获取链接
    		conn = ds.getConnection();
    		// 6.编写sql语句
    		String sql = "select * from account";
    		// 7.获取sql语句执行对象
    		pstmt = conn.prepareStatement(sql);
    		// 8.执行sql语句
    		rs = pstmt.executeQuery(sql);
    		// 9.处理结果
    		while (rs.next()) {
    			int id = rs.getInt(1);
    			String name = rs.getString("name");
    			System.out.println(id + "---" + name);
    		}
    		//10.释放资源
    		if(rs!=null) {
    			rs.close();
    		}
    		if(pstmt!=null) {
    			rs.close();
    		}
    		if(conn!=null) {
    			rs.close();
    		}
    	}
    }
    
  3. 结果

在这里插入图片描述

4.打包成工具类
  1. 自定义工具类
package druid.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtiles {
  private static DataSource dataSource = null;

  static {
    try {
      // 加载配置文件
      Properties properties = new Properties();
      properties.load(JDBCUtiles.class.getClassLoader().getResourceAsStream("druid.properties"));
      // 获取数据库连接池对象
      dataSource = DruidDataSourceFactory.createDataSource(properties);
    } catch (IOException e) {
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  // 4.获取链接
  public static Connection getConnection() throws SQLException {

    return dataSource.getConnection();
  }

  // 5获取连接池对象
  public static DataSource getDataSource() {
    return dataSource;
  }

  // 5.释放资源
  public static void close(Statement stmt, Connection conn) {
    close(null, stmt, conn);
  }

  // 重载
  public static void close(ResultSet rs, Statement stmt, Connection conn) {
    if (rs != null) {
      try {
        rs.close();
      } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    if (stmt != null) {
      try {
        stmt.close();
      } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
}

演示工具类的使用

package druid;

import druid.utils.JDBCUtiles;

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

public class demo2 {
  public static void main(String[] args) throws SQLException {

      Connection connection=null;
      PreparedStatement ps=null;
      ResultSet resources=null;

      //1.获取连接对象
       connection = JDBCUtiles.getConnection();

      //2.编写sql语句
      String sql = "select * from account";

      //3.获取执行sq语句对象
      ps = connection.prepareStatement(sql);

      //4.执行sql语句
      resources = ps.executeQuery();

      //5.处理结果集
      while (resources.next()){
          int id = resources.getInt(1);
          String name = resources.getString("name");
          System.out.println(id + "---" + name);

      }
      //6.关闭资源
      JDBCUtiles.close(resources,ps,connection);

  }
}

输出结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值