C3P0(数据库连接池)详解

一、定义

C3P0是一个开源的JDBC连接池,它实现了数据源与JNDI绑定,支持JDBC3规范和实现了JDBC2的标准扩展说明的Connection和Statement池的DataSources对象。

  即将用于连接数据库的连接整合在一起形成一个随取随用的数据库连接池(Connection pool)。

二、为什么使用C3P0数据库连接池

2.1、时间和内存资源消耗巨大

  • 使用JDBC传统模式

public static void main(String[] args) {
        BaseDao2 dao = new BaseDao2<>();
        System.out.println(Timestamp.valueOf(LocalDateTime.now()));
        for(int i=0;i<100;i++){
            Connection connection=dao.getConnection();
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Timestamp.valueOf(LocalDateTime.now()));
    }
  • 使用C3P0连接

public static void main(String[] args) {
        BaseDao2 dao = new BaseDao2<>();
        System.out.println(Timestamp.valueOf(LocalDateTime.now()));
        for(int i=0;i<100;i++){
            Connection connection = getConnection();
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Timestamp.valueOf(LocalDateTime.now()));
    }
C3P0(数据库连接池)详解_第1张图片

我们进行了100次的连接,使用JDBC传统模式连接,耗时近2s,而使用C3P0数据库连接池时,耗时1s不到的时间。当数据量大的时候,耗时的差距会更加明显。

会出现这种情况是因为,普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再根据JDBC代码(或配置文件)中的用户名和密码进行验证其正确性。这一过程一般会花费0.05~1s,一旦需要数据库连接的时候就必须向数据库请求一个,执行完后再断开连接。

如果同一个数据库在同一时间有数十人甚至上百人请求连接势必会占用大量的系统资源,严重的会导致服务器崩溃。

2.2、有内存泄漏的风险

每一次数据库连接使用完后都需要断开连接,但如果程序出现异常致使连接未能及时关闭,这样就可能导致内存泄漏,最终只能以重启数据库的方法来解决;

另外使用传统JDBC模式开发不能控制需要创建的连接数,系统一般会将资源大量分出给连接以防止资源不够用,如果连接数超出一定数量也会有极大的可能导致内存泄漏。

2.3、应用程序直接获取链接

C3P0(数据库连接池)详解_第2张图片

缺点:

  1. 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长

  1. 假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、宕机

2.4、使用数据库连接池进行优化

C3P0(数据库连接池)详解_第3张图片

三、C3P0实操

3.1、导入jar包

在pom文件中添加如下内容:


    com.mchange
    c3p0
    0.9.5.2

3.2、配置xml文件

C3P0(数据库连接池)详解_第4张图片

下面是配置的xml文件,可以根据实际进行修改。

3.3、c3p0-config.xml模板


    
        com.mysql.cj.jdbc.Driver
        jdbc:mysql://192.168.153.134:3306/new
        root
        123123

        
        
        5
        
        10
        
        10
        
        200
        
        50
        
        2

    

3.4、c3p0-config.xml参数清单

   
       
       
    3   
 
       
    30   
       
       
    1000   
       
       
    false   
       
       
    Test   
       
       
    false   
       
       
    100   
       
       
       
       
       
    null   
       
       
    false   
       
       
    60   
       
       
    3   
       
       
    60   
       
       
    15   
       
       
    100   
       
       
       
       
       
    3   
       
       
    root   
       
       
    password   
       
       
       
       
       
    select id from test where id=1   
       
       
    300   
       
       
    false   
       
       
    true   
       
       
    root   
       
       
    false 
          

3.5、创建C3P0Util类

// C3p0连接池
public class C3p0Util {
    private static DataSource dataSource = null;

    static{
        dataSource = new ComboPooledDataSource("mysqlapp");
    }

    //从连接池中获取连接
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();        }
        return null;
    }

    //释放连接回连接池
    public static void release(Connection conn, Statement stmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            stmt = null;
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

你可能感兴趣的:(Java,MySQL,JDBC,mysql,数据库)