连接池原理
连接池基本的思想是在系统初始化的时候, 将数据库连接作为对象存储在内存中, 当用户需要访问数据库时, 并非建立一个新的连接, 而是从连接池中取出一个已建立的空闲连接对象. 使用完毕后, 用户也并非将连接关闭, 而是将连接放回连接池中, 以供下一个请求访问使用. 而连接的建立, 断开都由连接池自身来管理. 同时, 还可以通过设置连接池的参数来控制连接池中的初始连接数, 连接的上下限数以及每个连接的最大使用次数, 最大空闲时间等等, 也可以通过其自身的管理机制来监视数据库连接的数量, 使用情况等.
常用数据库连接池及特点
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-92 的 SQL 的完整支持, 这是一个手写的高性能 SQL Parser, 支持 Visitor 模式, 使得分析 SQL 的抽象语法树很方便.
简单 SQL 语句用时 10 微秒以内, 复杂 SQL 用时 30 微秒.
通过 Druid 提供的 SQL Parser 可以在 JDBC 层拦截 SQL 做相应处理, 比如说分库分表, 审计等. Druid 防御 SQL 注入攻击的 WallFilter 就是通过 Druid 的 SQL Parser 分析语义实现的.
spring 中配置 druid 连接池
由于 druid 的性能优于 dbcp 和 c3p0, 加上后两个已经不怎么更新了, 所以这里只介绍 druid 的配置方法.
首先需要在 pom 文件中加入相应依赖:
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version > 版本 </version>
- </dependency>
在 spring 的 applicationContext.xml 中配置 druid:
- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
- <!-- 基本属性 url,user,password -->
- <property name="driverClassName" value="${jdbc.driver}" />
- <property name="url" value="${jdbc_url}" />
- <property name="username" value="${jdbc_user}" />
- <property name="password" value="${jdbc_password}" />
- <!-- 配置监控统计拦截的 filters -->
- <property name="filters" value="stat" />
- <!-- 配置初始化大小, 最小, 最大 -->
- <property name="maxActive" value="20" />
- <property name="initialSize" value="1" />
- <property name="minIdle" value="1" />
- <!-- 配置获取连接等待超时的时间 -->
- <property name="maxWait" value="60000" />
- <!-- 配置间隔多久才进行一次检测, 检测需要关闭的空闲连接, 单位是毫秒 -->
- <property name="timeBetweenEvictionRunsMillis" value="60000" />
- <!-- 配置一个连接在池中最小生存的时间, 单位是毫秒 -->
- <property name="minEvictableIdleTimeMillis" value="300000" />
- <property name="testWhileIdle" value="true" />
- <property name="testOnBorrow" value="false" />
- <property name="testOnReturn" value="false" />
- <!-- 打开 PSCache, 并且指定每个连接上 PSCache 的大小 -->
- <property name="poolPreparedStatements" value="true" />
- <property name="maxOpenPreparedStatements" value="20" />
- </bean>
DruidDataSource 配置属性列表
DruidDataSource 配置兼容 DBCP, 但个别配置的语意有所区别.
配置 | 缺省值 | 说明 |
---|---|---|
name | 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此属性至少在 1.0.5 版本中是不起作用的,强行设置 name 会出错。详情 - 点此处 。 | |
url | 连接数据库的 url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto | |
username | 连接数据库的用户名 | |
password | 连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用 ConfigFilter。详细看这里 | |
driverClassName | 根据 url 自动识别 | 这一项可配可不配,如果不配置 druid 会根据 url 自动识别 dbType,然后选择相应的 driverClassName |
initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用 init 方法,或者第一次 getConnection 时 |
maxActive | 8 | 最大连接池数量 |
maxIdle | 8 | 已经不再使用,配置了也没效果 |
minIdle | 最小连接池数量 | |
maxWait | 获取连接时最大等待时间,单位毫秒。配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置 useUnfairLock 属性为 true 使用非公平锁。 | |
poolPreparedStatements | false | 是否缓存 preparedStatement,也就是 PSCache.PSCache 对支持游标的数据库性能提升巨大,比如说 oracle。在 mysql 下建议关闭。 |
maxPoolPreparedStatementPerConnectionSize | -1 | 要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 自动触发修改为 true。在 Druid 中,不会存在 Oracle 下 PSCache 占用内存过多的问题,可以把这个数值配置大一些,比如说 100 |
validationQuery | 用来检测连接是否有效的 sql,要求是一个查询语句,常用 select ‘x‘。如果 validationQuery 为 null,testOnBorrow、testOnReturn、testWhileIdle 都不会其作用。 | |
validationQueryTimeout | 单位:秒,检测连接是否有效的超时时间。底层调用 jdbc Statement 对象的 void setQueryTimeout(int seconds)方法 | |
testOnBorrow | true | 申请连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能。 |
testOnReturn | false | 归还连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能。 |
testWhileIdle | false | 建议配置为 true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,执行 validationQuery 检测连接是否有效。 |
timeBetweenEvictionRunsMillis | 1 分钟(1.0.14) | 有两个含义: 1) Destroy 线程会检测连接的间隔时间,如果连接空闲时间大于等于 minEvictableIdleTimeMillis 则关闭物理连接。 2) testWhileIdle 的判断依据,详细看 testWhileIdle 属性的说明 |
numTestsPerEvictionRun | 30 分钟(1.0.14) | 不再使用,一个 DruidDataSource 只支持一个 EvictionRun |
minEvictableIdleTimeMillis | 连接保持空闲而不被驱逐的最长时间 | |
connectionInitSqls | 物理连接初始化的时候执行的 sql | |
exceptionSorter | 根据 dbType 自动识别 | 当数据库抛出一些不可恢复的异常时,抛弃连接 |
filters | 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的 filter:stat 日志用的 filter:log4j 防御 sql 注入的 filter:wall | |
proxyFilters | 类型是 List,如果同时配置了 filters 和 proxyFilters,是组合关系,并非替换关系 |
Druid 的监控统计功能
1. 配置 StatFilter
Druid 内置提供一个 StatFilter, 用于统计监控信息.
配置详情请参考官方文档:
https://github.com/alibaba/druid/wiki / 配置_StatFilter
2. 配置 StatViewServlet
Druid 内置提供了一个 StatViewServlet 用于展示 Druid 的统计信息.
配置详情请参考官方文档:
https://github.com/alibaba/druid/wiki / 配置_StatViewServlet 配置
更多内容请参照官方文档:
https://github.com/alibaba/druid/wiki / 首页
来源: http://www.bubuko.com/infodetail-3013245.html