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 jdbcUrlusernamepassworddriverClassNameinitialSizemaxActivemaxIdleminIdlemaxWait 根据url⾃动识别088 poolPreparedStatementsfalse maxOpenPreparedStatements-1 validationQuerytestOnBorrowtestOnReturn truefalse testWhileIdlefalse timeBetweenEvictionRunsMillisnumTestsPerEvictionRunminEvictableIdleTimeMillisconnectionInitSqlsexceptionSorter 根据dbType⾃动识别 filters proxyFilters 加⼊ druid-1.0.9.jarApplicationContext.xml 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-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 > < 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 > 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个等待三秒会报错 }} 因篇幅问题不能全部显示,请点此查看更多更全内容