JDBC常见的几种连接池使用

目录

  • 一、数据库连接池
    • 1.连接池介绍
    • 2.为什么要使用连接池?
  • 二、连接池种类
  • 三、使用连接池
  • 四、JDBC常见的四种连接池
    • 1、C3p0
    • 2、Druid(德鲁伊):
    • 3、HikariCP(光):
    • 4、DBCP链接池:

一、数据库连接池

1.连接池介绍

数据库连接池是一种管理数据库连接的技术,它可以在应用程序启动时创建一定数量的数据库连接,并将这些连接保存在一个连接池中。当应用程序需要访问数据库时,可以从连接池中获取一个空闲的连接,使用完毕后再归还给连接池。这样可以提高应用程序访问数据库的效率,减少数据库连接的开销。

2.为什么要使用连接池?

Java中的数据库连接池主要有以下几个特点:

  • 重用性:通过连接池复用已有的数据库连接,避免了频繁地打开和关闭数据库连接,提高了系统性能。
  • 高效性:连接池可以预先创建和管理一定数量的数据库连接,减少了等待建立连接的时间。
  • 安全性:连接池可以限制系统中同时存在的数据库连接数量,防止因为过多的连接导致系统资源耗尽。
  • 管理性:连接池可以对数据库连接进行监控和管理,如空闲超时、异常处理等。

JDBC常见的几种连接池使用_第1张图片

二、连接池种类

常见的连接池有C3P0、Druid、HikariCP 、DBCP

        1、 JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方来实现。

        2、 C3P0数据库连接池速度相对较慢(只是慢一丢丢),但是稳定性很好,Hibernate,Spring底层用的就是C3P0。

        3、 DBCP数据库连接池,速度比C3P0快,但是稳定性差。

        4、 Proxool数据库连接池,有监控连接池状态的功能,但稳定性仍然比C3P0差一些。

        5、 BoneCP数据库连接池,速度较快。

        6、 Druid数据库连接池(德鲁伊连接池),由阿里提供,集DBCP,Proxool,C3P0连接池的优点于一身,是日常项目开发中使用频率最高的数据库连接池。

        7、HikariCP:HikariCP是一个轻量级、高效的JDBC连接池,具有快速启动和低延迟的特点。HikariCP的设计目标是提供极佳的性能和可靠性,同时尽量减少资源消耗和开销。HikariCP支持各种JDBC驱动程序和数据源。相比于其他连接池,HikariCP配置简单,易于使用。

三、使用连接池

使用连接池的步骤如下:

使用数据库连接池的步骤如下:

  1. 引入相关jar包。需要导入的包包括JAVA通过jdbc访问mysql数据库所需的包,如mysql-connector-java-5.1.37-bin.jar;使用数据库连接池技术必需的包,如commons-pool.jar;以及使用dbcp连接池时所需的包,如commons-dbcp-1.2.2。配置数据源。这一步包括设置数据库URL、用户名和密码等相关信息。
  2. 从数据源中获取连接。在应用程序需要访问数据库时,可以通过调用数据源的getConnection()方法来获取数据库连接。
  3. 使用连接执行SQL操作。可以使用获取到的数据库连接来执行SQL查询或更新操作。
  4. 释放连接。完成SQL操作后,需要调用Connection对象的close()方法来释放数据库连接,将其返回到连接池中以供后续使用。

四、JDBC常见的四种连接池

1、C3p0

定义:

C3P0是一个开源的JDBC数据库连接池库,它提供了高度灵活和高性能的连接池实现。它可以与各种关系型数据库一起使用,包括MySQL、Oracle、SQL Server等。实际上,“C3P0"的名称代表"Connect3 Pool”,意味着它可以管理多个数据库连接。

1.1、导入jar包

jar包下载地址:https://sourceforge.net/projects/c3p0/

<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>

1.2、配置xml文件
JDBC常见的几种连接池使用_第2张图片
1.3 c3p0-config.xml模板

<c3p0-config>
    
    <default-config>
        
        <property name="driverClass">com.mysql.jdbc.Driverproperty>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcworks1214?useServerPrepStmts=trueproperty>
        <property name="user">rootproperty>
        <property name="password">20040417property>

        
        
        <property name="initialPoolSize">5property>
        
        <property name="maxPoolSize">10property>
        
        <property name="checkoutTimeout">3000property>
    default-config>

    
    
    
    
    
    

    
    
    
    
    
c3p0-config>

测试代码:

文件会自动读取 C3P0的配置文件 c3p0-config.xml

package javajdbc连接池;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Dome {
    public static void main(String[] args)throws PropertyVetoException, SQLException {
        Dome d=new Dome();
        d.test();
    }
    public void test() throws PropertyVetoException, SQLException {
        //c3p0的数据源
        ComboPooledDataSource dataSource=new ComboPooledDataSource();
        //连接数据库参数
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1/数据库名");
        dataSource.setUser("root");			//用户名
        dataSource.setPassword("20040417"); //用户密码
        //连接池参数设置
        dataSource.setInitialPoolSize(5);
        dataSource.setMaxPoolSize(20);//最大连接数
        dataSource.setCheckoutTimeout(3000);//连接超时

        Connection con=dataSource.getConnection();
        System.out.println("c3p0连接成功");
        //查询数据库
        ResultSet rs=con.prepareStatement("select count(*) from grade").executeQuery();
        while (rs.next()){
            int count=rs.getInt(1);
            System.out.println(count);
        }
        con.close();
    }
}

