数据库连接池Druid、C3P0使用以及工具类的改写

一、连接池概述

  • 什么是连接池?

连接池是装有连接的容器,使用连接的话,可以从连接池中获取,使用完成之后将连接归还给连接池。

  • 为什么要学习连接池?
    连接对象创建和销毁是需要耗费时间的,在服务器初始化的时候就初始化一些连接,从内存中获取和归还的效率要远远高于创建和销毁的效率(提升性能)。
  • 连接池原理?
    在这里插入图片描述

二、 Druid开源连接池

  • 传统连接数据库方法
public void demo1() {
  Connection conn = null;
  PreparedStatement ps = null;
  ResultSet rs = null;
  try {
   //获得连接
   conn = DBHelper.getConn();
   
   //编写sql
   String sql = "select * from dept";
   //预编译sql
   ps = conn.prepareStatement(sql);
   //执行sql
   rs = ps.executeQuery();
   while(rs.next()) {
    System.out.println(rs.getInt("deptno"));
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally {
   DBHelper.close(conn, ps, rs);
  }
 }
  • 手动连接Druid的方法
/*
 - druid的使用:手动设置参数的方式
   */
  
  public void demo2() {
   Connection conn = null;
   PreparedStatement ps = null;
   ResultSet rs = null;
   try {
    //使用连接池:
    DruidDataSource dataSource = new DruidDataSource();
    //手动设置数据库连接参数:
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql:///exercise");
    dataSource.setUsername("root");
    dataSource.setPassword("root");
    //获得连接:
    conn = dataSource.getConnection();
    //编写sql
    String sql = "select * from dept";
    //预编译sql
    ps = conn.prepareStatement(sql);
    //执行sql
    rs = ps.executeQuery();
    while(rs.next()) {
     System.out.println(rs.getInt("deptno")+" "+rs.getString("dname")+" "+rs.getString("loc"));
    }
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }finally {
    DBHelper.close(conn, ps, rs);
   }
  }
  • 使用配置的方式连接连接池
/*
 * druid的使用:配置方式设置参数
 * 使用属性文件配置:文件名称没有规定,但是属性key有规定
   */
  public void demo3() {
   Connection conn = null;
   PreparedStatement ps = null;
   ResultSet rs = null;
   try {
    //使用连接池:
    //从属性文件中获取:
    Properties prop = new Properties();
    prop.load(new FileInputStream("src/druid.properties"));
    DataSource dataSource =  DruidDataSourceFactory.createDataSource(prop);
    //获得连接:
    conn = dataSource.getConnection();
    //编写sql
    String sql = "select * from dept";
    //预编译sql
    ps = conn.prepareStatement(sql);
    //执行sql
    rs = ps.executeQuery();
    while(rs.next()) {
     System.out.println(rs.getInt("deptno")+" "+rs.getString("dname")+" "+rs.getString("loc"));
    }
   } catch (SQLException e) {
    e.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
   }finally {
    DBHelper.close(conn, ps, rs);
   }
  }
  • druid工具类
package com.javasm.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DruidUtil {
    private DruidUtil() {
    }

    private static DataSource dataSource = null;

    static {
        try {
            Properties p = new Properties();
            p.load(DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
            DruidDataSourceFactory druidDataSourceFactory = new DruidDataSourceFactory();
            dataSource = druidDataSourceFactory.createDataSource(p);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public static DataSource getDataSource(){
        return dataSource;
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        // 此处的close是归还而不是关闭
        try {
            if (resultSet != null) {
                resultSet.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            if (statement != null) {
                statement.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            if (connection != null) {
                connection.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
  • 配置文件内容:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF8&useSSL=true
username=root
password=root

扩展资料(配置文件中可设置的其他参数):
在这里插入图片描述

  • 文件目录:
    在这里插入图片描述

三、C3P0开源连接池

  • 手动连接
 //手动设置参数的方法
 public void demo1() {
  Connection conn = null;
  PreparedStatement ps = null;
  ResultSet rs = null;
  try {
   //创建连接池
   ComboPooledDataSource dataSource = new ComboPooledDataSource();
   //手动设置参数
   dataSource.setDriverClass("com.mysql.jdbc.Driver");
   dataSource.setJdbcUrl("jdbc:mysql:///exercise");
   dataSource.setUser("root");
   dataSource.setPassword("root");
   //从连接池中获得连接
   conn = dataSource.getConnection();
   //编写sql语句
   String sql = "select * from dept";
   //预编译
   ps = conn.prepareStatement(sql);
   //接收结果集
   rs = ps.executeQuery();
   //输出
   while(rs.next()) {
    System.out.println(rs.getInt("deptno")+" "+rs.getString("dname")+" "+rs.getString("loc"));
   }
  } catch (PropertyVetoException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   e.printStackTrace();
  }finally {
   DBHelper.close(conn, ps, rs);
  }
 
 }
  • 设置配置文件连接
//设置配置文件的方法
  public void demo2(){
   Connection conn = null;
   PreparedStatement ps = null;
   ResultSet rs = null;
   try {
    //创建连接池  默认去类路径下查找c3p0-config.xml文件
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    //从连接池中获得连接
    conn = dataSource.getConnection();
    //编写sql语句
    String sql = "select * from dept";
    //预编译
    ps = conn.prepareStatement(sql);
    //接收结果集
    rs = ps.executeQuery();
    //输出
    while(rs.next()) {
     System.out.println(rs.getInt("deptno")+" "+rs.getString("dname")+" "+rs.getString("loc"));
    }
   } catch (SQLException e) {
    e.printStackTrace();
   }finally {
    DBHelper.close(conn, ps, rs);
   }
  
  }

配置文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
 <default-config>
  <property name="dirverClass">com.mysql.jdbc.Driver</property>
  <property name="jdbcUrl">jdbc:mysql:///exercise</property>
  <property name="user">root</property>
  <property name="password">root</property>
 
 </default-config>
</c3p0-config>
  • 文件目录(记得加载mchange-commons-java-0.2.12.jar包,否则会报java.lang.NoClassDefFoundError错误):
    在这里插入图片描述

四、改写工具类

连接池对象应该是一个应用只创建一次就可以,不需要每次使用都创建一个新的连接池。

  • 改写后的工具类代码(C3P0):
public class JDBCUtils{
	private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
	public static Connection getConnection() throws SQLException {
	   return dataSource.getConnection();
	 }
 	public static DataSource getDataSource() {
	   return dataSource;
	 }
	public static void close(Connection conn,PreparedStatement ps,ResultSet rs) {
	  try {
	   if(rs != null) rs.close();
	   if(ps != null) ps.close();
	   if(conn != null) conn.close();
	  } catch (SQLException e) {
	   e.printStackTrace();
	  }
 }

测试代码:

//使用新的工具类的测试
    public void demo3(){
     Connection conn = null;
     PreparedStatement ps = null;
     ResultSet rs = null;
     try {
      //创建连接池  默认去类路径下查找c3p0-config.xml文件
      //从连接池中获得连接
      conn = JDBCUtils.getConnection();
      //编写sql语句
      String sql = "select * from dept";
      //预编译
      ps = conn.prepareStatement(sql);
      //接收结果集
      rs = ps.executeQuery();
      //输出
      while(rs.next()) {
       System.out.println(rs.getInt("deptno")+" "+rs.getString("dname")+" "+rs.getString("loc"));
      }
     } catch (SQLException e) {
      e.printStackTrace();
     }finally {
      JDBCUtils.close(conn, ps, rs);
     }
    
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值