JDBC常见的几种连接池&如何使用

目录

什么是连接池?

连接池的好处?

JDBC中常见的四种连接池:

C3P0

Druid(德鲁伊)

HikariCP(光)

DBCP

性能对比


什么是连接池?

连接池是一个管理数据库连接的技术。在应用程序与数据库进行通信的过程中,会频繁地创建和关闭数据库连接,这会消耗大量的系统资源和时间。而连接池可以在应用程序启动时创建一定数量的数据库连接并保存在连接池中,应用程序需要连接时可以从连接池中获取连接,使用完毕后归还给连接池,而不是关闭连接。这样可以避免频繁创建和关闭连接,提高系统的性能和可扩展性。同时,连接池还可以控制连接的数量,防止连接过多造成系统资源浪费和数据库性能下降。

连接池的好处

  1. 提高系统性能:连接池可以避免频繁创建和关闭数据库连接,减少了系统开销和响应时间,提高了系统的性能和稳定性。

  2. 节省系统资源:连接池可以预先创建一定数量的数据库连接,减少了连接的创建和关闭次数,节约了系统资源。

  3. 控制连接数量:连接池可以控制连接的数量,防止连接过多造成系统资源浪费和数据库性能下降。

  4. 提高程序可扩展性:连接池可以动态调整连接数量,适应不同的系统负载,保证系统的可扩展性。

  5. 减少数据库负担:连接池可以缓存数据库连接,减少了对数据库的访问次数,降低了数据库的负担,提高了数据库的性能和可靠性。

综上所述,连接池是提高系统性能和可扩展性的重要技术之一,应用广泛。

JDBC中常见的四种连接池:

C3P0:

jar包下载地址:http://c3p0/Resource%20Pools%20download%20%7C%20SourceForge.net

解压之后把下面两个jar包复制到项目中并添加到库

添加xml配置文件,文件名c3p0-config.xml固定的,代码如下:

<c3p0-config>
    <!--使用默认的配置读取数据库连接池对象 -->
    <default-config>
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/databaseName?useServerPrepStmts=true</property>
        <property name="user">root</property>
        <property name="password">root</property>

        <!-- 连接池参数 -->
        <!--初始化申请的连接数量-->
        <property name="initialPoolSize">5</property>
        <!--最大的连接数量-->
        <property name="maxPoolSize">10</property>
        <!--超时时间-->
        <property name="checkoutTimeout">3000</property>
    </default-config>

    <named-config name="otherc3p0">
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/databaseName?useServerPrepStmts=true</property>
        <property name="user">root</property>
        <property name="password">root</property>

        <!-- 连接池参数 -->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">10</property>
        <property name="checkoutTimeout">3000</property>
    </named-config>
</c3p0-config>

测试代码:

@Test
public void testC3p0() throws SQLException {
    // 使用named-config命名的配置,默认不用传入
    ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("otherC3p0");
    Connection connection = comboPooledDataSource.getConnection();
    System.out.println(connection);
}

控制台:

c3p0需要配置log4j日志否则控制台会输出很多日志信息:Log4j日志下载、安装、使用的博主链接

配置文件log4j.properties:

#日志打印的级别及目的地	debug>info>warn>error>fatal
#stdout控制台	logfile日志文件
log4j.rootLogger=debug,logfile

# Console output...打印到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %F %p %m%n

#日志文件打印设置
log4j.appender.logfile=org.apache.log4j.FileAppender
#日志的文件地址
log4j.appender.logfile.File=gdLog.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n

Druid(德鲁伊):

德鲁伊jar包下载本人使用的是1.2.0版本:https://repo1.maven.org/maven2/com/alibaba/druid/1.2.0/

添加配置文件,文件名自定,代码如下:

driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/bankdb?useServerPrepStmts=true
username = root
password = root
initialSize = 10
maxActive = 30
maxWait = 1000

测试代码:

@Test
public void testDruid() throws Exception {
    // 创建配置文件对象
    Properties properties = new Properties();
    // 创建一个文件输入流指向配置文件
    FileInputStream inputStream = new FileInputStream("src\\jdbc.properties");
    // 加载配置文件
    properties.load(inputStream);
    // 工厂包装类创建数据源
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    System.out.println(dataSource.getConnection());
}

控制台:

HikariCP(光):

HikariCP也需要配置log4j日志(log4j-1.2.15.jar);

HikariCP连接池jar包下载:Maven Repository: com.zaxxer » HikariCP » 4.0.3 (mvnrepository.com)

使用光连接池需要配置slf4j日志组件1.7.25版本jar包:https://mvnrepository.com/artifact/org.slf4j/slf4j-api/1.7.25

slf4j-log4j12-1.5.11.jar包下载:slf4j-log4j12(点击直接下载)

将这三个jar包复制到项目中并添加到库:

为什么配置日志需要这三个呢?详情slf4j-api、slf4j-log4j12、log4j之间关系

配置文件( .properties ):

# 数据库连接URL
jdbcUrl=jdbc:mysql://localhost:3306/mydatabase

# 数据库用户名
username=myusername

# 数据库密码
password=mypassword

# 连接池名称
poolName=MyConnectionPool

# 连接池大小
maximumPoolSize=10

# 最小空闲连接数
minimumIdle=5

# 连接超时时间(毫秒)
connectionTimeout=30000

# 空闲连接超时时间(毫秒)
idleTimeout=600000

