DBCP连接池

DBCP连接池

  • DBCP(DataBase Connection Pool)属于Apache顶级项目Commons中的核心子项目(最早在Jakarta Commons里就有),在Apache的生态圈中的影响里十分广泛,比如最为大家所熟知的Tomcat就在内部集成了DBCP,实现JPA规范的OpenJPA,也是默认集成DBCP的。但DBCP并不是独立实现连接池功能的,它内部依赖于Commons中的另一个子项目Pool,连接池最核心的“池”,就是由Pool组件提供的,因此,DBCP的性能实际上就是Pool的性能,DBCP和Pool的依赖关系如下表:
Apache Commons DBCP Apache Commons Pool
v1.2.2 v1.3
v1.3 v1.5.4
v1.4 v1.5.4
v2.0.x v2.2
v2.1.x v2.4.2
v2.2.x v2.5.0
  • 可以看到,因为核心功能依赖于Pool,所以DBCP本身只能做小版本的更新,真正大版本的更迭则完全依托于pool。有很长一段时间,pool都还是停留在1.x版本,这直接导致DBCP也更新乏力。很多依赖DBCP的应用在遇到性能瓶颈之后,别无选择,只能将其替换掉,DBCP忠实的拥趸tomcat就在其tomcat 7.0版本中,自己重新设计开发出了一套连接池(Tomcat JDBC Pool)。好在,在2013年事情终于迎来转机,13年9月Commons-Pool 2.0版本发布,14年2月份,DBCP也终于迎来了自己的2.0版本,基于新的线程模型全新设计的“池”让DBCP重焕青春,虽然和新一代的连接池相比仍有一定差距,但差距并不大,DBCP2.x版本已经稳稳达到了和新一代产品同级别的性能指标(见下图)。

MySqlPool

  • DBCP终于靠Pool咸鱼翻身,打了一个漂亮的翻身仗,但长时间的等待已经完全消磨了用户的耐心,与新一代的产品项目相比,DBCP没有任何优势,试问,谁会在有选择的前提下,去选择那个并不优秀的呢?也许,现在还选择DBCP2的唯一理由,就是情怀吧。
  • 单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去

DBCP连接池的使用

导入相应jar包

  • (1)commons-dbcp.jar
  • (2)commons-pool.jar
  • (3)commons-logging.jar 日志支持(可选)
  • (4)mysql驱动包
  • 硬编码使用DBCP
    • 所谓的硬编码方式就是在代码中添加配置
  • 代码示例:
  public class DBCPUtil {
      private static BasicDataSource dataSource;
      static{
          try {
          //设置四个基本属性
          dataSource.setDriverClassName("com.mysql.jdbc.Driver");
          dataSource.setUrl("jdbc:mysql://localhost:3306/myschool?useSSL=true&characterEncoding=utf8");
          dataSource.setUsername("root");
          dataSource.setPassword("root");

          //其他属性
          //设置初始大小
          dataSource.setInitialSize(20);
          //设置最大个数
          dataSource.setMaxTotal(50);
          //设置最大空闲连接
          dataSource.setMaxIdle(10);
          //设置最小空闲连接
          dataSource.setMinIdle(5);
          //设置超时时间
          dataSource.setMaxWaitMillis(5000);
          } catch (Exception e) {
              e.printStackTrace();
          }
      }

      public static Connection getConnection(){
          try {
              return dataSource.getConnection();
          } catch (SQLException e) {
              e.printStackTrace();
          }
          return null;
      }

      public static int executeUpdate(String sql,Object...params){
          Connection conn = null;
          PreparedStatement pstat = null;
          try {
              conn = getConnection();
              pstat = conn.prepareStatement(sql);
              if(params!=null){
                  for (int i = 0; i <params.length ; i++) {
                      pstat.setObject(i+1,params[i]);
                  }
              }
              return pstat.executeUpdate();
          }catch (Exception e){
              e.printStackTrace();
          }finally {

          }
          return -1;
      }
  }
  • 软编码使用DBCP
    • 所谓的软编码,就是在项目中添加配置文件,这样就不需要每次代码中添加配合!
    • 项目中添加配置:
      • 文件名称: dbcp.properties
      • 文件位置: /src/resource下
  • DBCP.properties代码示例:
  #连接设置
  driverClassName=com.mysql.jdbc.Driver
  url=jdbc:mysql://localhost:3306/school
  username=root
  password=root
  #<!-- 初始化连接 -->
  initialSize=10
  #最大连接数量
  maxTotal=50
  #<!-- 最大空闲连接 -->
  maxIdle=20
  #<!-- 最小空闲连接 -->
  minIdle=5
  #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
  maxWaitMillis=5000
  • 软编码只需要把上面static静态内部类里面的代码修改一下即可:
 static{
      try {
          Properties properties = new Properties();
          InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
          properties.load(is);
          is.close();
          //使用抽象工厂创建连接
          dataSource = BasicDataSourceFactory.createDataSource(properties);
      } catch (Exception e) {
          e.printStackTrace();
      }
  }

参考


转载请注明:Memory的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