Java EE day09学习总结

今天主要学习C3P0/DBCP/Druid连接池

思维导图:

一.DBCP连接池

1.数据库的连接池在建立数据库连接的时候,能解决很多问题,提高性能的优化。同时市面也有很多第三方公司也为java提供了对应的连接池。所有三方公司的连接池也和JDBC一样,需要遵守一个规则(接口):javax.sql.DataSource;

2.各个厂商如果要兼容市面的业务代码一般都会去实现这个接口,以便于各个连接池之间相互切换以及兼容。

3.现在市面上常见的连接池:DBCP(Spring推荐)/C3P0(Hibernate)/Druid(阿里开源)

4.DBCP连接池:Apache推出的Database Connection Pool

5.使用的步骤:

(1)导入jar包(因为不是java自带的,所以需要导入三方包)

            commons-dbcp-1.4.jar -- 核心包

            commons-pool-1.5.6.jar -- 辅助包

(2)创建连接池对象

            方式1:Ba2sicDataSource ds = new BasicDataSource();

            方式2:DataSource ds = new BasicDataSource();

(3)设置基础的连接参数

            //url地址

        ds.setUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo?characterEncoding=utf-8");

            //账号

            ds.setUsername("seehope_demo");

            //密码

            ds.setPassword("test");

            //驱动

            ds.setDriverClassName("com.mysql.jdbc.Driver");

(4)设置连接池的附加参数(非必须)

            //初始化的连接数

            ds.setInitialSize(5);

            //最大的连接数

            ds.setMaxActive(10);

            //超时时间(毫秒)

            ds.setMaxWait(3000);

            //空闲时间

            ds.setMaxIdle(3000);

(5)获取连接

            Connection connection = ds.getConnection();

(6)释放连接(注意,释放连接请使用connection来操作,因为代理模式会转向到BasicDataSource进行处理,这里的close不再是关闭连接,而是将连接重新释放到连接池)

            connection.close();

 

例子:

package com.dbcp;

import org.apache.commons.dbcp.BasicDataSource;

import javax.sql.DataSource;

import java.sql.Connection;

import java.sql.SQLException;

 

public class DbcpDemo01 {

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

        //1.创建连接池对象

        BasicDataSource ds = new BasicDataSource();

        //通过多态多方式(证明BasicDataSource确实是实现了DataSource)

        //DataSource ds2 = new BasicDataSource();

 

        //2.设置连接参数

        //url地址

        ds.setUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo?characterEncoding=utf-8");

        //账号

        ds.setUsername("seehope_demo");

        //密码

        ds.setPassword("test");

        //驱动

        ds.setDriverClassName("com.mysql.jdbc.Driver");

 

        //3.设置连接池的附加参数

        //初始化的连接数

        ds.setInitialSize(5);

        //最大的连接数

        ds.setMaxActive(10);

        //超时时间(毫秒)

        ds.setMaxWait(3000);

        //空闲时间

        ds.setMaxIdle(3000);

 

        //4.获取连接

        //这里其实使用了一个代理模式来代理了Connection,所以显示的方式有所不同。

        //        Connection connection = ds.getConnection();

        //        System.out.println(connection);

 

        //模拟测试多个连接

        for (int i = 0; i < 11; i++) {

            Connection connection = ds.getConnection();

            System.out.println(connection);

            if(i == 2){

                connection.close();

            }

        }

    }

}

 

二.Druid连接池

1.Druid(德鲁伊),是阿里巴巴自己开源的一个数据库连接池,他结合了C3P0/DBCP等数据库连接池的优点;同时还在自己的连接池上新增了日志监控和性能监控,可以非常好的去监控连接池和SQL代码的执行情况

2.可以说Druid是针对监控和性能而生的,也可以说,Druid是目前性能最好、功能最全的一个数据库连接池。

3.Druid的操作和变量名跟DBCP完全一致,只不过在创建连接池对象的时候,使用的是Druid的对象就可以,其余的不需要做任何的改变。

4.在Druid连接池配置中,driverClassName可配可不配,不配置的话可以根据url自动识别数据库类型,然后选择相应的driverClassName。

5.在三个数据库的连接池当中,DBCP的性能最低,但是功能完善,而08的性能较高,但是部分功能缺失(影响不大),Druid是性能最强,功能最全的数据库连接池。

 

例子:

package com.druid;

import com.alibaba.druid.pool.DruidDataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import com.dbcp.DbcpDemo02;

import org.apache.commons.dbcp.BasicDataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;

import java.io.IOException;

import java.sql.Connection;

import java.util.Properties;

 

public class DruidDemo01 {

