数据库连接池

1,概念:

其实就是一个容器(集合),存放数据库连接的容器。

当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来采访数据时,从容器中获取连接对象,用户访问完后,会将连接对象归还给容器

2,好处:

1,节约资源

2,用户访问高效

3,实现:

1,标准接口:DataSource java.xql包下的

这个接口是没有java官方是没有提供实现类的!

方法:

获取连接:Connection getConnection()
​
归还连接:如果连接对象Connection是从连接池里获得的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接

2,一般我们不去实现它,有数据库厂商来实现

1,C3P0:数据库连接池技术
2,Druid:数据库连接池的技术,由阿里巴巴提供的

C3P0

  • 步骤:

  • 1,导入两个jar包,也不要忘了导入musql那个jar包

    c3p0-0.9.5.2.jar        mchange-commons-java-0.2.12.jar
  • 2,定义配置文件

    配置文件名称:

    c3p0.properties 或 c3p0-config.xml

    xml文件内容: xml文件名就是上面那个

    <c3p0-config>
      <!--使用默认的配置读取连接池对象 -->
      <default-config>
          <!--连接参数-->
          <property name="driverClass">com.mysql.jdbc.Driver</property>
          <property name="jdbcUrl">jdbc:mysql:///zhoupeng</property>
          <property name="user">root</property>
          <property name="password">root</property>
    <!--       连接池参数-->
          <property name="initialPoolSize">5</property> <!--//初始化连接池-->
          <property name="maxPoolSize">10</property><!--连接池最大数-->
          <property name="checkoutTimeout">3000</property><!--初始化等待时间,如果3秒没有创建完成,会出异常-->
      </default-config>
      <named-config name="otherc3p0">
          <!--连接参数-->
          <property name="driverClass">com.mysql.jdbc.Driver</property>
          <property name="jdbcUrl">jdbc:mysql:///zhoupeng</property>
          <property name="user">root</property>
          <property name="password">root</property>
          <!--连接池参数-->
          <property name="initialPoolSize">5</property>
          <property name="maxPoolSize">8</property>
          <property name="checkoutTimeout">1000</property>
      </named-config>
    </c3p0-config>

    路径:

    直接将文件放在src目录下
  • 3,创建核心对象 数据库连接池对象 ComboPooledDataSource

    DataSource dataSources = new ComboPooledDataSource();
  • 4,获取连接:get Connection

     Connection connection = dataSources.getConnection();

c390xml文件的验证

<property name="maxPoolSize">10</property><!--连接池最大数-->

验证代码1:

        DataSource ds = new ComboPooledDataSource();
      for (int i = 0; i <10 ; i++) {
          Connection c = ds.getConnection();
          System.out.println(i+": "+c);
      }

验证代码2:

    DataSource ds = new ComboPooledDataSource();
      for (int i = 0; i <11 ; i++) {
          Connection c = ds.getConnection();
          System.out.println(i+": "+c);
      }

结果1:

0: com.mchange.v2.c3p0.impl.NewProxyConnection@3d5c822d [wrapping: com.mysql.jdbc.JDBC4Connection@6f46426d]
1: com.mchange.v2.c3p0.impl.NewProxyConnection@49c7b90e [wrapping: com.mysql.jdbc.JDBC4Connection@10d307f1]
2: com.mchange.v2.c3p0.impl.NewProxyConnection@3e84448c [wrapping: com.mysql.jdbc.JDBC4Connection@4a7f959b]
3: com.mchange.v2.c3p0.impl.NewProxyConnection@5403f35f [wrapping: com.mysql.jdbc.JDBC4Connection@483f6d77]
4: com.mchange.v2.c3p0.impl.NewProxyConnection@63a12c68 [wrapping: com.mysql.jdbc.JDBC4Connection@28f3b248]
5: com.mchange.v2.c3p0.impl.NewProxyConnection@32b260fa [wrapping: com.mysql.jdbc.JDBC4Connection@581ac8a8]
6: com.mchange.v2.c3p0.impl.NewProxyConnection@57d7f8ca [wrapping: com.mysql.jdbc.JDBC4Connection@76c3e77a]
7: com.mchange.v2.c3p0.impl.NewProxyConnection@67c33749 [wrapping: com.mysql.jdbc.JDBC4Connection@fba92d3]
8: com.mchange.v2.c3p0.impl.NewProxyConnection@fa49800 [wrapping: com.mysql.jdbc.JDBC4Connection@71238fc2]
9: com.mchange.v2.c3p0.impl.NewProxyConnection@16a0ee18 [wrapping: com.mysql.jdbc.JDBC4Connection@3d6f0054]

