JDBC 连接池(DBCP/Druid)

一、连接池概述

1、为什么要使用数据库连接池?

       数据库(Connection)是一种关键的、有限的、昂贵的资源。

       普通的JDBC数据库连接使用 DriverManager.getConnection(...)来获取,每次向数据库建立连接时都要将Conneciton加载到内存,在验证用户名和密码,使用完毕时,释放资源,即断开与数据库的连接。连接过多时,会导致内存泄漏,服务器崩溃。

所以,数据库的连接来之不易,保证重复使用

2、使用连接池的好处

       连接复用:通过建立一个数据库连接池以及一套连接使用管理策略,使得一个数据库连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。

       共享资源:连接池的使用解决了资源频繁分配、释放所造成的问题的。提供一套高效的连接分配、使用策略,最终目标是实现连接的高效、安全的复用。

3、常用连接池

      DBCP(DataBase Connection Pool)属于Apache顶级项目Commons中的核心子项目

      Druid:阿里开源的Druid(德鲁伊)不仅仅是一个连接池,还添加了监控功能等,号称世界上最好的连接池组件,非常受恩宠。

参考文章:

    常用Java数据库连接池

    数据库连接池了解和常用连接池对比

4、Java中如何使用连接池/数据源?

        在Java中,连接池使用 javax.sql.DataSource接口来表示连接池(数据源)。

        连接池:用池来管理Connection,这样可以重复使用Connection。连接池会自己创建Connection,使用时通过池来获取Connection对象,当使用完后再将Connection归还到池中去。池就可以再利用这个Connection。

        数据源(DataSource)和连接池(Connection Pool)是同一个概念,好比对象和实例。

注意:DataSource和JDBC一样,仅仅只是接口,需要第三方组织来实现。

二、DBCP连接池

需要导入这几个架包:注意JDK版本

    commons-dbcp2-2.7.0.jar  官网下载与文档

    commons-pool2-2.7.0.jar   官网下载

    commons-logging-1.2.jar    官网下载

如何创建DataSource对象,参考文档:commons-dbcp2-2.7.0-src\doc\BasicDataSourceExample.java

    

1、简单测试

     org.apache.commons.dbcp2.BasicDataSource

     BasicDataSource类实现了DataSource接口,可以用于DBCP连接池的简单使用。包含连接数据库的四要素等属性配置信息。

     更详细的信息可参考DBCP的官

username要传递给JDBC驱动程序以建立连接的连接用户名。
password要传递给JDBC驱动程序以建立连接的连接密码。
url要传递给JDBC驱动程序以建立连接的连接URL。
driverClassName要使用的JDBC驱动程序的标准Java类名。
参数默认描述
INITIALSIZE0池启动时创建的初始连接数。 
自:1.2
maxTotal8可以同时从此池分配的最大活动连接数,或者无限制的负数。
maxidle8池中可以保持空闲的最大连接数,没有额外的连接被释放,或者没有限制为负。
minIdle0池中可以保持空闲的最小连接数,不创建额外的连接数,或者为零创建无连接数。
maxWaitMillis无限期池将在抛出异常之前返回的连接等待(当没有可用连接时)的最大毫秒数,或-1无限期等待的毫秒数。
import java.sql.Connection;
import java.sql.PreparedStatement;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.junit.Test;

public class DBCPTest {
   
    public static DataSource getDataSource(){
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/jdbcdemo");
        ds.setUsername("root");
        ds.setPassword("123456");
        ds.setMaxTotal(5);
        System.out.println(ds);
        return ds;
    }
    
    @Test
    public void testSave() throws Exception {
        String sql = "INSERT INTO t_user(username,age) VALUES(?,?)";
        Connection conn = null;
        PreparedStatement ps = null;
        // 从连接池中获取Connection对象
        conn = getDataSource().getConnection();
        ps = conn.prepareStatement(sql);
        ps.setString(1,"赵子龙");
        ps.setInt(2,17);
        ps.executeUpdate();
    }
}

2、提取properties文件

     org.apache.commons.dbcp2.BasicDataSourceFactory

     BasicDataSourceFactory实现了javax.naming.spi.ObjectFactory接口。

     BasicDataSourceDataFactory类主要根据一个实现了DataSource接口的对象,获取该对象的相关数据源配置参数(通过Reference对象,采用类似指针的方法),然后将new一个BaiscDataSource对象,结合获取的参数,形成一个BasicDataSource对象,并将之返回。

     

     dbcp.properties

#dbcp属性配置
#key不可以乱写,必须是BasicDataSource的属性 (setter方法)
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=123456
maxTotal=5

    DBCPUtil.java

import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSourceFactory;

// JDBC的工具类
public class DBCPUtil {
    private static DataSource ds = null;

