jdbc常见的四种连接池的使用(C3P0、Druid、HikariCP 、DBCP)

目录

    • (一).什么是连接池?
      • 连接池的作用
    • (二).为什么要使用连接池?
      • 连接池的优点
    • (三).常见的四中国连接池的使用
      • 1.C3P0连接池
      • 2.Druid连接池
      • 3.HikariCP连接池
      • 4.DBCP连接池

(一).什么是连接池?

顾名思义,就是一个池子,里面放着数据库连接,应用服务需要的时候就去池子里面拿,用完之后归还给池子。
数据库连接池负责分配、管理、释放数据库连接,它允许应用服务重复使用数据库连接,而非重新建立。释放空间时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

连接池的作用

连接池的作用:连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。这样性能上得到了提高

(二).为什么要使用连接池?

这种连接“汇集”起来的技术基于这样的一个事实:对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问JDBC连接的 1 个线程。当不处理事务时,这个连接就会闲置。相反,连接池允许闲置的连接被其它需要的线程使用。

事实上,当一个线程需要用 JDBC 对一个 GBase 或其它数据库操作时,它从池中请求一个连接。当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用。

当连接从池中“借出”,它被请求它的线程专有地使用。从编程的角度来看,这和用户的线程每当需要一个 JDBC 连接的时候调用DriverManager.getConnection() 是一样的,采用连接池技术,可通过使用新的或已有的连接结束线程。

连接池可以极大的改善用户的 Java 应用程序的性能,同时减少全部资源的使用。

连接池的优点

减少连接创建时间

虽然与其它数据库相比 GBase 提供了较为快速连接功能,但是创建新的 JDBC 连接仍会招致网络和 JDBC 驱动的开销。如果这类连接是“循环”使用的,使用该方式这些花销就可避免。

简化的编程模式

当使用连接池时,每一个单独的线程能够像创建了一个自己的 JDBC 连接一样操作,允许用户直接使用JDBC编程技术。

受控的资源使用

如果用户不使用连接池,而是每当线程需要时创建一个新的连接,那么用户的应用程序的资源使用会产生非常大的浪费并且可能会导致高负载下的异常发生。

注意,每个连到 GBase 的连接在客户端和服务器端都有花销(内存,CPU,上下文切换等等)。每个连接均会对应用程序和 GBase 服务器的可用资源带来一定的限制。不管这些连接是否在做有用的工作,仍将使用这些资源中的相当一部分。

连接池能够使性能最大化,同时还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。

(三).常见的四中国连接池的使用

1.C3P0连接池

c3p0下载地址:

https://sourceforge.net/projects/c3p0/

解压之后把下面两个jar包添加到库

jdbc常见的四种连接池的使用(C3P0、Druid、HikariCP 、DBCP)_第1张图片

定义c3p0.xml配置文件


    
    
        
        com.mysql.cj.jdbc.Driver
        jdbc:mysql://localhost:3306/ScienceDB
        root
        root

        
        
        5
        
        10
        
        3000
    

测试c3p0

代码如下:

//c3p0的数据源
        ComboPooledDataSource dataSource=new ComboPooledDataSource();
        //连接数据库参数
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/student");
        dataSource.setUser("root");
        dataSource.setPassword("root");
        //连接池的参数设置
        dataSource.setInitialPoolSize(5);//初始连接数
        dataSource.setMaxPoolSize(20);//最大连接数
        dataSource.setCheckoutTimeout(3000);//连接超时

        //从连接池中获取一个连接
        Connection conn=dataSource.getConnection();
        ResultSet re=conn.prepareStatement("select count(*) coun from EmployeeTab").executeQuery();
        if(re.next()){
            System.out.println(re.getInt("coun"));
        }
        conn.close();//释放连接---》将当前的工作连接,释放为空闲连接
    }

2.Druid连接池

Druid下载地址

https://repo1.maven.org/maven2/com/alibaba/druid/

添加Druid配置文件:

#加载数据库驱动
driverClassName = com.mysql.cj.jdbc.Driver
#数据库连接地址
url = jdbc:mysql://localhost:3306/MovieDB
#数据库用户名
username = root
#数据库密码
password = 123456
#初始化连接数量
initialSize = 10
#最大连接数量
maxActive = 30
#最大超时数1000ms
maxWait = 1000

测试代码:

