參考帖子:http://www.cnblogs.com/han-1034683568/p/6730869.html
Druid數據連接池簡介
- Druid是Java語言中最好的數據庫連接池。Druid能夠提供強大的監控和擴展功能。
- 性能好,同時自帶監控頁面,可以實時監控應用的連接池情況以及其中性能差的sql,方便我們找出應用中連接池方面的問題。
Druid是一個JDBC組件,它包括三部分:
- DruidDriver 代理Driver,能夠提供基於Filter-Chain模式的插件體系
- DruidDataSource 高效可管理的數據庫連接池
- SQLParser
Druid可以做什么
- 可以監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對於線上分析數據庫訪問性能有幫助。
- 替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。
- 數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。
-
SQL執行日志,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的數據庫訪問情況。
druid監控
Druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環境大規模部署的嚴苛考驗。
1、下載druid包
Maven配置:
<!-- 阿里druid 數據源 start --> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <!-- 阿里druid 數據源 end -->
最新版druid 引用了slf4j 所以需要一並加入,否則會報找不到slf4的錯誤。
2、applicationContext.xml 引入配置文件數據庫連接相關信息
<!-- 引入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties" /> </bean>
jdbc.properties 中配置數據庫鏈接信息:
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@10.110.3.17:1521:實例名
jdbc.username=user
jdbc.password=password
3、applicationContext.xml數據源的配置:
<!-- 阿里druid 數據源 dataSource start --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="10" /> <property name="minIdle" value="10" /> <property name="maxActive" value="50" /> <!-- 配置獲取連接等待超時的時間 --> <property name="maxWait" value="10000" /> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="testWhileIdle" value="true" /> <!-- 這里建議配置為TRUE,防止取到的連接不可用 --> <property name="testOnBorrow" value="true" /> <property name="testOnReturn" value="false" /> <!-- 打開PSCache,並且指定每個連接上PSCache的大小 --> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 這里配置提交方式,默認就是TRUE,可以不用配置 --> <property name="defaultAutoCommit" value="true" /> <!-- 驗證連接有效與否的SQL,不同的數據配置不同 mysql:select 1 ;oracle : select 1 from dual --> <property name="validationQuery" value="select 1 from dual" /> <property name="filters" value="wall,stat" /> <property name="proxyFilters"> <list> <ref bean="logFilter" /> <ref bean="stat-filter" /> </list> </property> </bean> <!-- 慢SQL記錄 --> <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter"> <!-- 慢sql時間設置,即執行時間大於50毫秒的都是慢sql --> <property name="slowSqlMillis" value="50"/> <property name="logSlowSql" value="true"/> </bean> <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> <property name="dataSourceLogEnabled" value="true" /> <property name="statementExecutableSqlLogEnable" value="true" /> </bean> <!-- 阿里druid 數據源 dataSource end -->
4、web.xml中加入監控配置: 只需要在web.xml中做一下簡單的Servlet配置即可。
<!--連接池啟用Web監控統計功能start --> <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> <init-param> <!-- 不允許清空統計數據 --> <param-name>resetEnable</param-name> <param-value>false</param-value> </init-param> <init-param> <!-- 用戶名 --> <param-name>loginUsername</param-name> <param-value>yourname</param-value> </init-param> <init-param> <!-- 密碼 --> <param-name>loginPassword</param-name> <param-value>yourpassword</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping> <!--連接池啟用Web監控統計功能end-->
重新構建工程並啟動tomcat,啟動項目http://ip:端口/項目名稱/druid/ 即可進入到druid監控面板的登錄頁面,如下圖。
輸入在web.xml中配置的賬號和密碼即可進入監控后台,注意,配置的賬號和密碼是明文,你在這里配置什么就是什么,並沒有經過加密。
OK,我們看到系統的一些簡述信息,當然,你也應該看到啟動時間了.
接下來是比較重要的一個頁面,SQL監控
從這個頁面里我們能看到網站從啟動開始執行的sql語句統計,每一條語句的執行次數、執行時間之和、最慢執行時間、執行錯誤數等等多個統計指標,通過這個統計數據我們可以找出sql語句的執行規律及sql語句的不足之處,也可以通過錯誤數來定位程序的不足並及時修改。
在配置druid數據源時,做了如下配置,開啟了druid防火牆。
<property name="filters" value="wall,stat"/>
因此在控制后台也能見到SQL防火牆面板,如下圖所示:
面板里是防御統計及sql的統計信息,這里用的是druid默認的一些過濾規則,並沒有自定義復雜的防火牆規則,因此也不細說了。
開啟慢sql監控
在SQL監控中,有一項關於sql執行最慢執行時間的統計,但是只有一個值,就是一條sql語句最慢的執行時間記錄,其他執行時間是看不到的,只能通過總時間來進行粗略的估計,還有一個問題就是,一旦項目重啟,這些記錄就全都沒了,因此制定對應的日志輸出策略是極其必要的。
大致想法就是通過druid獲取所有項目運行中的慢sql執行記錄,並將這些數據輸出到日志文件中,查了一下druid的資料,調試了一段時間,最終成功實現。
1、修改數據源配置,增加攔截器:
<property name="proxyFilters"> <list> <ref bean="logFilter" /> <ref bean="stat-filter" /> </list> </property>
2、配置慢sql及日志攔截器:
<!-- 慢SQL記錄 --> <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter"> <!-- 慢sql時間設置,即執行時間大於50毫秒的都是慢sql --> <property name="slowSqlMillis" value="50"/> <property name="logSlowSql" value="true"/> </bean> <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> <property name="dataSourceLogEnabled" value="true" /> <property name="statementExecutableSqlLogEnable" value="true" /> </bean>
3、修改log4j 配置文件,增加慢sql日志的輸出策略:
#--------------------增加druid監控日志輸出
log4j.rootLogger=DEBUG, Console ,druid
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
#log4j.rootLogger=DEBUG,debug,druid
# Druid -------------------增加Druid監控日志輸出
log4j.logger.druid.sql=WARN,druid
log4j.logger.druid.sql.DataSource=WARN,druid
log4j.logger.druid.sql.Connection=WARN,druid
log4j.logger.druid.sql.Statement=WARN,druid
log4j.appender.druid=org.apache.log4j.DailyRollingFileAppender
log4j.appender.druid.layout=org.apache.log4j.PatternLayout
log4j.appender.druid.layout.ConversionPattern= [%d{HH\:mm\:ss}] %c{1} - %m%n
log4j.appender.druid.datePattern='.'yyyy-MM-dd
log4j.appender.druid.Threshold = WARN
log4j.appender.druid.append=true
log4j.appender.druid.File=${catalina.home}/logs/ssm-maven/druid-slow-sql.log
重啟再去查看druid監控后台,可以看到跟原來有了一些差別,由於設置了慢sql的時間為大於50毫秒,所以執行時間大於50毫秒的都會被紅色標注。
再去tomcat日志文件夾中查看日志文件,可以看到日志文件中已經存在配置的慢sql日志文件了,點擊查看其中也已經有了慢sql記錄的數據,慢sql以及這條sql語句執行的時間都有記錄。
開啟spring監控
在監控面板中看到有spring監控這個功能,如果沒有進行配置,則功能不能用,查了一下druid的文檔,最終開啟了spring監控功能。
配置如下:
<!-- 阿里druid Spring監控 start --> <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor"> </bean> <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype"> <property name="patterns"> <list> <value>com.inspur.smvc.service.*</value> <value>com.inspur.smvc.dao.*</value> </list> </property> </bean> <aop:config> <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut"/> </aop:config> <!-- 阿里druid Spring監控 end -->
再次查看spring監控頁面,已經有了數據:
原先的做法只能對sql語句及jdbc相關操作進行監控,無法監控到代碼級別的運行,因此進一步設置,結合spring的AOP特性對代碼的運行效果進行監控,druid可以做到方法級別的監控,這個功能可以讓你發現方法的調用頻率及方法的運行時間,及時做出調整和修正使得項目更健壯。