结果2:

0: com.mchange.v2.c3p0.impl.NewProxyConnection@3d5c822d [wrapping: com.mysql.jdbc.JDBC4Connection@6f46426d]
1: com.mchange.v2.c3p0.impl.NewProxyConnection@49c7b90e [wrapping: com.mysql.jdbc.JDBC4Connection@10d307f1]
2: com.mchange.v2.c3p0.impl.NewProxyConnection@3e84448c [wrapping: com.mysql.jdbc.JDBC4Connection@4a7f959b]
3: com.mchange.v2.c3p0.impl.NewProxyConnection@5403f35f [wrapping: com.mysql.jdbc.JDBC4Connection@483f6d77]
4: com.mchange.v2.c3p0.impl.NewProxyConnection@63a12c68 [wrapping: com.mysql.jdbc.JDBC4Connection@28f3b248]
5: com.mchange.v2.c3p0.impl.NewProxyConnection@32b260fa [wrapping: com.mysql.jdbc.JDBC4Connection@581ac8a8]
6: com.mchange.v2.c3p0.impl.NewProxyConnection@57d7f8ca [wrapping: com.mysql.jdbc.JDBC4Connection@76c3e77a]
7: com.mchange.v2.c3p0.impl.NewProxyConnection@67c33749 [wrapping: com.mysql.jdbc.JDBC4Connection@fba92d3]
8: com.mchange.v2.c3p0.impl.NewProxyConnection@fa49800 [wrapping: com.mysql.jdbc.JDBC4Connection@71238fc2]
9: com.mchange.v2.c3p0.impl.NewProxyConnection@16a0ee18 [wrapping: com.mysql.jdbc.JDBC4Connection@3d6f0054] Exception in thread "main" java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
at ShuJuKuLianJieChi.main(ShuJuKuLianJieChi.java:12)
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@15aab8c6 -- timeout at awaitAvailable()
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1505)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685)
... 2 more

Druid

  • 步骤:

  • 1,还是先导jar包,druid-1.2.9.jar

  • 2,定义配置文件

    可以是properties形式的

    可以任意名字,可以放任意目录(意思是需要手动导入了)

    建议还是放到src下

    dirverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///zhoupeng
    username=root
    password=root
    # 这些和刚刚c3p0的配置文件差不多,就不写多的注释了
    initialSize=5
    maxActive=10
    maxWait=3000
  • 3,加载配置文件

    	Properties p = new Properties();
    InputStream in = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
    p.load(in);
  • 4,获取数据库连接池对象:

    通过一个工厂来获取:DruidDataSourceFactory

     	
    
            DataSource ds = DruidDataSourceFactory.createDataSource(p);
  • 5,获取连接,getConnection

Connection c=ds.getConnection(); 