    public static void main(String[] args) throws Exception {

        //1.创建连接池对象

        DruidDataSource ds = new DruidDataSource();

        //通过多态多方式(证明BasicDataSource确实是实现了DataSource)

        //DataSource ds2 = new BasicDataSource();

 

        //2.设置连接参数

        //url地址

        ds.setUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo?characterEncoding=utf-8");

        //账号

        ds.setUsername("seehope_demo");

        //密码

        ds.setPassword("test");

        //驱动

        ds.setDriverClassName("com.mysql.jdbc.Driver");//可以选择不配置,自动根据url进行识别

 

        //3.设置连接池的附加参数

        //初始化的连接数

        ds.setInitialSize(5);

        //最大的连接数

        ds.setMaxActive(10);

        //超时时间(毫秒)

        ds.setMaxWait(3000);

        //空闲时间

        ds.setMaxIdle(3000);

 

        //4.获取连接

        //这里其实使用了一个代理模式来代理了Connection,所以显示的方式有所不同。

        //        Connection connection = ds.getConnection();

        //        System.out.println(connection);

 

        //模拟测试多个连接

        for (int i = 0; i < 11; i++) {

            Connection connection = ds.getConnection();

            System.out.println(connection);

            if(i == 2){

                connection.close();

            }

        }

    }

 

    public static void test() throws Exception {

        //创建一个配置文件对象

        Properties ps = new Properties();

        //加载配置文件到内存(当文件位置在项目根目录的时候,可以使用相对路径)

        //ps.load(new FileInputStream("dbcp.properties"));

        //通过类加载器来加载配置文件(可以直接读到src目录下,推荐)

        ps.load(DruidDemo01.class.getClassLoader().getResourceAsStream("druid.properties"));

        //创建加载配置文件的工厂类

        DataSource dataSource = DruidDataSourceFactory.createDataSource(ps);

        //获取连接

        Connection connection = dataSource.getConnection();

        System.out.println(connection);

        //释放资源

        connection.close();

    }

}

 

 

三.C3P0连接池

1.  C3P0是一个开源免费的数据库连接池,其操作和性能和之前学过的DBCP差不多,是Hibernate官方主力和默认使用的数据库连接池。

2.如何使用C3P0?

(1)因为的不是官方的,所以需要导入3方jar包

            c3p0-0.9.5.2.jar

            mchange-commons-java-0.2.12.jar

(2)创建连接池对象

            ComboPooledDataSource ds = new ComboPooledDataSource();

            DataSource ds = new ComboPooledDataSource();

(3)给连接池设置连接参数

            ds.setUser("seehope_demo");

            ds.setPassword("test");

            ds.setJdbcUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo?characterEncoding=utf-8");

            ds.setDriverClass("com.mysql.jdbc.Driver");

 (4)给连接池设置附加参数

            //初始化连接数

            ds.setInitialPoolSize(5);

            //最大连接数

            ds.setMaxPoolSize(10);

            //最小连接数

            ds.setMinPoolSize(3);

            //最大等待时间

            ds.setCheckoutTimeout(3000);

  (5)获取连接

            Connection connection = ds.getConnection();

  (6)释放连接到连接池

            connection.close();

 

例子:

package com.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.beans.PropertyVetoException;

import java.sql.Connection;

 

public class C3p0Demo01 {

    public static void main(String[] args) throws Exception {

        //创建连接池对象

        ComboPooledDataSource ds = new ComboPooledDataSource();

 

        //设置连接池的连接参数

        ds.setUser("seehope_demo");

        ds.setPassword("test");

        ds.setJdbcUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo?characterEncoding=utf-8");

        ds.setDriverClass("com.mysql.jdbc.Driver");

 

        //设置连接池附加参数

        //初始化连接数

        ds.setInitialPoolSize(5);

        //最大连接数

        ds.setMaxPoolSize(10);

        //最小连接数

        ds.setMinPoolSize(3);

        //最大等待时间

        ds.setCheckoutTimeout(3000);

 

        //获取连接

        //        Connection connection = ds.getConnection();

        //        System.out.println(connection);

 

        //模拟测试

        for (int i = 0; i < 11; i++) {

            Connection connection = ds.getConnection();

            System.out.println(connection);

            if(i == 5){//模拟释放

                connection.close();

            }

        }

        //connection.close();//因为使用了代理模式,且重写了close,所以这里的close不是关闭连接,而是将连接释放到连接池

    }

}

 

 

发布了35 篇原创文章 · 获赞 7 · 访问量 3881

猜你喜欢

转载自blog.csdn.net/weixin_45406656/article/details/104526234
今日推荐