DruidDataSource详解部分(一)
資源復(fù)用是系統(tǒng)性能優(yōu)化中的一種常用手段,如單例,數(shù)據(jù)庫連接池,線程池等都是資源復(fù)用的常用技巧。 數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護(hù)一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取和返回方法
和dbcp類似,druid的配置項(xiàng)如下
?
DruidDataSource配置
// properties settingMap<String, String> conf = new HashedMap();conf.put(DruidDataSourceFactory.PROP_DRIVERCLASSNAME, "com.mysql.jdbc.Driver");conf.put(DruidDataSourceFactory.PROP_URL, url);conf.put(DruidDataSourceFactory.PROP_USERNAME, source.getUserName());if (StringUtils.isNotBlank(source.getUserPwd())) {conf.put(DruidDataSourceFactory.PROP_PASSWORD, source.getUserPwd());}// 配置初始化大小、最小、最大conf.put(DruidDataSourceFactory.PROP_INITIALSIZE, source.getInitialSize() + "");conf.put(DruidDataSourceFactory.PROP_MINIDLE, source.getMinIdle()+ "");conf.put(DruidDataSourceFactory.PROP_MAXACTIVE, source.getMaxActive()+ "");DruidDataSource druidDS = (DruidDataSource) DruidDataSourceFactory.createDataSource(conf);druidDS.setBreakAfterAcquireFailure(true);/** 是否緩存preparedStatement,也就是PSCache。 PSCache對支持游標(biāo)的數(shù)據(jù)庫性能提升巨大,比如說oracle。在mysql5.5以下的版本中沒有PSCache功能,建議關(guān)閉掉。作者在5.5版本中使用PSCache,通過監(jiān)控界面發(fā)現(xiàn)PSCache有緩存命中率記錄,該應(yīng)該是支持PSCache*/druidDS.setPoolPreparedStatements(true);/**setTimeBetweenEvictionRunsMillis:有兩個(gè)含義:1) Destroy線程會(huì)檢測連接的間隔時(shí)間2) testWhileIdle的判斷依據(jù),詳細(xì)看testWhileIdle屬性的說明setTestWhileIdle:建議配置為true,不影響性能,并且保證安全性。申請連接的時(shí)候檢測,如果空閑時(shí)間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效。*/druidDS.setTestWhileIdle(true);druidDS.setTimeBetweenEvictionRunsMillis(60000);druidDS.setConnectionErrorRetryAttempts(APIConstant.DATA_API_JDBC_CONNECTION_RETRY_COUNT);// 連接泄漏監(jiān)測druidDS.setRemoveAbandoned(true);// 是否在自動(dòng)回收超時(shí)連接的時(shí)候打印連接的超時(shí)錯(cuò)誤druidDS.setLogAbandoned(true);// 30s=>0.5m ,1800s =>30m, 3600s =>1h,設(shè)置8小時(shí)有效druidDS.setRemoveAbandonedTimeout(3600 * 8 * 24);// 配置獲取連接等待超時(shí)的時(shí)間druidDS.setMaxWait(2000);// 單位秒,檢測連接是否有效的超時(shí)時(shí)間。底層調(diào)用jdbc Statement對象的void setQueryTimeout(int seconds)方法druidDS.setValidationQueryTimeout(source.getValidationQueryTimeout());// 防止過期druidDS.setValidationQuery("SELECT 'x'");druidDS.setTestWhileIdle(true);druidDS.setTestOnBorrow(true);// 初始化druidDS.init();filters:屬性類型是字符串,通過別名的方式配置擴(kuò)展插件,常用的插件有:監(jiān)控統(tǒng)計(jì)
用的filter:stat日志用的filter:log4j,防御sql注入的filter:wall
initialSize:初始化時(shí)建立物理連接的個(gè)數(shù)。初始化發(fā)生在顯示調(diào)用init方法,或者第一
次getConnection時(shí)
maxActive:最大連接池?cái)?shù)量
minIdle:最小連接池?cái)?shù)量
maxWait:獲取連接時(shí)最大等待時(shí)間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會(huì)有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖
poolPreparedStatements: 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標(biāo)的數(shù)據(jù)庫性能提升巨大,比如說oracle。在mysql下建議關(guān)閉。
validationQuery:用來檢測連接是否有效的sql,要求是一個(gè)查詢語句,常用select 'x'。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會(huì)起作用
validationQueryTimeout:單位秒,檢測連接是否有效的超時(shí)時(shí)間。底層調(diào)用jdbc Statement對象的void setQueryTimeout(int seconds)方法
testOnBorrow: 申請連接時(shí)執(zhí)行validationQuery檢測連接是否有效,做了這個(gè)配置會(huì) 降低性能。
testOnReturn:歸還連接時(shí)執(zhí)行validationQuery檢測連接是否有效,做了這個(gè)配置會(huì)降 低性能。
testWhileIdle:建議配置為true,不影響性能,并且保證安全性。指明連接是否被空閑連接回收器(如果有)進(jìn)行檢驗(yàn).如果檢測失敗,則連接將被從池中去除. 。
numTestsPerEvictionRun:不再使用,一個(gè)DruidDataSource只支持一個(gè)EvictionRun
minEvictableIdleTimeMillis:連接保持空閑而不被驅(qū)逐的最長時(shí)間
connectionInitSqls:物理連接初始化的時(shí)候執(zhí)行的sql
exceptionSorter:當(dāng)數(shù)據(jù)庫拋出一些不可恢復(fù)的異常時(shí),拋棄連接
removeAbandoned:是否啟用連接泄露檢測
removeAbandonedTimeout:連接泄露,連接超過指定時(shí)間未關(guān)閉,就會(huì)被強(qiáng)行回收
logAbandoned:關(guān)閉abanded連接時(shí)輸出錯(cuò)誤日志
鏈接:https://www.jianshu.com/p/6e8e1ae6f02b
?
總結(jié)
以上是生活随笔為你收集整理的DruidDataSource详解部分(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。