数据库连接池的一些基本理解,c3p0和druid的更多相关文章

  1. .数据库连接池技术:DBCP和C3P0

    数据库连接池技术:DBCP和C3P0 1.什么是数据库连接池 已知的方法是需要访问数据库的时候进行一次数据库的连接,对数据库操作完之后再释放这个连接,通常这样业务是缺点很明显的: 用户每次请求都需要向 ...

  2. JDBC 学习笔记(三)—— 数据源(数据库连接池):DBCP数据源、C3P0 数据源以及自定义数据源技术

    本文目录:        1.应用程序直接获取连接的缺点(图解)        2.使用数据库连接池优化程序性能(图解)        3.可扩展增强某个类方法的功能的三种方式        4.自定 ...

  3. 数据库连接池和connection的理解

    数据库连接池Data Source Pool的理解 1.数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个连接,避免了每个方法里new connection的耗费资源和时间. ...

  4. 数据库连接池dataesoruce pool深入理解

    8.数据库连接池的connection都是长连接的,以方便多次调用,多人连续使用.dataSourcePool9.数据库连接池中的连接,是在你用完之后,返回给数据库连接池的,并不是close()掉,而 ...

  5. 理解数据库连接池和ThreadLocal实现的事务控制

    我发现 不少人 误解了这两者. csdn上也有人提出过这种疑问: http://bbs.csdn.net/topics/250061733 经过查阅资料和认真分析,我特说明一下这两者概念上的区别. 我 ...

  6. JDBC(三)数据库连接池(DBCP、C3P0)

    前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...

  7. java_JDBC,连接数据库方式,RestSet结果集,Statement,PreparedStatement,事务,批处理,数据库连接池(c3p0和Druid)、Apache-DBUtils、

    一.JDBC的概述 1.JDBC为访问不同的数据薛是供了统一的接口,为使用者屏蔽了细节问题.2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ...

  8. 数据库连接池Druid的介绍,配置分析对比总结

    Druid的简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBos ...

  9. 从零开始学 Java - 数据库连接池的选择 Druid

    我先说说数据库连接 数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名.密码了,然后我们就可以打开门去任意的存取东西了. ...

随机推荐

  1. DDD-领域驱动(三)-聚合与聚合根

    概念 高内聚 , 高内聚合Aggregate 就好比一个功能,各个模块互相是有依赖关系存在,例如: 低耦合:模块可以任意替换,不会影响系统的工作 例如:比如你今天穿了这套衣服,明天穿了另一套衣服,但你 ...

  2. 会话跟踪技术 - Cookie 和 Session 快速上手 + 登陆注册案例

    目录 1. 会话跟踪技术概述 2. Cookie 2.1 Cookie的概念和工作流程 2.2 Cookie的基本使用 2.3 Cookie的原理分析 2.4 Cookie的使用细节 2.4.1 Co ...

  3. 微软出品自动化神器【Playwright+Java】系列(五) 之 常见点击事件操作

    写在前面 明天就是周五了,这周有那么一两天心情特别不好,真的是做什么都没兴致,所以导致整个人都很丧,什么都不想做. 本打算周一就更新这篇文章的,但由于公司一直加班,每天到家很晚,都是挤时间去学,理解后 ...

  4. React魔法堂:echarts-for-react源码略读

    前言 在当前工业4.0和智能制造的产业升级浪潮当中,智慧大屏无疑是展示企业IT成果的最有效方式之一.然而其背后怎么能缺少ECharts的身影呢?对于React应用而言,直接使用ECharts并不是最高 ...

  5. pip cmd下载速度慢解决方案

    cmd下载速度慢不是电脑问题,而是下载的网站有网速限制,如pip,虽然没被墙,但由于是外网,网速极差,经常是几KB一秒,所以我们可以采用镜像服务器,即在命令后加上 -i https://pypi.tu ...

  6. 现在入行Java真的还有出路吗?

    现在入行Java还来的及吗?未来该如何抉择? 最近有点迷茫了,互联网好像一夜之间进入了寒冬一样,到处都是就业难的样子,当然,不可否认的是,那些努力的大佬依旧是斩获多个offer,但是,窝就一个小镇做题 ...

  7. loguru库使用

    参考: https://github.com/Delgan/loguru https://loguru.readthedocs.io/en/stable/overview.html https://b ...

  8. 嵌入式-C语言基础:结构体

    数组只能存放一种类型的数据,而结构体内可以存放不同类型的数据. #include<stdio.h> #include <string.h> struct Student { c ...

  9. 嵌入式-C语言基础:二维数组

    二维数组的每个元素都是一个一维数组,例如int arr[2][3]={{1,2,3},{4,5,6}}; 下面通过几个例子来对二维数组进行深入了解:二维数组可以看作是一个父数组,他的每个元素都是一个一 ...

  10. 解决头部使用 position:fixed; 固定定位后遮住下方内容的问题

    1.在头部下面给一个空的 div 给这个div设置高度,把页面撑开,这种方法是让头部刚好遮住的是这个空div,把内容放出来. 但是这种方法需要一点点调试高度,所以不推荐. 2.把整个要使用 posit ...