数据源连接池

一、数据源连接池

1、为什么需要使用连接池

​ 由于数据库的连接和关闭是一项非常耗时的任务,而用户在操作数据时会频繁的对数据库资源访问和关闭,为了提高数据库连接的性能,提高系统运行效率,提出用专门的容器管理数据库的连接和释放 ,数据库连接池就是为了解决这一问题而发明的。

2、什么是连接池

​ 数据库连接池表示用于分配、管理、释放数据库连接的容器, 可以有效提高数据库连接的复用性和性能,可以将一个连接多次使用,而不释放给数据库。 可以通过设置各项参数(例如最大连接数,最大空闲时间,等待连接时长 )

​ 类似这样的容器还有很多,例如 常量池,线程池

​ 一般在项目开发中使用开源的数据库连接池 ,常用 c3p0 、dbcp、德鲁伊连接池 ,也可以自定义连接池 ,

​ 基本原理: 容器初始化默认获取n个连接 , 应用程序需要建立连接直接从容器中获取,一旦容器的连接池分配完毕,但没有超出容器连接上限,此时可以继续从数据库建立连接, 应用程序使用完将连接对象释放给容器 , 以便再次使用 ,如果容器的连接超出默认连接数,会自动释放多余的连接。如果连接数超时容器设置的最大连接数,则不会获取新的连接,需要等待其他资源释放才可使用。

3、自定义连接池理解连接池原理

​ 假设有一个存放连接对象的容器 ,可以使用集合存储连接对象(Connection) ,

4、使用开源的连接池

1、DBCP连接池(DataBase Connection Pool)

数据库开源连接池 提供一些基础配置,在管理连接池之前,需要配置数据源 DataSource

​ 步骤1:导入开源jar包

​ commons-dbcp.jar 、

​ commons-pool.jar

​ 步骤2: 写dbcp.properties配置文件

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/j2008_db?useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username=root
password=123456
#最大连接数
maxActive=50
#最小连接数
minIdle=10
#最小空闲数
maxIdle=10
#初始化连接数
initialSize=5
#空闲线程超时回收时间
removeAbandonedTieout=10
#最大等待时间  毫秒
maxWait=1000

步骤三:

    //  也通过读配置文件,将配置信息加载
        try {
            // 1、读取配置文件
            InputStream is =DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
            Properties prop = new Properties();
            // 2、加载属性文件
            prop.load(is);
            //3、 通过数据源工厂类
            ds = BasicDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            e.printStackTrace();
        }

步骤四: 测试并获取连接对象

 /**
     * 获取数据源连接对象
     * @return
     */
    public static Connection getConn(){

        try {
            if(ds!=null) {
                return ds.getConnection();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

2 Druid连接池

DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池,不知道速度有没有BoneCP快)。

​ 替换前一个dbcp的jar包

​ druid-1.1.22.jar

其他配置于dbcp的非常相似

和其它连接池一样DRUID的DataSource类为:com.alibaba.druid.pool.DruidDataSource

常用配置如下:

 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
  init-method="init" destroy-method="close"> 
  <property name="driverClassName" value="${jdbc.driverClassName}" /> 
  <property name="url" value="${jdbc.url}" /> 
  <property name="username" value="${jdbc.username}" /> 
  <property name="password" value="${jdbc.password}" /> 
  <!-- 配置初始化大小、最小、最大 --> 
  <property name="initialSize" value="1" /> 
  <property name="minIdle" value="1" /> 
  <property name="maxActive" value="10" />
 
  <!-- 配置获取连接等待超时的时间 --> 
  <property name="maxWait" value="10000" />
 
  <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> 
  <property name="timeBetweenEvictionRunsMillis" value="60000" />
 
  <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> 
  <property name="minEvictableIdleTimeMillis" value="300000" />
 
  <property name="testWhileIdle" value="true" />
 
  <!-- 这里建议配置为TRUE,防止取到的连接不可用 --> 
  <property name="testOnBorrow" value="true" /> 
  <property name="testOnReturn" value="false" />
 
  <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> 
  <property name="poolPreparedStatements" value="true" /> 
  <property name="maxPoolPreparedStatementPerConnectionSize" 
   value="20" />
 
  <!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->
 
  <property name="defaultAutoCommit" value="true" />
 
  <!-- 验证连接有效与否的SQL,不同的数据配置不同 --> 
  <property name="validationQuery" value="select 1 " /> 
  <property name="filters" value="stat" /> 
  <property name="proxyFilters"> 
   <list> 
    <ref bean="logFilter" /> 
   </list> 
  </property> 
 </bean>

在代码中创建数据源

druid.properties:

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/j2008_db?useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username=root
password=123456
    其他基础配置同上
static DataSource ds ;
    static{
        try {
            // 1、读取配置文件
            InputStream is =DBCPUtil.class.getClassLoader().getResourceAsStream("druid.properties");
            Properties prop = new Properties();
            // 2、加载属性文件
            prop.load(is);
            //3、 通过数据源工厂类
             ds = DruidDataSourceFactory.createDataSource(prop);
            System.out.println(ds.getConnection());
       } catch (Exception e) {
            e.printStackTrace();
        }
    }
原文地址:https://www.cnblogs.com/z5452830/p/14053522.html