控制台效果:
JDBC常见的几种连接池使用_第3张图片

2、Druid(德鲁伊):

定义:

Druid是阿里巴巴开源的一个功能强大且高性能的JDBC数据库连接池,它提供了丰富的功能和配置选项。Druid连接池是为监控而生,内置了强大的监控功能,这些监控特性并不会对性能产生影响。

2.1、导入jar包
Druid(德鲁伊) jar包下载地址(本人用1.2.0版本):https://repo1.maven.org/maven2/com/alibaba/druid/1.2.0/
JDBC常见的几种连接池使用_第4张图片

2.2、添加配置文件 文件名自定义

src下的配置文件信息:

url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
username=root
password=123456
driverClassName=com.mysql.jdbc.Driver

initialSize=10
maxActive=20
maxWait=1000
filters=wall

测试代码:

package 德鲁伊连接池;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.Test;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Properties;

public class Druid {
    @Test
    // 创建一个Properties对象,用于加载src/jdbc.properties文件
    public void show() throws Exception {
        Properties properties = new Properties();
        // 从文件中加载属性
        properties.load(new FileInputStream("src/jdbc.properties"));
        // 使用DruidDataSourceFactory创建一个数据源
        DataSource ds= DruidDataSourceFactory.createDataSource(properties);
        // 获取一个连接
        Connection con=ds.getConnection();
        // 执行一个查询,查询user表中的记录数
        ResultSet rs=con.prepareStatement(" select count(*)from user ").executeQuery();
        // 遍历查询结果
        while (rs.next()){
            int str=rs.getInt(1);
            System.out.println(str+"人");
        }
        // 关闭连接
        con.close();
    }
}
//输出结果 为  5人

3、HikariCP(光):

HikariCP连接池定义:

HikariCP是由日本程序员开源的一个数据库连接池组件, Hikari连接池号称“史上最快连接池,代码非常轻量,并且速度非常的快。根据官方提供的数据,在i7,开启32个线程32个连接的情况下,进行随机数据库读写操作,HikariCP的速度是现在常用的C3P0数据库连接池的数百倍。在SpringBoot2.0中,官方也是推荐使用HikariCP

3.1、导入jar包:

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

jar包复制到项目中并添加到库:
JDBC常见的几种连接池使用_第5张图片
3.2、添加配置文件


# 数据库连接URL
jdbcUrl=jdbc:mysql://localhost:3306/mydatabase
# 数据库用户名
username=myusername
# 数据库密码
password=mypassword
# 连接池名称
poolName=MyConnectionPool
# 连接池大小
maximumPoolSize=10
# 最小空闲连接数
minimumIdle=5
# 连接超时时间(毫秒)
connectionTimeout=30000
# 空闲连接超时时间(毫秒)
idleTimeout=600000
# 最大生存时间(毫秒)
maxLifetime=1800000

测试代码:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

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

public class HikariCPDemo {

    private static final String DB_URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
    private static final String DB_USER = "root";
    private static final String DB_PASSWORD = "123456";

    public static void main(String[] args) {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl(DB_URL);
        config.setUsername(DB_USER);
        config.setPassword(DB_PASSWORD);
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

        HikariDataSource dataSource = new HikariDataSource(config);

        try (Connection connection = dataSource.getConnection()) {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            dataSource.close();
        }
    }
}
//输出结果为  ID:1,Name:张三

4、DBCP链接池:

DBCP链接池定义:

全称Database Connection Pool,是Apache下的一个Java连接池项目,也是DBCP,全称Database Connection Pool,是Apache下的一个Java连接池项目,也是Tomcat使用的连接池组件。数据库连接是一个耗时且耗资源的行为,通过使用DBCP连接池,可以预先建立与数据库的连接,从而减少打开和关闭连接的时间和资源消耗。

4.1、引入jar包:

官网俩个jar包下载网址:

Pool – Download Apache Commons Pool

DBCP – Download Apache Commons DBCP

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/eea52c223f9e42ca9b4c2489c6f25c9f.jpeg#pic_center)

4.2、DBCP配置文件代码如下:

url=jdbc:mysql://localhost:3306/database
driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=root
initialSize=10
maxActive=30
maxWait=3000

测试代码演示:

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.dbcp2.BasicDataSource;

public class DBCPDemo {
    private static final String DB_URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
    private static final String DB_USER = "root";
    private static final String DB_PASSWORD = "123456";

    public static void main(String[] args) {
        // 创建数据源对象
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl(DB_URL);
        dataSource.setUsername(DB_USER);
        dataSource.setPassword(DB_PASSWORD);

        // 设置连接池参数
        dataSource.setInitialSize(5); // 初始连接数
        dataSource.setMaxTotal(10); // 最大连接数
        dataSource.setMinIdle(2); // 最小空闲连接数
        dataSource.setMaxIdle(5); // 最大空闲连接数
        dataSource.setMaxWaitMillis(10000); // 获取连接等待时间

        try (Connection connection = dataSource.getConnection()) {
            // 创建语句对象
            Statement statement = connection.createStatement();
            // 执行查询操作
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
            // 处理查询结果
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭数据源
            dataSource.close();
        }
    }
}
//输出结果为  ID:1,Name:张三

你可能感兴趣的:(数据库,java)