搜索
您的当前位置:首页正文

druid配置详解

来源:爱够旅游网
druid配置详解

java程序很⼤⼀部分要操作数据库,为了提⾼性能操作数据库的时候,⼜不得不使⽤数据库连接池。数据库连接池有很多选择,c3p、dhcp、proxool等,druid作为⼀名后起之秀,凭借其出⾊的性能,也逐渐印⼊了⼤家的眼帘。接下来本教程就说⼀下druid的简单使⽤。和dbcp类似,druid的配置项如下

配置name

缺省值

说明

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

MYSQL : jdbc:mysql://10.20.153.104:3306/druid2

ORACLE : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto连接数据库的⽤户名

连接数据库的密码。如果你不希望密码直接写在配置⽂件中, 可以使⽤ConfigFilter。详细看这⾥:

这⼀项可配可不配,如果不配置druid会根据url⾃动识别dbType,然后选择相应的driverClassName初始化时建⽴物理连接的个数。初始化发⽣在显⽰调⽤init⽅法,或者第⼀次getConnection时最⼤连接池数量

已经不再使⽤,配置了也没效果最⼩连接池数量

获取连接时最⼤等待时间,单位毫秒。配置了maxWait之后, 缺省启⽤公平锁,并发效率会有所下降,

如果需要可以通过配置useUnfairLock属性为true使⽤⾮公平锁。

是否缓存preparedStatement,也就是PSCache。

PSCache对⽀持游标的数据库性能提升巨⼤,⽐如说oracle。 在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。

作者在5.5版本中使⽤PSCache,通过监控界⾯发现PSCache有缓存命中率记录, 该应该是⽀持PSCache。

要启⽤PSCache,必须配置⼤于0,当⼤于0时, poolPreparedStatements⾃动触发修改为true。

在Druid中,不会存在Oracle下PSCache占⽤内存过多的问题, 可以把这个数值配置⼤⼀些,⽐如说100

⽤来检测连接是否有效的sql,要求是⼀个查询语句。

如果validationQuery为null,testOnBorrow、testOnReturn、 testWhileIdle都不会其作⽤。

申请连接时执⾏validationQuery检测连接是否有效,做了这个配置会降低性能。归还连接时执⾏validationQuery检测连接是否有效,做了这个配置会降低性能建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间⼤于 timeBetweenEvictionRunsMillis,

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

有两个含义:

1) Destroy线程会检测连接的间隔时间

2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明不再使⽤,⼀个DruidDataSource只⽀持⼀个EvictionRun

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

当数据库抛出⼀些不可恢复的异常时,抛弃连接属性类型是字符串,通过别名的⽅式配置扩展插件, 常⽤的插件有:

监控统计⽤的filter:stat ⽇志⽤的filter:log4j 防御sql注⼊的filter:wall

类型是List, 如果同时配置了filters和proxyFilters, 是组合关系,并⾮替换关系

jdbcUrlusernamepassworddriverClassNameinitialSizemaxActivemaxIdleminIdlemaxWait

根据url⾃动识别088

poolPreparedStatementsfalse

maxOpenPreparedStatements-1

validationQuerytestOnBorrowtestOnReturn

truefalse

testWhileIdlefalse

timeBetweenEvictionRunsMillisnumTestsPerEvictionRunminEvictableIdleTimeMillisconnectionInitSqlsexceptionSorter

根据dbType⾃动识别

filters

proxyFilters

加⼊ druid-1.0.9.jarApplicationContext.xml

/WEB-INF/classes/dbconfig.properties

dbconfig.properties

url: jdbc:mysql://localhost:3306/newmdriverClassName: com.mysql.jdbc.Driverusername: rootpassword: rootfilters: statmaxActive: 20initialSize: 1maxWait: 60000minIdle: 10maxIdle: 15

timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 'x'testWhileIdle: truetestOnBorrow: falsetestOnReturn: false

maxOpenPreparedStatements: 20removeAbandoned: true

removeAbandonedTimeout: 1800logAbandoned: true

web.xml

< filter >

< filter-name > DruidWebStatFilter

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

< param-name > exclusions

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

< filter-mapping >

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

< servlet-name > DruidStatView

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

< servlet-mapping >

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

Java代码:

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;import java.io.InputStream;import java.sql.Connection;import java.util.Properties;

public class demo {

public static void main(String[] args) throws Exception {

InputStream resourceAsStream=demo.class.getClassLoader().getResourceAsStream(\"dbconfig.properties\"); Properties pp = new Properties(); pp.load(resourceAsStream);

//创建连接池,使⽤配置⽂件中的参数

DataSource ds = DruidDataSourceFactory.createDataSource(pp);

for (int i = 0; i < 21; i++) { //从连接池中取出连接

Connection conn = ds.getConnection(); System.out.println(conn); }

//最⼤连接数设置为20,此时获取⼗⼀个connection 第21个等待三秒会报错 }}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top