首页 > 数据库 >数据库连接池DBCP和C3P0

数据库连接池DBCP和C3P0

时间:2022-11-01 16:44:53浏览次数:62  
标签:java rs C3P0 DBCP sql import 连接池

数据库连接池

数据库连接---执行完毕---释放

连接---释放十分浪费资源

池化技术:准备一些预先的资源,过来就连接预准备好 的

最小连接数:10

最大连接数:15

如果超过最大连接数,那就等待

编写一个连接池,实现一个接口 DataSource

开源数据源实现

使用了这些数据库连接池之后,我们在项目中就不需要编写连接数据库的代码了

一、连接池DBCP

DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。

  1. 导入两个jar包commons-dbcp-1.4.jar和commons-pool-1.6.jar导入lib目录下

  1. 在src下new一个File文件------创建dbcpconfig.properties文件

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true
    username=root
    password=123456
    initialSize=10
    maxActive=50
    maxIdle=20
    minIdle=5
    maxWait=60000
    connectionProperties=useUnicode=true;characterEncoding=utf8
    defaultAutoCommit=true
    defaultReadOnly=
    defaultTransactionIsolation=REPEATABLE_READ
  2. 代码实现

    • 创建一个utils工具类

      package com.lyh.lesson05.utils;
      ​
      ​
      ​
      import org.apache.commons.dbcp.BasicDataSource;
      import org.apache.commons.dbcp.BasicDataSourceFactory;
      ​
      import javax.sql.DataSource;
      import java.io.InputStream;
      import java.sql.*;
      import java.util.Properties;
      ​
      public class JdbcUtils_DBCP {
          private static DataSource dataSource=null;
          static {
              try {
                  /**
                   * getClassLoader()获得一个加载器
                   * getResourceAsStream()拿到他的资源
                   * 返回一个输入流InputStream
                   */
                  InputStream inputStream = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
                  Properties properties = new Properties();
                  properties.load(inputStream);
                  //创建数据源BasicDataSource
                  //创建数据源工厂BasicDataSourceFactory---->工厂模式创建BasicDataSourceFactory.createDataSource(properties);
                  //properties把这个对象流导入进去加工
                  dataSource = BasicDataSourceFactory.createDataSource(properties);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
          //获取链接
          public static Connection getConnection() throws SQLException {
                return dataSource.getConnection();//从数据源获取连接
          }
          //释放资源
          public static void close(Connection connection, Statement statement, ResultSet resultSet) throws SQLException {
              if (resultSet!=null){
                  resultSet.close();
              }
              if (statement!=null){
                  statement.close();
              }
              if (connection!=null){
                  connection.close();
              }
      ​
          }
      }
    • 测试DBCP

      package com.lyh.lesson05;
      import com.lyh.lesson05.utils.JdbcUtils_DBCP;
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      public class TestDBCP {
          public static void main(String[] args) {
              Connection conn=null;
              PreparedStatement ps=null;
              ResultSet rs=null;
              try {
                  conn=JdbcUtils_DBCP.getConnection();
                  String sql="select * from users where id=1;";
                  ps=conn.prepareStatement(sql);
                  rs=ps.executeQuery();
                      while (rs.next()){
                          System.out.println(rs.getInt("id"));
                          System.out.println(rs.getString("name"));
                          System.out.println(rs.getString("password"));
                          System.out.println(rs.getString("email"));
                          System.out.println(rs.getDate("birthday"));
                      }
                  JdbcUtils_DBCP.close(conn,ps,rs);
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
      }

二、连接池C3P0

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

  1. 导入两个jar包c3p0-0.9.5.5.jar和mchange-commons-java-0.2.19.jar导入lib目录下

  2. 在src下new一个File文件------创建c3p0-config.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
        <default-config>
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy</property>
            <property name="user">root</property>
            <property name="password">123456</property>
    ​
            <property name="initialPoolSize">10</property>
            <property name="maxIdleTime">30</property>
            <property name="maxPoolSize">100</property>
            <property name="minPoolSize">10</property>
        </default-config>
    <!--    new ComboPooledDataSource("MySQL"); 锁定这个里面的MySQL-->
        <named-config name="MySQL">
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy</property>
            <property name="user">root</property>
            <property name="password">123456</property>
    ​
            <property name="acquireIncrement">5</property>
            <property name="initialPoolSize">10</property>
            <property name="maxIdleTime">30</property>
            <property name="maxPoolSize">100</property>
            <property name="minPoolSize">10</property>
        </named-config>
    </c3p0-config>
  3. 代码实现

    • 创建一个utils工具类

      package com.lyh.lesson05.utils;
      ​
      ​
      import com.mchange.v2.c3p0.ComboPooledDataSource;
      import org.apache.commons.dbcp.BasicDataSourceFactory;
      ​
      import javax.sql.DataSource;
      import java.io.InputStream;
      import java.sql.Connection;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;
      import java.util.Properties;
      ​
      public class JdbcUtils_C3P0 {
          private static DataSource dataSource=null;
          static {
              try {
                  //配置文件写法
                  //如果ComboPooledDataSource里面不写参数那就是默认的数据源,写了就是我们锁定的数据源
                  dataSource=new ComboPooledDataSource("MySQL");
      ​
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
          //获取链接
          public static Connection getConnection() throws SQLException {
                //接口的方法
              return dataSource.getConnection();//从数据源获取连接
          }
          //释放资源
          public static void close(Connection connection, Statement statement, ResultSet resultSet) throws SQLException {
              if (resultSet!=null){
                  resultSet.close();
              }
              if (statement!=null){
                  statement.close();
              }
              if (connection!=null){
                  connection.close();
              }
      ​
          }
      }
    • 测试C3P0

      package com.lyh.lesson05;
      ​
      import com.lyh.lesson05.utils.JdbcUtils_C3P0;
      import com.lyh.lesson05.utils.JdbcUtils_DBCP;
      ​
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      ​
      public class TestC3P0 {
          public static void main(String[] args) {
              Connection conn=null;
              PreparedStatement ps=null;
              ResultSet rs=null;
              try {
                  conn= JdbcUtils_C3P0.getConnection();
                  String sql="select * from users where id=1;";
                  ps=conn.prepareStatement(sql);
                  rs=ps.executeQuery();
                      while (rs.next()){
                          System.out.println(rs.getInt("id"));
                          System.out.println(rs.getString("name"));
                          System.out.println(rs.getString("password"));
                          System.out.println(rs.getString("email"));
                          System.out.println(rs.getDate("birthday"));
                      }
      ​
                  JdbcUtils_C3P0.close(conn,ps,rs);
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
      }

三、Druid:阿里巴巴

  1. Druid是什么

    • Druid是阿里开源的连接池,是Java语言中最好的数据库连接池.Druid能够提供强大的监控和扩展功能,是为监控而生的数据库连接池!

  2. 添加依赖

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.2</version>
    </dependency>
  1. 参考配置

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
          <!-- 基本属性 url、user、password -->
          <property name="url" value="${jdbc_url}" />
          <property name="username" value="${jdbc_user}" />
          <property name="password" value="${jdbc_password}" />
    ​
          <!-- 配置初始化大小、最小、最大 -->
          <property name="initialSize" value="1" />
          <property name="minIdle" value="1" /> 
          <property name="maxActive" value="20" />
    ​
          <!-- 配置获取连接等待超时的时间 -->
          <property name="maxWait" value="60000" />
    ​
          <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
          <property name="timeBetweenEvictionRunsMillis" value="60000" />
    ​
          <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
          <property name="minEvictableIdleTimeMillis" value="300000" />
    ​
          <property name="validationQuery" value="SELECT 'x'" />
          <property name="testWhileIdle" value="true" />
          <property name="testOnBorrow" value="false" />
          <property name="testOnReturn" value="false" />
    ​
          <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
          <property name="poolPreparedStatements" value="true" />
          <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
    ​
          <!-- 配置监控统计拦截的filters -->
          <property name="filters" value="stat" /> 
    </bean>

四、DBCP和C3P0区别

  1. dbcp没有自动的去回收空闲连接的功能c3p0有自动回收空闲连接功能

  2. 两者主要是对数据连接的处理方式不同!C3P0提供最大空闲时间,DBCP提供最大连接数。 前者当接超过最大空闲连接时间时,当前连接就会被断掉。DBCP当连接数超过最大连接数时,所有连接都会被断开。

  3. dbcp它的原理是维护多个连接对象Connection,在web项目要连接数据库时直接使用它维护的对象进行连接,省去每次都要创建连接对象的麻烦。提高效率和减少内存使用。

  4. s3p0可以自动回收连接,dbcp需要自己手动释放资源返回。不过dbcp效率比较高。

  5.  

标签:java,rs,C3P0,DBCP,sql,import,连接池
From: https://www.cnblogs.com/lyhidea/p/16848250.html

相关文章