数据库连接池

数据库 — 执行完毕 — 释放
连接 — 释放是十分浪费系统资源的
池化技术:准备一些预先的资源,过来就连接预先准备好的

最小连接数:根据实际情况,等于常用连接数
最大连接数:业务最高承载上线
排队等待
等待超时

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

原理#

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

开源数据源

  • DBCP
DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP
  • C3P0
c3p0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
  • Druid:阿里巴巴
阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。

Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。

Druid提供了MySql、Oracle、Postgresql、SQL-92SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。

简单SQL语句用时10微秒以内,复杂SQL用时30微秒。

通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。

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

主要配置说明#

DBCP c3p0 Druid
用户名 username user username
密码 password password password
URL url jdbcUrl jdbcUrl
驱动类型 driverClassName driverClass driverClassName

关键配置#

为了发挥数据库连接池的作用,在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

最小连接数:

是数据库一直保持的数据库连接数,所以如果应用程序对数据库连接的使用量不大,将有大量的数据库资源被浪费。

初始化连接数:

连接池启动时创建的初始化数据库连接数量。

最大连接数

是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求被加入到等待队列中。

最大等待时间:

当没有可用连接时,连接池等待连接被归还的最大时间,超过时间则抛出异常,可设置参数为 0 或者负数使得无限等待 (根据不同连接池配置)。

DBCP c3p0 Druid
最小连接数 minIdle(0) minPoolSize(3) minIdle(0)
持久化连接数 initialSize(0) initialPoolSize(3) initialSize(0)
最大连接数 maxTotal(8) maxPoolSize(15) maxPoolSize(15)
最大等待数 maxWaitMillis (毫秒) maxIdleTime (0 秒) maxWait (毫秒)

性能配置#

即是 PSCache,PSCache 对支持游标的数据库性能提升巨大,比如说 oracle。JDBC 的标准参数,用以控制数据源内加载的 PreparedStatements 数量。但由于预缓存的 statements 属于单个 connection 而不是整个连接池,所以设置这个参数需要考虑到多方面的因素。

单个连接拥有的最大缓存数:要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 自动触发修改为 true。在 Druid 中,不会存在 Oracle 下 PSCache 占用内存过多的问题,可以把这个数值配置大一些,比如说 100

DBCP c3p0 Druid
开启缓存功能 poolPreparedStatements maxStatements poolPreparedStatements
单个连接拥有的最大缓存数 maxOpenPrepared-Statements maxStatementsPer-Connection maxOpenPrepared-Statements

结论

无论使用什么数据源,本质还是一样的,DataSource 接口不变,方法就不会变

本作品采用《CC 协议》,转载必须注明作者和本文链接
未填写
文章
247
粉丝
19
喜欢
219
收藏
63
排名:724
访问:9993
私信
所有博文
社区赞助商