JDBC数据库连接池

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> JDBC数据库连接池

点击蓝字“程序员考拉”欢迎关注!

JDBC数据库连接池

用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的。数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

一.DBCP数据源

DBCP 是 Apache 软件基金组织下的开源连接池实现,要使用DBCP数据源,需要应用程序应在系统中增加如下两个 jar 文件:

  • Commons-dbcp.jar:连接池的实现
  • Commons-pool.jar:连接池实现的依赖库
  • Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

     

    1.编写数据库连接池

    编写dbcp连接池需实现java.sql.DataSource接口。

     

    
    public void DBCPtest() throws SQLException{
      BasicDataSource datasource=null;
      //1.创建DBCP数据源实例
      datasource=new BasicDataSource();
      //2.为数据源指定必须的属性
      datasource.setUsername("root");
      datasource.setPassword("0404");
      datasource.setUrl("jdbc:mysql://localhost:3303/extra");
      datasource.setDriverClassName("com.mysql.jdbc.Driver");
      //3.指定数据源的一些可选的属性
      //1).指定数据库连接池中初始化连接数的个数
      datasource.setInitialSize(10);
      //2).指定数据库连接池中最大连接个数:同一时刻可以同时向数据库申请的连接个数
      datasource.setMaxTotal(50);
      //3).指定最小的连接数
      datasource.setMinIdle(5);
      //4).等待数据库连接池分配连接的最长时间,单位毫秒,超出抛异常
      datasource.setMaxWaitMillis(1000*5);
      //4.从数据源中获取数据库连接
      Connection connection=datasource.getConnection();
      System.out.println(connection);
    }
    

     

    指定的数据源的属性可以放在配置文件中:

    
    username=root
    password=0404
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3303/extra
    
    initialSize=10
    maxTotal=50
    minIdle=5
    maxWaitMillis=5000
    

    示例代码:

    
    public void testDBCPWithDataSourceFactory() throws Exception{
      Properties properties=new Properties();
      InputStream inStream=JDBCTest.class.getClassLoader().
          getResourceAsStream("dbcp.properties");
      properties.load(inStream);
      DataSource dataSource=BasicDataSourceFactory.createDataSource(properties);
      System.out.println(dataSource.getConnection());
      BasicDataSource basicDataSource=(BasicDataSource)dataSource;
      System.out.println(basicDataSource.getMaxWaitMillis());
    }
    

    上面代码创建jdbc数据库连接池的步骤分为以下几步:

    ①加载dbcp的properties配置文件:配置文件中的键需要来自BasicDataSource的属性。

    ②调用BasicDataSourceFactory的createDataSource方法创建DataSource实例。

    ③从DataSource实例中获取数据库连接。

    二.C3P0数据源

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate, Spring等。C3P0数据源在项目开发中使用得比较多。

    要使用C3P0数据源,需要应用程序应在系统中增加如下两个 jar 文件:

  • c3p0-0.9.2.jar
  • mchange-commons.jar
  • c3p0与dbcp区别:

  • dbcp没有自动回收空闲连接的功能
  • c3p0有自动回收空闲连接功能
  •  

    1.创建c3p0数据库连接池

    
    public void testC3P0() throws PropertyVetoException, SQLException{
      ComboPooledDataSource cpds = new ComboPooledDataSource();
      cpds.setDriverClass( "com.mysql.jdbc.Driver" );
      cpds.setJdbcUrl( "jdbc:mysql://localhost:3303/extra" );
      cpds.setUser("root"); 
      cpds.setPassword("0404");
      System.out.println(cpds.getConnection());
    }
    

    同样可以将setxxx的属性放置在配置文件中:(c3p0的配置文件的格式为xml)

    
    c3p0-config
     named-config name="helloC3P0" 
     property name="user"root/property 
     property name="password"0404/property 
     property name="driverClass"com.mysql.jdbc.Driver/property 
     property name="jdbcUrl"jdbc:mysql://localhost:3303/extra/property 
     !-- 若数据库中连接数不足时,一次性向数据库服务器申请多少个连接 --
     property name="acquireIncrement"50/property 
     !-- 初始化数据库时连接池的个数 --
     property name="initialPoolSize"100/property 
     !-- 数据库连接池中最小的数据库连接个数 --
     property name="minPoolSize"50/property 
     property name="maxPoolSize"1000/property
     !-- c3p0数据库连接池可以维护的Statement的最大的个数 -- 
     property name="maxStatements"20/property 
     !-- 每个连接可以使用多少个Statement --
     property name="maxStatementsPerConnection"5/property 
     /named-config
    /c3p0-config
    

    示例代码:

    
    public void testC3P0WithConfigFile() throws SQLException{
      DataSource dataSource=new ComboPooledDataSource("helloC3P0");
      System.out.println(dataSource.getConnection());
    }
    

    上面代码中:

    ①创建c3p0-config.xml文件,参考api帮助文档;

    ②创建ComboPooledDataSource实例:DataSource dataSource=new ComboPooledDataSource(“helloC3P0”);

    ③从DataSource实例中获取数据库连接。

    至此JDBCTools中的数据库连接方法就可以改为:

    
    private static DataSource dataSource=null;
    static{
            //数据库连接池应该只被初始化一次
      dataSource=new ComboPooledDataSource("helloc3p0");
    }
    public static Connection getconnection2() throws SQLException{
      return dataSource.getConnection();
    }
    

     

    JDBC数据库连接池
    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    转载声明:转载请注明出处,本技术博客是本人原创文章

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> JDBC数据库连接池


      转载请注明: 好好学java JDBC数据库连接池

     上一篇
    MySQL查询和更新数据(一) MySQL查询和更新数据(一)
    点击蓝字“程序员考拉”欢迎关注! 一.组合表表达式 1.使用UNION组合   使用UNION组合,最终的结果出现了两个表表达式中的一个结果的每一行,等同于并集运算符。   原始表: 使用UNION运算符重复的行自动
    下一篇 
    数据库事务 数据库事务
    点击蓝字“程序员考拉”欢迎关注! 1.JDBC处理事务 数据库事务是一组逻辑操作单元,使数据从一种状态变换到另一种状态。为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元,当它全部完成时,数据的一致性可以保持,而当这