Druid
- 一、配置
- url: 連接配接資料庫的url,不同資料庫不一樣。例如:mysql : jdbc: mysql://localhost:3306/druid2
- username: 連接配接資料庫的使用者名
- password: 連接配接資料庫的密碼
- driverClassName: 預設可根據URL自動識别。這一項可配可不配,如果不配置druid會根據url自動識别dbType,然後選擇相應的driverClassName。
- type: com.alibaba.druid.pool.DruidDataSource
- initialSize: 預設值0。初始化時建立實體連接配接的個數,初始化發生在顯示調用init方法,或者第一次getConnection時。
- maxActive: 預設值8。最大連接配接池數量。
- minIdle: 最小連接配接池數量。
- maxWait: 擷取連接配接時最大等待時間,機關毫秒。配置了maxWait之後,預設啟用公平鎖,并發效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true來使用非公平鎖。
- keep-alive: 連接配接池中的minIdle資料以内的連接配接,空閑時間超過minEvictableIdleTimeMillis,則會執行keepAlive操作。default=false datasource.druid.mysql.keep-alive=true
- poolPreparedStatements: 預設值為false。是否緩存preparedStatement,也就是PSCache。PSCache對支援遊标的資料庫性能提升巨大,比如說oracle。在mysql5.5之前下建議關閉。
- testOnBorrow: 預設值為true。申請連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能。
- testOnReturn: 預設值為false。歸還連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能。
- testWhileIdle: 預設值為false。建議配置為true,不影響性能,并且保證安全性。申請連接配接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接配接是否有效。
- filters: 屬性類型是字元串,通過别名的方式配置擴充插件,常用的插件有:監控統計用的filter:stat、日志用的filter:log4j、防禦sql注入的filter:wall。 spring.datasource.filters=stat,wall,log4j 慎用
- 二、配置例子:
- spring.datasource.url = jdbc: mysql://localhost:3306/test
- spring.datasource.username = root
- spring.datasource.password = root
- spring.datasource.driverClassName = com.mysql.jdbc.Driver
- spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
- #druid_config
- spring.datasource.max-active: 20
- spring.datasource.initial-size: 5
- spring.datasource.min-idle: 3
- spring.datasource.max-wait: 60000
- spring.datasource.time-between-eviction-runs-millis: 60000
- spring.datasource.min-evictable-idle-time-millis: 100000
- spring.datasource.max-evictable-idle-time-millis: 200000
- spring.datasource.test-while-idle: true
- spring.datasource.test-on-borrow: false
- spring.datasource.test-on-return: false
- spring.datasource.poolPreparedStatements: true
- 三、druid 問題
- 一、 SQL監控的功能
- 錯誤日志:
- java.lang.OutOfMemoryError: Java heap space。
- 現象:
- 使用top,伺服器cpu,占用過高,近乎100%;(原因:從gc日志,看出 fullgc頻繁;)
- 推測原因:
- 記憶體洩漏導緻GC無法回收記憶體導緻OOM。
- 臨時解決方法:
- 重新開機伺服器,為了不影響業務。
- 尋找問題:
- 1、通過日志,定位業務代碼;
- 2、 通過jvm;
- 1、在參數中添加-XX:+HeapDumpOnOutOfMemoryError,在發生oom的時候系統會自動生成Dump檔案。
- 2、jmap -dump:format=b,file=檔案名 [pid]指令生成Dump檔案。
- 分析: 使用 MAT,分析dump檔案 。發現記憶體占用一半都是存儲的sql。設定的堆是2G。根據檔案,跟蹤引用關系,找到jdbcSqlStat類,又找到jdbcDataSourceStat類,
Druid 資料庫連接配接池 Druid 資料庫連接配接池 - private static JdbcDataSourceStat global;
- 靜态變量,靜态太代碼塊。意味着除非手動在代碼中釋放global對象或者remove掉sqlStatMap裡的對象,否則sqlStatMap就會一直被持有不能被GC釋放。
- 原因:
- SQL都被JdbcDataSourceStat中的一個HashMap對象所持有導緻無法GC,進而導緻OOM的發生。
- 每個sql語句會長期持有引用,加快FullGc頻率。
- 釋放sqlStatMqp 的方法,JdbcDataSourceStat類中:
- 1、setMaxSqlSize();
- 2、reset();
- 3、getSqlStatMapAndReset();
- 解決:
- 1. 關閉 spring.datasource.filters,之前配置了,删掉就可以。預設就是關閉的;
- 錯誤日志:
- 一、 SQL監控的功能