Druid基本配置及内置监控使用

1. 使用方法

首先从 http://repo1.maven.org/maven2/com/alibaba/druid/ 下载最新的 jar 包。如果想使用最新的源码编译,可以从 https://github.com/alibaba/druid 下载源码,然后使用 maven 命令行,或者导入到 eclipse 中进行编译。

dbcp 类似, druid 的配置项如下:

配置

缺省值

说明

name

配置这个属性的意义在于,如果存在多个数据源,监控的时候
可以通过名字来区分开来。如果没有配置,将会生成一个名字,
格式是: "DataSource-" + System.identityHashCode(this)

jdbcUrl

连接数据库的 url ,不同数据库不一样。例如:
mysql : jdbc:mysql://10.20.153.104:3306/druid2
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto

username

连接数据库的用户名

password

连接数据库的密码。如果你不希望密码直接写在配置文件中,
可以使用 ConfigFilter 。详细看这里:
https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter

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
mysql5.5 以下的版本中没有 PSCache 功能,建议关闭掉。
5.5
及以上版本有 PSCache ,建议开启。

maxOpenPreparedStatements

-1

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

validationQuery

用来检测连接是否有效的 sql ,要求是一个查询语句。
如果 validationQuery null testOnBorrow testOnReturn
testWhileIdle
都不会其作用。

testOnBorrow

true

申请连接时执行 validationQuery 检测连接是否有效,
做了这个配置会降低性能。

testOnReturn

false

归还连接时执行 validationQuery 检测连接是否有效,
做了这个配置会降低性能

testWhileIdle

false

建议配置为 true ,不影响性能,并且保证安全性。
申请连接的时候检测,如果空闲时间大于
timeBetweenEvictionRunsMillis

执行 validationQuery 检测连接是否有效。

timeBetweenEvictionRunsMillis

有两个含义:
1) Destroy
线程会检测连接的间隔时间
2) testWhileIdle
的判断依据,详细看 testWhileIdle 属性的说明

numTestsPerEvictionRun

不再使用,一个 DruidDataSource 只支持一个 EvictionRun

minEvictableIdleTimeMillis

connectionInitSqls

物理连接初始化的时候执行的 sql

exceptionSorter

根据 dbType 自动识别

当数据库抛出一些不可恢复的异常时,抛弃连接

filters

属性类型是字符串,通过别名的方式配置扩展插件,
常用的插件有:
监控统计用的 filter:stat
日志用的 filter:log4j
防御 sql 注入的 filter:wall

proxyFilters

类型是 List<com.alibaba.druid.filter.Filter>
如果同时配置了 filters proxyFilters
是组合关系,并非替换关系

1.1 配置属性

根据常用的配置属性,首先给出一个如下的配置文件,放置于src目录下。

1.        url:jdbc:mysql://localhost:3306/dragoon_v25_masterdb

2.        driverClassName:com.mysql.jdbc.Driver

3.        username:root

4.        password:aaaaaaaa

5.        filters:stat

6.        maxActive:20

7.        initialSize:1

8.        maxWait:60000

9.        minIdle:10

10.    #maxIdle:15

11.    timeBetweenEvictionRunsMillis:60000

12.    minEvictableIdleTimeMillis:300000

13.    validationQuery:SELECT 'x'

14.    testWhileIdle:true

15.    testOnBorrow:false

16.    testOnReturn:false

17.    #poolPreparedStatements:true

18.    maxOpenPreparedStatements:20

19.    #对于长时间不使用的连接强制关闭

20.    removeAbandoned:true

21.    #超过30分钟开始关闭空闲连接

22.    removeAbandonedTimeout:1800

23.    #将当前关闭动作记录到日志

24.    logAbandoned:true

配置文件 1.1