public class Test {
    public static void main(String[] args) throws Exception {
        //加载配置文件
        Properties properties=new Properties();
        properties.load(new FileInputStream("src\\jdbc.properties"));
        //在工厂中创建一个数据源,数据源的连接信息来源于properties配置文件中
        DataSource dataSource= DruidDataSourceFactory.createDataSource(properties);
        Connection connection=dataSource.getConnection();
        ResultSet rs=connection.prepareStatement("select count(*) from studenttab").executeQuery();
        if(rs.next()){
            System.out.println(rs.getInt(1));
        }
        connection.close();//释放连接----》将当前的工作连接,释放为空闲连接
    }
}

3.HikariCP连接池

HikariCP Jar包下载地址
https://mvnrepository.com/artifact/com.zaxxer/HikariCP/4.0.3

jdbc常见的四种连接池的使用(C3P0、Druid、HikariCP 、DBCP)_第2张图片

使用光连接池需要配置slf4j日志组件1.7.25版本jar包
Maven Repository: org.slf4j » slf4j-api » 1.7.25 (mvnrepository.com)

slf4j-log4j12-1.5.11.jar 下载点击直接下载[(https://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar])
jdbc常见的四种连接池的使用(C3P0、Druid、HikariCP 、DBCP)_第3张图片

配置文件:

#加载数据库驱动
driverClassName=com.mysql.cj.jdbc.Driver
#数据库连接地址
jdbcUrl=jdbc:mysql://localhost:3306/MovieDB
#数据库用户名
username=root
#数据库密码
password=123456
# 连接池名称
poolName=MyConnectionPool
# 连接池大小
maximumPoolSize=10
# 最小空闲连接数
minimumIdle=5
# 连接超时时间(毫秒)
connectionTimeout=30000
# 空闲连接超时时间(毫秒)
idleTimeout=600000
# 最大生存时间(毫秒)
maxLifetime=1800000

测试代码:

public class Demo{
	 public void static main(String [] args) throws IOException, SQLException {
        Properties properties=new Properties();
        properties.load(new FileInputStream("src//HikariCP.properties"));
        //HikariCP配置连接池
        HikariConfig hikariConfig=new HikariConfig(properties);
        HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
        Connection connection = hikariDataSource.getConnection();
        ResultSet resultSet = connection.prepareStatement("select count(* )from movie").executeQuery();
        if(resultSet.next()){
            int count=resultSet.getInt(1);
            System.out.println(count);
        }
        resultSet.close();
        connection.close();
  	  }
	}
}

4.DBCP连接池

DBCP Jar包下载地址

需要下载两个jar包点击直接下载或者去官网
直接下载https://dlcdn.apache.org//commons/pool/binaries/commons-pool2-2.12.0-bin.zip
直接下载https://dlcdn.apache.org//commons/dbcp/binaries/commons-dbcp2-2.11.0-bin.zip
jdbc常见的四种连接池的使用(C3P0、Druid、HikariCP 、DBCP)_第4张图片
jdbc常见的四种连接池的使用(C3P0、Druid、HikariCP 、DBCP)_第5张图片

使用过程可能会遇到java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory错误

DBCP需要依赖这个工厂包装类包装日志所以我们还需要下载一个jar包

https://dlcdn.apache.org//commons/logging/binaries/commons-logging-1.3.0-bin.zip 直接下载

jdbc常见的四种连接池的使用(C3P0、Druid、HikariCP 、DBCP)_第6张图片
配置文件dbcp.properties

#加载数据库驱动
driverClassName=com.mysql.cj.jdbc.Driver
#数据库连接地址
url=jdbc:mysql://localhost:3306/MovieDB
#数据库用户名
username=root
#数据库密码
password=123456
#初始化连接数量
initialSize=10
#最大连接数
maxActive=30
#最大超时数3000ms
maxWait=3000

代码演示:

public class Demo{
	public static main(String [] args) throws SQLException, IOException {
            // 创建一个Properties对象
            Properties properties = new Properties();
            // 创建一个FileInputStream对象,用于读取src\\dbcp.properties文件
            FileInputStream fileInputStream = new FileInputStream("src\\dbcp.properties");
            // 使用FileInputStream对象读取文件,并将文件内容加载到properties对象中
            properties.load(fileInputStream);
            // 使用properties对象创建一个BasicDataSource对象
            BasicDataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
        Connection connection = dataSource.getConnection();
        ResultSet resultSet = connection.prepareStatement("select count(* )from movie").executeQuery();
        if(resultSet.next()){
            int count=resultSet.getInt(1);
            System.out.println(count);
        }
        resultSet.close();
        connection.close();
   		 }
	}
}

以上就是四种常见连接池的使用。

最后

总结不易,希望小宝们不要嫌弃哦!

你可能感兴趣的:(java)