Java数据库连接池之c3p0简介_动力节点Java学院整理

作者:leeying 时间:2024-01-19 18:16:03 

c3p0是什么

c3p0的出现,是为了大大提高应用程序和数据库之间访问效率的。

它的特性:

  • 编码的简单易用

  • 连接的复用

  • 连接的管理

说到c3p0,不得不说一下jdbc本身,c3p0愿意就是对数据库连接的管理,那么原有的概念还是得清晰:DriverManager、Connection、StateMent、ResultMent。

jdbc:java database connective这套API,不用多说,是一套用于连接各式dbms或连接桥接器的api,两个层级:上层供应用方调用api,下层,定义了各个dbms的spi的api(具体文档见:这里)。

主要要提的是:datasource、DriverManager,想到哪儿写到哪儿,datasource是更高级一点的api,原因在于相对对应用来说更透明。

Connection:同dbms的逻辑链接,类似于session管理概念, SQL statements are executed and results are returned within the context of a connection.

jdbc的概念就到这里,平时用得比较多。

c3P0的配置 

c3p0的bean配置如下:


<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
 <property name="driverClass" value="${jdbc.driverClassName}" />
 <property name="jdbcUrl" value="${jdbc.url}" />
 <property name="user" value="${jdbc.username}" />
 <property name="password" value="${jdbc.password}" />
 <property name="checkoutTimeout" value="30000" />
 <property name="maxPoolSize" value="15" />
 <property name="idleConnectionTestPeriod" value="180" />
 <property name="maxIdleTime" value="180" />
</bean>

还有一些配置选项,后续详细说明。可见c3p0的bean引用使用的是:ComboPooledDataSource,该类结构如下:

Java数据库连接池之c3p0简介_动力节点Java学院整理

Java数据库连接池之c3p0简介_动力节点Java学院整理

以上类图都不是很完全,不过大体能表达出类之间的原理:

1、bean:ComboPooledDataSource的父类:AbstractPoolBackedDataSource有一个poolmanager字段,存储着对pool管理器

2、获取ds.getConnection()链接对象时,内部使用getPoolManger()获取C3p0ConnectionPooledManager(mgr)对象,该manager管理着pool对象:C3P0PooledConnectionPool对象,mgr.getPool().checkoutPooledConnection()

3、自此该connection已经被获取到了

4、让我们看看该connection的真实面目吧:

 ProxyConnection。

5、因此其实原理是:

从pool里获取到的connection,是proxy包装的connection,而对connection的释放或者重用,是pool的管理责任:初始化池大小,维护池的大小(expand或shrink),管理unused、expired、checkout、checkin连接。

真正底层的连接是jdbc自己的连接,而c3p0的管理部分,基本上使用的是synchronized关键字,使用timerTask定时器工作。

标签:Java,数据库连接池,c3p0
0
投稿

猜你喜欢

  • 响应浏览器地址栏#(hash/fragment)变化

    2009-12-28 10:45:00
  • ASP技巧:禁用清除页面缓存的五种方法

    2009-07-21 12:33:00
  • python实现对服务器脚本敏感信息的加密解密功能

    2022-11-07 08:35:11
  • MySQL 数据库的基础知识

    2024-01-17 03:05:52
  • 利用Python编写个有趣的记仇本

    2022-08-25 19:20:20
  • python获取指定网页上所有超链接的方法

    2023-07-18 11:50:20
  • JavaScript的for循环中嵌套一个点击事件的问题解决

    2024-04-22 13:01:49
  • Go语言正则表达式的使用详解

    2024-02-04 11:23:42
  • python写入xml文件的方法

    2023-01-01 15:08:54
  • django session完成状态保持的方法

    2021-12-07 16:12:02
  • 使用go求幂的几种方法小结

    2023-09-23 05:07:45
  • python的命名规则知识点总结

    2023-08-22 09:48:21
  • python批量修改xml文件中的信息

    2022-03-29 22:50:53
  • IE9初窥:支持CSS3,和HTML5?

    2009-12-01 14:20:00
  • Anaconda安装pytorch和paddle的方法步骤

    2021-04-17 18:21:59
  • thinkphp5修改view到根目录实例方法

    2024-05-03 15:51:58
  • Django数据库(SQlite)基本入门使用教程

    2024-01-22 01:13:03
  • Vite创建项目的实现步骤

    2024-04-30 10:38:16
  • Python Django2 model 查询介绍(条件、范围、模糊查询)

    2023-11-02 15:32:09
  • Python高级编程之继承问题详解(super与mro)

    2023-08-08 18:58:47
  • asp之家 网络编程 m.aspxhome.com