配置项中指定了各个参数后,在连接池内部是这么使用这些参数的。数据库连接池在初始化的时候会创建 initialSize 个连接,当有数据库操作时,会从池中取出一个连接。如果当前池中正在使用的连接数等于 maxActive ,则会等待一段时间,等待其他操作释放掉某一个连接,如果这个等待时间超过了 maxWait ,则会报错;如果当前正在使用的连接数没有达到 maxActive ,则判断当前是否空闲连接,如果有则直接使用空闲连接,如果没有则新建立一个连接。在连接使用完毕后,不是将其物理连接关闭,而是将其放入池中等待其他操作复用。 同时连接池内部有机制判断,如果当前的总的连接数少于 miniIdle ,则会建立新的空闲连接,以保证连接数得到 miniIdle 。如果当前连接池中某个连接在空闲了 timeBetweenEvictionRunsMillis 时间后任然没有使用,则被物理性的关闭掉。有些数据库连接的时候有超时限制( mysql 连接在 8 小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候设置一个 testWhileIdle 参数为 true ,可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建,最大情况的保证从连接池中得到的 Connection 对象是可用的。当然,为了保证绝对的可用性,你也可以使用 testOnBorrow true (即在获取 Connection 对象时检测其可用性),不过这样会影响性能。

1 Spring 中的配置

applicationContext.xml 文件中,配置如下: <!-- 使用 Druid 连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool. DruidDataSource "

init-method="init" destroy-method="close"> <!-- 基本属性 url user password --> <property name="url" value=" jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull " /> <property name="username" value="wlxu" /> <property name="password" value="wlxusstcd201403" /> <property name="connectionProperties" value="com.mysql.jdbc.Driver"></property>

<!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <property name="maxActive" value="20" />

<!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" />

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" />

<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" />

<property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" />

<!-- 打开 PSCache ,并且指定每个连接上 PSCache 的大小 --> <!-- 如果用 Oracle ,则把 poolPreparedStatements 配置为 true mysql 可以配置为 false 。分库分表较多的数据库,建议配置为 false --> <property name="poolPreparedStatements" value="false" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />

<!-- 配置监控统计拦截的 filters ,去掉后监控界面 sql 无法统计 --> <property name="filters" value="stat" />

</bean>

2 、手动创建 datasource

如果不使用框架开发,也可以手动创建连接,采用 new DruidDataSource () 或者 DruidDataSourceFactory .createDataSource(properties) 的方式均可,前者需要手动设置参数值,后者自动从配置文件中读取,可根据需要使用。

以上内容可以参考: http://blog.csdn.net/yunnysunny/article/details/8657095

2. 使用 Druid 的内置监控功能

1 、怎么打开 Druid 的监控统计功能

Druid 的监控统计功能是通过 filter-chain 扩展实现,如果你要打开监控统计功能,配置 StatFilter StatFilter 的别名是 stat ,这个别名映射配置信息保存在 druid-xxx.jar!/META-INF/druid-filter.properties 。 在 spring 中使用别名配置方式如下:

<bean id="dataSource" class="com.alibaba.druid.pool. DruidDataSource " init-method="init" destroy-method="close">

... ... <property name="filters" value="stat" />

</bean>

StatFilter 可以和其他的 Filter 配置使用,比如:

<bean id="dataSource" class="com.alibaba.druid.pool. DruidDataSource " init-method="init" destroy-method="close">

... ... <property name="filters" value="stat,log4j" />

</bean>

其他详情可以参考: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

2 、怎样使用 Druid 的内置监控页面

Druid 内置提供了一个 StatViewServlet 用于展示 Druid 的统计信息。 这个 StatViewServlet 的用途包括:

提供监控信息展示的 html 页面 提供监控信息的 JSON API

注意:使用 StatViewServlet ,建议使用 druid 0.2.6 以上版本。

1 配置 web.xml

StatViewServlet 是一个标准的 javax.servlet.http. HttpServlet ,需要配置在你 web 应用中的 WEB-INF/web.xml 中。

<servlet>

<servlet-name> DruidStatView </servlet-name> <servlet-class>com.alibaba.druid.support.http. StatViewServlet </servlet-class>

</servlet> <servlet-mapping>

<servlet-name> DruidStatView </servlet-name> <url-pattern>/druid/*</url-pattern>

</servlet-mapping>

根据配置中的 url-pattern 来访问内置监控页面,如果是上面的配置,内置监控页面的首页是 /druid/index.html

例如: http://110.76.43.235:9000/druid/index.html http://110.76.43.235:8080/mini-web/druid/index.html

2 配置 allow deny

StatViewSerlvet 展示出来的监控信息比较敏感,是系统运行的内部情况,如果你需要做访问控制,可以配置 allow deny 这两个参数。比如:

<servlet>

<servlet-name> DruidStatView </servlet-name> <servlet-class>com.alibaba.druid.support.http. StatViewServlet </servlet-class>

<init-param>

<param-name>allow</param-name> <param-value>128.242.127.1/24,128.242.128.1</param-value>

</init-param> <init-param>

<param-name>deny</param-name> <param-value>128.242.127.4</param-value>

</init-param>

</servlet>

判断规则: deny 优先于 allow ,如果在 deny 列表中,就算在 allow 列表中,也会被拒绝。如果 allow 没有配置或者为空,则允许所有访问 其他详情参考: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE

3 、内置监控中的 Web Spring 关联监控怎么配置?

WebStatFilter 用于采集 web-jdbc 关联监控的数据。

1 web.xml 配置 <filter>

<filter-name> DruidWebStatFilter </filter-name> <filter-class>com.alibaba.druid.support.http. WebStatFilter </filter-class> <init-param>

<param-name>exclusions</param-name> <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>

</init-param>

</filter> <filter-mapping>

<filter-name> DruidWebStatFilter </filter-name> <url-pattern>/*</url-pattern>

</filter-mapping> 2 exlusions 配置

经常需要排除一些不必要的 url ,比如 .js,/jslib/ 等等。配置在 init-param 中。比如: <init-param>

<param-name>exclusions</param-name> <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>

</init-param>

3 sessionStatMaxCount 配置

缺省 sessionStatMaxCount 1000 个。你可以按需要进行配置,比如: <init-param>

<param-name>sessionStatMaxCount</param-name> <param-value>1000</param-value>

</init-param>

4 sessionStatEnable 配置

你可以关闭 session 统计功能,比如:

<init-param>

<param-name>sessionStatEnable</param-name> <param-value>false</param-value>

</init-param>

5 principalSessionName 配置

你可以配置 principalSessionName ,使得 druid 能够知道当前的 session 的用户是谁。比如:

<init-param>

<param-name>principalSessionName</param-name> <param-value>xxx.user</param-value>

</init-param> 根据需要,把其中的 xxx.user 修改为你 user 信息保存在 session 中的 sessionName

注意:如果你 session 中保存的是非 string 类型的对象,需要重载 toString 方法。

6 principalCookieName

如果你的 user 信息保存在 cookie 中,你可以配置 principalCookieName ,使得 druid 知道当前的 user 是谁

<init-param>

<param-name>principalCookieName</param-name> <param-value>xxx.user</param-value>

</init-param> 根据需要,把其中的 xxx.user 修改为你 user 信息保存在 cookie 中的 cookieName

7 profileEnable

druid 0.2.7 版本开始支持 profile ,配置 profileEnable 能够监控单个 url 调用的 sql 列表。

<init-param>

<param-name>profileEnable</param-name> <param-value>true</param-value>

</init-param>

Druid 的其他相关问题可以查看: https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98