数据库连接池

Posted shengwangmei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库连接池相关的知识,希望对你有一定的参考价值。

数据库连接池

一、什么是数据库连接池

  数据库连接是一种关键的、有限的、昂贵的资源。每次用户获取数据库连接都需要消耗较大的资源,数据库连接池可以管理连接,可以重复使用连接而不需要每次都进行创建。使用池来管理连接的生命周期,可以节省资源,提高性能。用池来管理Connection,这可以重复使用Connection。有了池,我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。数据库连接池的原理通俗地说:先创建好几个数据库放在池里,等系统需要用了直接去连接,并做上标记(连接),用完后再将数据库连接还回到池里,同时做上标记(空闲)。当有连接需求时,此时又没有空闲数据库连接,则会新建立连接放入池中。而这些参数我们都可以自己进行配置,如:
  - 初始大小:10个
  - 最小空闲连接数:3个
  - 增量:一次创建的最小单位(5个)
  - 最大空闲连接数:12个
  - 最大连接数:20个
  - 最大的等待时间:1000毫秒

二、常见连接池
  这里总结下两个常见的连接池:DBCP和c3p0。导包是使用数据库连接池的第一步,
  1.DBCP:导jar包,commons-pool.jar、commons-dbcp.jar
  DBCP是Apache提供的一款开源免费的数据库连接池。

    public void demo1() throws SQLException {
        //导入核心类:BasicDataSource
        BasicDataSource ds = new BasicDataSource();

        //基本配置
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/mydb1");
        ds.setUsername("root");
        ds.setPassword("123");
        
        //最大连接数     
        ds.setMaxActive(20); 
        //最大空闲连接数:表示即使没有数据库连接时依然可以保持10个空闲的连接,而不被清除,随时处于待命状态。设 0 为没有限制。  
        ds.setMaxIdle(10); 
        //初始化连接数    
        ds.setInitialSize(10) ;
        //最小空闲连接数   
        ds.setMinIdle(2) ;
        //最大等待毫秒数
        ds.setMaxWait(1000) ;
        
        Connection con = ds.getConnection();
        //只是将连接归还池
        con.close() ;
}


  2.c3p0:导jar包,c3p0-0.9.2-pre1.jar、c3p0-oracle-thin-extras-0.9.2-pre1.jar、mchange-commons-0.2.jar
  c3p0也是开源免费的连接池!

public void demo2() throws PropertyVetoException, SQLException {
    //导入核心类:ComboPooledDataSource
    ComboPooledDataSource ds = new ComboPooledDataSource();
    //基本配置
    ds.setDriverClass("com.mysql.jdbc.Driver");
    ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1");
    ds.setUser("root");
    ds.setPassword("123");
    
    
    //每次的增量为5
    ds.setAcquireIncrement(5) ;
    //初始化连接数为20
    ds.setInitialPoolSize(20) ;
    //最少连接数为2
    ds.setMinPoolSize(2) ;
    //最大连接数为50
    ds.setMaxPoolSize(50) ;
    
    Connection con = ds.getConnection();
    //只是将连接归还池
    con.close();
}

  使用配置文件进行连接,有两个要求:(1)配置文件:c3p0-config.xml;(2)文件位置:src下

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config> 
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">123</property>
        <property name="acquireIncrement">3</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">2</property>
        <property name="maxPoolSize">10</property>
    </default-config>
</c3p0-config>

  c3p0的配置文件中可以配置多个连接信息,可以给每个配置起个名字,这样可以方便的通过配置名称来切换配置信息。上面文件中默认配置为mysql的配置,名为test-config的配置也是mysql的配置。此时可以使用有参构造器进行指定配置信息:ComboPooledDataSource ds = new ComboPooledDataSource("test-config") 。

    <named-config name="test-config"> 
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">123</property>
        <property name="acquireIncrement">3</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">2</property>
        <property name="maxPoolSize">10</property>
    </named-config>

文末:不知道大家有没有对c3p0这个连接池名字好奇,网上查了下c3p0的全称,发现了一个小故事:
据传闻:c3p0连接池作者是《星球大战》迷,C3P0就是其中的一个机器人,并且这个名称中包涵connection 和pool的单词字母。因此叫这个名字。C3P0就是下图中的右边的那个机器人。左边是他哥哥R2D2。(小故事来源:https://blog.csdn.net/wang_xuaohao/article/details/8565864)
技术分享图片


















以上是关于数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

连接池报错 Proxool Provider unable to load JAXP configurator file: proxool.xml

MySQL与Redis数据库连接池介绍(图示+源码+代码演示)

稳定性 耗时 监控原因分析-- dubbo rpc 框架 的线程池,io 连接模型. 客户端,服务端

基于UniDac的数据库连接池

数据库连接池的Java连接池