数据库连接池

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. Python模拟服务端

    本机服务端 import socket # 获取到socket sk = socket.socket() # 获取到地址 ip 和 端口号 address = ('127.0.0.1', 8001) ...

  2. 齐博x1 小程序与公众号长期永久订阅消息的申请方法

    要给用户发送消息提醒的话,需要申请订阅消息.订阅消息分一次性订阅与长期永久性订阅.一次性订阅没有实际意义,用户订阅一次就只能发送一次.这里主要是指导大家如何申请永久长期订阅功能.对于公众号而言,大家先 ...

  3. python实现鼠标手动截图(类似于QQ截图)

    由于在网上找了很久,只找到按像素位置截图和全屏截图的,所以决定自己写一个. 本程序实现原理是现用PIL里的ImageGrab进行全屏截图,然后通过模拟鼠标操作,进行截图,最后删除全屏截图,只留下鼠标截 ...

  4. LcdToos如何在线对屏进行读写指令调试

    在实际屏调试过程中,工程师经常需要对屏的寄存器频繁进行参数修改和读取测试,LcdTools针对这个做了很好的支持,可以在线进行指令调试,大大提高调试效率. 打开点屏工程,连接PX01并使模组上电点亮. ...

  5. 十九、Service Ingress

    Service Ingress Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx Ingress-Nginx 官方 ...

  6. iptables介绍和基本使用

    iptables 防火墙是什么 防火墙好比一堵真的墙,能够隔绝些什么,保护些什么. 防火墙的本义是指古代构筑和使用木制结构房屋的时候,为防止火灾的发生和蔓延,人们将坚固的石块堆砌在房屋周围作为屏障,这 ...

  7. 抓包分析 TCP 握手和挥手

    前言 首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务.在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂 ...

  8. Linux环境jdk安装配置

    1.jdk安装包:jdk-8u191-linux-x64.tar.gz2.拷贝 jdk-8u191-linux-x64.tar.gz 到/usr/local命令如下:cp jdk-8u191-linu ...

  9. 【云原生 · Kubernetes】Jenkins+Gitlab+Rancher+Docker 实现自动构建镜像的 CI 平台(一)

    1 准备 Jenkins+Gitlab 实验环境 1.1 准备实验环境:恢复到以一下快照:该环境已经配置好 jenkins+gitlab+sonar-配置通 主机角色: IP 地址 运行的服务 硬件配 ...

  10. 【Java集合框架001】为什么重写equals就要重写hashcode?

    一.前言 如果面试官问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法? 遇到这样的问题,应该怎样回答呢?其实,equals和hashCode都 ...