# 最大生存时间(毫秒)
maxLifetime=1800000

测试代码:

 @Test
public void testHikari() throws SQLException, IOException {
    //1.配置连接池
    HikariConfig hikariConfig = new HikariConfig();
    //也可以通过properties配置文件配置连接池
    //Properties properties = new Properties();
    //FileInputStream fileInputStream = new FileInputStream("src/HikariCP.properties");
    //properties.load(fileInputStream);
    //HikariConfig hikariConfig = new HikariConfig(properties)
    hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306");
    hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
    hikariConfig.setUsername("root");
    hikariConfig.setPassword("root");
    hikariConfig.setMaximumPoolSize(30); // 最大连接数
    hikariConfig.setMinimumIdle(10);     // 最小连接数
    hikariConfig.setConnectionTimeout(3000); // 连接超时时间从连接池中获取一个连接最大等待多久时间,单位毫秒
   
    //2.通过配置类生成HikariCP连接池对象
    HikariDataSource dataSource = new HikariDataSource(hikariConfig);
    System.out.println(dataSource.getConnection());
}

控制台:

DBCP:

需要下载两个jar包点击直接下载或者去官网 

commons-pool2-2.12.0-bin.zip 直接下载

commons-dbcp2-2.11.0-bin.zip 直接下载

官网:

Pool – Download Apache Commons Pool

DBCP – Download Apache Commons DBCP

下载完成解压后把这两个jar包复制到项目中并添加到库

使用过程可能会遇到java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory错误,因为DBCP需要依赖这个工厂包装类包装日志所以我们还需要下载一个jar包:

commons-logging-1.3.0-bin.zip 直接下载

同样将jar包复制到项目中并添加为库:

dbcp.properties配置文件代码如下:

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

测试代码:

@Test
public void testDBCP() throws IOException, SQLException {
    // 创建一个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);
    // 打印dataSource对象创建的连接
    System.out.println(dataSource.getConnection());
}

DBCP和Druid(德鲁伊)一样也是从工厂包装类创建数据源对象

控制台:

性能对比:

各个连接池的配置参数相同:

driverClassName = com.mysql.cj.jdbc.Driver  //驱动类名
url = jdbc:mysql://localhost:3306/java001?useServerPrepStmts=true  //数据库连接URL
username = root  //数据库用户名
password = root  //数据库密码
initialSize = 10  //初始连接数
maxActive = 30  //最大连接数
maxWait = 3000  //连接超时时间;从连接池中获取一个连接最大等待多久时间,单位毫秒

测试代码:

//C3P0
ComboPooledDataSource cpds = new ComboPooledDataSource("otherc3p0_2");  //创建连接池对象
long c3p0LoginTime = System.currentTimeMillis();
for (int i = 0; i < 500; i++) {
    Connection connection = cpds.getConnection();  //获取连接
    connection.close();  //释放连接
}
long c3p0EndTime = System.currentTimeMillis();
System.out.println("C3P0连接池连接数据库500次耗时:" + (c3p0EndTime - c3p0LoginTime) + "ms");

//Druid(德鲁伊)
//加载配置文件
Properties properties = new Properties();
properties.load(new FileReader("src/连接池连接数据库/Druid.properties"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);  //创建一个指定参数的数据库连接池
long DruidLoginTime = System.currentTimeMillis();
for (int i = 0; i < 500; i++) {
    Connection connection = dataSource.getConnection();  //获取连接
    connection.close();  //释放连接
}
long DruidEndTime = System.currentTimeMillis();
System.out.println("Druid连接池连接数据库500次耗时:" + (DruidEndTime - DruidLoginTime) + "ms");

//HikariCP(光)
//加载配置文件
Properties properties2 = new Properties();
FileInputStream fileInputStream = new FileInputStream("src/连接池连接数据库/HikariCP.properties");
properties2.load(fileInputStream);
HikariConfig hikariConfig = new HikariConfig(properties2);  //通过properties配置文件创建Hikari配置对象
HikariDataSource dataSource2 = new HikariDataSource(hikariConfig);  //创建一个指定参数的数long HikariCPLoginTime = System.currentTimeMillis();
for (int i = 0; i < 500; i++) {
    Connection connection = dataSource2.getConnection();  //获取连接
    connection.close();  //释放连接
}
long HikariCPEndTime = System.currentTimeMillis();
System.out.println("HikariCP连接池连接数据库500次耗时:" + (HikariCPEndTime - HikariCPLoginTime) + "ms");

//DBCP
Properties properties3 = new Properties(); // 创建一个Properties配置文件对象
FileInputStream fileInputStream2 = new FileInputStream("src/连接池连接数据库/dbcp.properties");  // 创建一个FileInputStream对象,用于读取src/连接池连接数据库/Druid.properties文件
properties3.load(fileInputStream2);  // 使用FileInputStream对象读取文件,并将文件内容加载到properties对象中
BasicDataSource dataSource3 = BasicDataSourceFactory.createDataSource(properties3);  // 使用properties对象创建一个BasicDataSource对象
long DBCPLoginTime = System.currentTimeMillis();
for (int i = 0; i < 500; i++) {
    Connection connection = dataSource3.getConnection();  //获取连接
    connection.close();  //释放连接
}
long DBCPEndTime = System.currentTimeMillis();
System.out.println("DBCP连接池连接数据库500次耗时:" + (DBCPEndTime - DBCPLoginTime) + "ms");

控制台:

  • 42
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值