    static{
        try {
            //加载读取dbcp.properties文件
           Properties properties = new Properties();
           InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("dbcp.properties");
           properties.load(inStream);
           System.out.println(properties.getProperty("url"));
           //创建DataSource对象
           ds = BasicDataSourceFactory.createDataSource(properties);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

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

    //释放资源,不断开与数据库的连接,资源归还给连接池管理
    public  static void close(Connection conn, Statement st, ResultSet rs){
        try {
            if(rs != null){
                rs.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if(st != null){
                    st.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                try {
                    if(conn != null){
                        conn.close();
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

    DBCPTest.java

import java.sql.Connection;
import java.sql.PreparedStatement;

import org.junit.Test;

import cn.jq.jdbc.util.DBCPUtil;

public class DBCPTest {
    
    @Test
    public void testSave2() {
        String sql = "INSERT INTO t_user(username,age) VALUES(?,?)";
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            // 从连接池中获取Connection对象
            conn = DBCPUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setString(1,"赵子龙");
            ps.setInt(2,17);
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCPUtil.close(conn, ps, null);
        }
    }
}

三、Druid连接池

       Druid(德鲁伊)了解:阿里巴巴开源项目 Druid 负责人温少访谈

       Druid是一个开源项目,源码托管在github上,源代码仓库地址是 https://github.com/alibaba/druid 。同时每次Druid发布正式版本和快照的时候,都会把源码打包,你可以从上面的下载地址中找到相关版本的源码。Druid中文文档

       

使用起来类似于DBCP,导包 druid-1.1.11.jar

DruidDataSource的配置是兼容DBCP的。从DBCP迁移到DruidDataSource,只需要修改数据源的实现类就可以了

DBCP的数据库连接池的实现是:

        org.apache.commons.dbcp.BasicDataSource 替换为:com.alibaba.druid.pool.DruidDataSource

在上面demo修改DBCPUtil.java即可

   

如果需要使用Druid的其他配置,可以参考中文文档。

     

 

总结:

    1)JDBC连接池只需要将DriverManager替换为DataSource来获取Connection即可

    2)第三方组织实现DataSource接口的实现类来封装连接配置属性信息,具体查看官方文档。

    3)提取xxx.properties文件,重构util时,使用 XxxDataSourceFactory类来创建DataSource。

简单入门,为后面掌握框架整合打好基础

 

     站在前辈的肩膀上,每天进步一点点

ends~

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C3P0 和 DBCP 都是连接池技术,可以有效地管理数据库连接,减少连接建立和释放的消耗。Druid 技术比 C3P0 和 DBCP 更加先进,它具有更高的性能和安全性,并且支持对数据库的实时监控和统计分析。 ### 回答2: c3p0,DBCP,和Druid都是Java中常用的数据库连接池技术,它们各自有不同的技术侧重和优势。 c3p0连接池是一个开源的JDBC连接池,侧重于提供高性能和可靠的连接池管理。其优势包括: 1. 可以自动缓存和重用数据库连接,避免频繁创建和销毁连接,提高了数据库访问的性能。 2. 提供连接断线自动恢复功能,能够检测并处理数据库连接的断开和超时问题,保证系统的稳定性。 3. 支持连接池的配置和监控,可以通过配置文件或者代码动态调整连接池的参数,满足不同业务需求。 4. 能够处理不同数据库的连接,支持主流数据库如MySQL、Oracle等。 DBCP连接池是Apache Commons项目中的一个模块,侧重于提供简单易用的连接池实现。其优势包括: 1. 配置简单,可以通过简单的配置文件即可完成连接池的创建和管理。 2. 轻量级,与应用程序集成方便,对代码的侵入性较小。 3. 支持基本的连接池功能,如连接的管理、复用和释放。 4. 良好的可扩展性,可以通过集成其他组件来实现更高级的功能。 Druid连接池是阿里巴巴开源的一款高性能、可扩展和功能丰富的数据库连接池,侧重于提供全方位的数据库连接管理。其优势包括: 1. 提供性能监控和统计功能,可以实时监控数据库连接池的状态和性能指标,方便线上问题的排查和性能优化。 2. 支持连接池的防火墙功能,可以通过配置白名单、黑名单等规则来过滤恶意或异常的数据库连接。 3. 内置了SQL防注入功能,能够自动检测和阻止恶意SQL注入攻击。 4. 提供了数据库连接的可视化接口,方便开发人员查看和管理连接池的状态和连接使用情况。 总的来说,c3p0、DBCPDruid都是成熟、稳定的数据库连接池技术,根据实际需求和性能要求选择合适的连接池可以提升应用的数据库访问性能和稳定性。 ### 回答3: c3p0,DBCPDruid都是常用的数据库连接池技术,它们都有各自的侧重和优势。 c3p0是一种快速而可靠的JDBC连接池,侧重于提供高性能的连接缓存和连接池管理。它可以对JDBC连接进行管理和重用,有效地降低了数据库连接的创建和关闭的消耗。同时,c3p0还支持连接池的配置,可以根据应用的负载情况进行自动调整,保证连接池的稳定性。 DBCP(数据库连接池)也是一种常用的连接池技术,它侧重于提供简单易用的连接池解决方案。DBCP提供了基本的连接池功能,并且可以通过配置文件进行定制。它的优势在于使用简单,不需要过多的配置和调整,适用于一些简单的应用场景。 Druid是阿里巴巴开源的数据库连接池,侧重于提供高性能和可扩展性。它支持了连接池的所有功能,同时还提供了一些监控和统计功能,可以方便地监控和定位问题。Druid还内置了SQL防火墙和统计功能,可以有效地防止SQL注入攻击和性能问题。 总的来说,c3p0,DBCPDruid都是优秀的连接池技术,具有各自的特点和优势。根据应用的需求和场景,可以选择合适的连接池技术来提高数据库访问的性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值