建立數據庫連接耗時耗費資源,一個數據庫服務器能夠同時建立的連接數也是有限的,在大型的Web應用中,可能同時會有成百上千的訪問數據庫的請求,如果Web應用程序為每一個客戶請求分配一個數據庫連接,將導致性能的急劇下降。 數據庫連接池的意義在於,能夠重復利用數據庫連接(有點類似線程池的部分意義),提高對請求的響應時間和服務器的性能。 連接池中提前預先建立了多個數據庫連接對象,然后將連接對象保存到連接池中,當客戶請求到來時,直接從池中取出一個連接對象為客戶服務,當請求完成之后,客戶程序調用close()方法,將連接對象放回池中。 其他幾個連接池 Spring 推薦使用dbcp; Hibernate 推薦使用c3p0和proxool 1、 DBCP:apache DBCP(DataBase connection pool)數據庫連接池。是apache上的一個 java連接池項目,也是 tomcat使用的連接池組件。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar由於建立數據庫連接是一個非常耗時耗資源的行為,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完后再放回去。dbcp沒有自動的去回收空閑連接的功能。 2、 C3P0: C3P0是一個開源的jdbc連接池,它實現了數據源和jndi綁定,支持jdbc3規范和jdbc2的標准擴展。c3p0是異步操作的,緩慢的jdbc操作通過幫助進程完成。擴展這些操作可以有效的提升性能。目前使用它的開源項目有Hibernate,Spring等。c3p0有自動回收空閑連接功能。 3、 Proxool:Sourceforge Proxool是一種Java數據庫連接池技術。是sourceforge下的一個開源項目,這個項目提供一個健壯、易用的連接池,最為關鍵的是這個連接池提供監控的功能,方便易用,便於發現連接泄漏的情況。 綜合來說,穩定性是Spring 推薦使用dbcp; Hibernate 推薦使用c3p0和proxool 1、 DBCP:apache DBCP(DataBase connection pool)數據庫連接池。是apache上的一個 java連接池項目,也是 tomcat使用的連接池組件。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar由於建立數據庫連接是一個非常耗時耗資源的行為,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完后再放回去。dbcp沒有自動的去回收空閑連接的功能。 2、 C3P0: C3P0是一個開源的jdbc連接池,它實現了數據源和jndi綁定,支持jdbc3規范和jdbc2的標准擴展。c3p0是異步操作的,緩慢的jdbc操作通過幫助進程完成。擴展這些操作可以有效的提升性能。目前使用它的開源項目有Hibernate,Spring等。c3p0有自動回收空閑連接功能。 3、 Proxool:Sourceforge Proxool是一種Java數據庫連接池技術。是sourceforge下的一個開源項目,這個項目提供一個健壯、易用的連接池,最為關鍵的是這個連接池提供監控的功能,方便易用,便於發現連接泄漏的情況。 綜合來說,穩定性是dbcp>=c3p0>proxool Druid介紹 druid為阿里巴巴的數據源,(數據庫連接池),集合了c3p0、dbcp、proxool等連接池的優點,還加入了日志監控,有效的監控DB池連接和SQL的執行情況。 DRUID的DataSource類為:com.alibaba.druid.pool.DruidDataSource。 其他配置參數如下: Druid數據源的使用 在Spring配置中使用阿里巴巴的數據源。 注意要先引入druid依賴。 在Spring中直接寫配置文件即可: <!-- 配置Druid數據源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本屬性 url、user、password --> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="5" /> <property name="minIdle" value="5" /> <property name="maxActive" value="100" /> <!-- 配置獲取連接等待超時的時間 --> <property name="maxWait" value="60000" /> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打開PSCache,並且指定每個連接上PSCache的大小 --> <property name="poolPreparedStatements" value="false" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置監控統計攔截的filters --> <property name="filters" value="stat,wall" /> </bean> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 要想使用druid的數據監控功能需要在web.xml里面配置servlet <!-- 配置 Druid 監控信息顯示頁面 --> <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>true</param-value> </init-param> <init-param> <!-- 用戶名 --> <param-name>loginUsername</param-name> <param-value>druid</param-value> </init-param> <init-param> <!-- 密碼 --> <param-name>loginPassword</param-name> <param-value>druid</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 對於資源的攔截配置:(可以在web.xml,也可以在Spring里面配置) <!-- 用於采集web-jdbc關聯監控的數據。 --> <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> <init-param> <param-name>sessionStatMaxCount</param-name> <param-value>1000</param-value> </init-param> <init-param> <param-name>sessionStatEnable</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 擴展:druid是可以配置輸出日志的。這樣,可以在控制台里面,看到我們程序里面編寫的sql語句,還可以看到可執行的sql。 只需要在spring的配置文件里面配置: <bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter"> <!--日志打印可執行的sql --> <property name="statementExecutableSqlLogEnable" value="true" /> <property name="dataSourceLogEnabled" value="true" /> <property name="connectionLogEnabled" value="true" /> <property name="statementLogEnabled" value="true" /> <property name="resultSetLogEnabled" value="true" /> </bean> <!-- 配置Druid數據源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本屬性 url、user、password --> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="5" /> <property name="minIdle" value="5" /> <property name="maxActive" value="100" /> <!-- 配置獲取連接等待超時的時間 --> <property name="maxWait" value="60000" /> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打開PSCache,並且指定每個連接上PSCache的大小 --> <property name="poolPreparedStatements" value="false" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置監控統計攔截的filters --> <property name="filters" value="stat,wall" /> <property name="proxyFilters"> <list> <ref bean="log-filter"/> </list> </property> </bean> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 在Springboot 中使用Druid。 首先,Springboot中,1.5版本之前的默認的數據庫連接池是tomcat的JDBC連接池(Tomcat JDBC Pool)。 1.添加pom依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.20</version> </dependency> 1 2 3 4 5 6 7 8 9 2.配置application.properties文件,配置相關信息 ########################## mysql ########################## spring.datasource.url=jdbc:mysql://localhost/db_boot?useUnicode=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password= spring.datasource.driver-class-name=com.mysql.jdbc.Driver logging.level.com.shyroke.mapper=debug ########################## mybatis ########################## mybatis.mapper-locations=classpath:mybatis/*.xml ########################## druid配置 ########################## spring.datasource.type=com.alibaba.druid.pool.DruidDataSource # 初始化大小,最小,最大 spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 # 配置獲取連接等待超時的時間 spring.datasource.maxWait=60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 # 配置一個連接在池中最小生存的時間,單位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000 # 校驗SQL,Oracle配置 spring.datasource.validationQuery=SELECT 1 FROM DUAL,如果不配validationQuery項,則下面三項配置無用 spring.datasource.validationQuery=SELECT 'x' spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false # 打開PSCache,並且指定每個連接上PSCache的大小 spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 # 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆 spring.datasource.filters=stat,wall,log4j # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄 spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合並多個DruidDataSource的監控數據 spring.datasource.useGlobalDataSourceStat=true 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 3.配置WebFilter package com.example.durid.filter; import com.alibaba.druid.support.http.WebStatFilter; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; /** * 配置監控攔截器 * druid監控攔截器 * @ClassName: DruidStatFilter * @author 16437 * @date */ @WebFilter(filterName = "druidWebStatFilter", urlPatterns = "/*", initParams = // 忽略資源 { @WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")} ) public class DruidStatFilter extends WebStatFilter { } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 4.配置WebServlet package com.example.durid.base; import com.alibaba.druid.support.http.StatViewServlet; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; /** * druid監控視圖配置 * @ClassName: DruidStatViewServlet * @author Martina * @date 2019 */ @WebServlet(urlPatterns = "/druid/*", initParams={ @WebInitParam(name="allow",value=""),// IP白名單 (沒有配置或者為空,則允許所有訪問) @WebInitParam(name="deny",value="192.168.16.111"),// IP黑名單 (存在共同時,deny優先於allow) @WebInitParam(name="loginUsername",value="admin"),// 用戶名 @WebInitParam(name="loginPassword",value="admin"),// 密碼 @WebInitParam(name="resetEnable",value="true")// 禁用HTML頁面上的“Reset All”功能 }) public class DruidStatViewServlet extends StatViewServlet { } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 5.掃描Servlet 注意要啟動類中加上@ServletComponentScan注解,否則Servlet無法生效 。 package com.example.durid; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication @ServletComponentScan public class DuridApplication { public static void main(String[] args) { SpringApplication.run(DuridApplication.class, args); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 6.手動初始化DataSource 有些版本存在自動初始化數據,SQL監控顯示不出任何的內容問題,如果版本不存在bug可以跳過這一步。 package com.example.durid; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import java.sql.SQLException; @Configuration public class DruidConfiguration { @Value("${spring.datasource.url}") private String dbUrl; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driverClassName}") private String driverClassName; @Value("${spring.datasource.initialSize}") private int initialSize; @Value("${spring.datasource.minIdle}") private int minIdle; @Value("${spring.datasource.maxActive}") private int maxActive; @Value("${spring.datasource.maxWait}") private int maxWait; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.validationQuery}") private String validationQuery; @Value("${spring.datasource.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") private boolean testOnReturn; @Value("${spring.datasource.poolPreparedStatements}") private boolean poolPreparedStatements; @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}") private int maxPoolPreparedStatementPerConnectionSize; @Value("${spring.datasource.filters}") private String filters; @Value("${spring.datasource.connectionProperties}") private String connectionProperties; @Value("${spring.datasource.useGlobalDataSourceStat}") private boolean useGlobalDataSourceStat; @Bean //聲明其為Bean實例 @Primary //在同樣的DataSource中,首先使用被標注的DataSource public DruidDataSource dataSource(){ DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(this.dbUrl); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); //configuration datasource.setInitialSize(initialSize); datasource.setMinIdle(minIdle); datasource.setMaxActive(maxActive); datasource.setMaxWait(maxWait); datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setValidationQuery(validationQuery); datasource.setTestWhileIdle(testWhileIdle); datasource.setTestOnBorrow(testOnBorrow); datasource.setTestOnReturn(testOnReturn); datasource.setPoolPreparedStatements(poolPreparedStatements); datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat); try { datasource.setFilters(filters); } catch (SQLException e) { System.err.println("druid configuration initialization filter: "+ e); } datasource.setConnectionProperties(connectionProperties); return datasource; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 配置完成之后,啟動應用程序,可以再瀏覽器中的SQL監控中查看SQL的執行數、時間、事務等情況。 部分轉自:https://www.cnblogs.com/zfding/p/7821967.html 以及 https://www.cnblogs.com/shyroke/p/8045077.html 附上github上,druid的托管地址:https://github.com/alibaba/druid ———————————————— 版權聲明:本文為CSDN博主「木霖森77」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/mulinsen77/article/details/87778601
建立數據庫連接耗時耗費資源,一個數據庫服務器能夠同時建立的連接數也是有限的,在大型的Web應用中,可能同時會有成百上千的訪問數據庫的請求,如果Web應用程序為每一個客戶請求分配一個數據庫連接,將導致性能的急劇下降。
數據庫連接池的意義在於,能夠重復利用數據庫連接(有點類似線程池的部分意義),提高對請求的響應時間和服務器的性能。連接池中提前預先建立了多個數據庫連接對象,然后將連接對象保存到連接池中,當客戶請求到來時,直接從池中取出一個連接對象為客戶服務,當請求完成之后,客戶程序調用close()方法,將連接對象放回池中。
其他幾個連接池Spring 推薦使用dbcp;Hibernate 推薦使用c3p0和proxool
1、 DBCP:apacheDBCP(DataBase connection pool)數據庫連接池。是apache上的一個 java連接池項目,也是 tomcat使用的連接池組件。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar由於建立數據庫連接是一個非常耗時耗資源的行為,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完后再放回去。dbcp沒有自動的去回收空閑連接的功能。
2、 C3P0:C3P0是一個開源的jdbc連接池,它實現了數據源和jndi綁定,支持jdbc3規范和jdbc2的標准擴展。c3p0是異步操作的,緩慢的jdbc操作通過幫助進程完成。擴展這些操作可以有效的提升性能。目前使用它的開源項目有Hibernate,Spring等。c3p0有自動回收空閑連接功能。
3、 Proxool:SourceforgeProxool是一種Java數據庫連接池技術。是sourceforge下的一個開源項目,這個項目提供一個健壯、易用的連接池,最為關鍵的是這個連接池提供監控的功能,方便易用,便於發現連接泄漏的情況。綜合來說,穩定性是Spring 推薦使用dbcp;Hibernate 推薦使用c3p0和proxool1、 DBCP:apacheDBCP(DataBase connection pool)數據庫連接池。是apache上的一個 java連接池項目,也是 tomcat使用的連接池組件。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar由於建立數據庫連接是一個非常耗時耗資源的行為,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完后再放回去。dbcp沒有自動的去回收空閑連接的功能。
2、 C3P0:C3P0是一個開源的jdbc連接池,它實現了數據源和jndi綁定,支持jdbc3規范和jdbc2的標准擴展。c3p0是異步操作的,緩慢的jdbc操作通過幫助進程完成。擴展這些操作可以有效的提升性能。目前使用它的開源項目有Hibernate,Spring等。c3p0有自動回收空閑連接功能。
3、 Proxool:SourceforgeProxool是一種Java數據庫連接池技術。是sourceforge下的一個開源項目,這個項目提供一個健壯、易用的連接池,最為關鍵的是這個連接池提供監控的功能,方便易用,便於發現連接泄漏的情況。綜合來說,穩定性是dbcp>=c3p0>proxool
Druid介紹druid為阿里巴巴的數據源,(數據庫連接池),集合了c3p0、dbcp、proxool等連接池的優點,還加入了日志監控,有效的監控DB池連接和SQL的執行情況。DRUID的DataSource類為:com.alibaba.druid.pool.DruidDataSource。其他配置參數如下:
Druid數據源的使用在Spring配置中使用阿里巴巴的數據源。注意要先引入druid依賴。
在Spring中直接寫配置文件即可:
<!-- 配置Druid數據源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本屬性 url、user、password --> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="5" /> <property name="minIdle" value="5" /> <property name="maxActive" value="100" /> <!-- 配置獲取連接等待超時的時間 --> <property name="maxWait" value="60000" /> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打開PSCache,並且指定每個連接上PSCache的大小 --> <property name="poolPreparedStatements" value="false" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置監控統計攔截的filters --> <property name="filters" value="stat,wall" /> </bean>123456789101112131415161718192021222324252627282930313233要想使用druid的數據監控功能需要在web.xml里面配置servlet
<!-- 配置 Druid 監控信息顯示頁面 --> <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>true</param-value> </init-param> <init-param> <!-- 用戶名 --> <param-name>loginUsername</param-name> <param-value>druid</param-value> </init-param> <init-param> <!-- 密碼 --> <param-name>loginPassword</param-name> <param-value>druid</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping>123456789101112131415161718192021222324對於資源的攔截配置:(可以在web.xml,也可以在Spring里面配置)
<!-- 用於采集web-jdbc關聯監控的數據。 --> <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> <init-param> <param-name>sessionStatMaxCount</param-name> <param-value>1000</param-value> </init-param> <init-param> <param-name>sessionStatEnable</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>123456789101112131415161718192021擴展:druid是可以配置輸出日志的。這樣,可以在控制台里面,看到我們程序里面編寫的sql語句,還可以看到可執行的sql。
只需要在spring的配置文件里面配置:
<bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter"> <!--日志打印可執行的sql --> <property name="statementExecutableSqlLogEnable" value="true" /> <property name="dataSourceLogEnabled" value="true" /> <property name="connectionLogEnabled" value="true" /> <property name="statementLogEnabled" value="true" /> <property name="resultSetLogEnabled" value="true" /> </bean> <!-- 配置Druid數據源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本屬性 url、user、password --> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="5" /> <property name="minIdle" value="5" /> <property name="maxActive" value="100" /> <!-- 配置獲取連接等待超時的時間 --> <property name="maxWait" value="60000" /> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打開PSCache,並且指定每個連接上PSCache的大小 --> <property name="poolPreparedStatements" value="false" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置監控統計攔截的filters --> <property name="filters" value="stat,wall" /> <property name="proxyFilters"> <list> <ref bean="log-filter"/> </list> </property> </bean>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647在Springboot 中使用Druid。首先,Springboot中,1.5版本之前的默認的數據庫連接池是tomcat的JDBC連接池(Tomcat JDBC Pool)。1.添加pom依賴<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.20</version></dependency>1234567892.配置application.properties文件,配置相關信息########################## mysql ##########################spring.datasource.url=jdbc:mysql://localhost/db_boot?useUnicode=true&characterEncoding=utf-8spring.datasource.username=rootspring.datasource.password=spring.datasource.driver-class-name=com.mysql.jdbc.Driver
logging.level.com.shyroke.mapper=debug
########################## mybatis ##########################mybatis.mapper-locations=classpath:mybatis/*.xml
########################## druid配置 ##########################spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 初始化大小,最小,最大 spring.datasource.initialSize=5spring.datasource.minIdle=5spring.datasource.maxActive=20# 配置獲取連接等待超時的時間 spring.datasource.maxWait=60000# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000# 配置一個連接在池中最小生存的時間,單位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000# 校驗SQL,Oracle配置 spring.datasource.validationQuery=SELECT 1 FROM DUAL,如果不配validationQuery項,則下面三項配置無用 spring.datasource.validationQuery=SELECT 'x'spring.datasource.testWhileIdle=truespring.datasource.testOnBorrow=falsespring.datasource.testOnReturn=false# 打開PSCache,並且指定每個連接上PSCache的大小 spring.datasource.poolPreparedStatements=truespring.datasource.maxPoolPreparedStatementPerConnectionSize=20# 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆 spring.datasource.filters=stat,wall,log4j# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄 spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000# 合並多個DruidDataSource的監控數據 spring.datasource.useGlobalDataSourceStat=true1234567891011121314151617181920212223242526272829303132333435363738393.配置WebFilterpackage com.example.durid.filter; import com.alibaba.druid.support.http.WebStatFilter; import javax.servlet.annotation.WebFilter;import javax.servlet.annotation.WebInitParam; /** * 配置監控攔截器 * druid監控攔截器 * @ClassName: DruidStatFilter * @author 16437 * @date */@WebFilter(filterName = "druidWebStatFilter", urlPatterns = "/*", initParams = // 忽略資源 { @WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")})public class DruidStatFilter extends WebStatFilter { }12345678910111213141516171819202122234.配置WebServletpackage com.example.durid.base; import com.alibaba.druid.support.http.StatViewServlet; import javax.servlet.annotation.WebInitParam;import javax.servlet.annotation.WebServlet; /** * druid監控視圖配置 * @ClassName: DruidStatViewServlet * @author Martina * @date 2019 */@WebServlet(urlPatterns = "/druid/*", initParams={ @WebInitParam(name="allow",value=""),// IP白名單 (沒有配置或者為空,則允許所有訪問) @WebInitParam(name="deny",value="192.168.16.111"),// IP黑名單 (存在共同時,deny優先於allow) @WebInitParam(name="loginUsername",value="admin"),// 用戶名 @WebInitParam(name="loginPassword",value="admin"),// 密碼 @WebInitParam(name="resetEnable",value="true")// 禁用HTML頁面上的“Reset All”功能})public class DruidStatViewServlet extends StatViewServlet { }12345678910111213141516171819202122235.掃描Servlet注意要啟動類中加上@ServletComponentScan注解,否則Servlet無法生效 。
package com.example.durid; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication@ServletComponentScanpublic class DuridApplication { public static void main(String[] args) {SpringApplication.run(DuridApplication.class, args);}}12345678910111213146.手動初始化DataSource有些版本存在自動初始化數據,SQL監控顯示不出任何的內容問題,如果版本不存在bug可以跳過這一步。
package com.example.durid; import com.alibaba.druid.pool.DruidDataSource;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary; import java.sql.SQLException; @Configurationpublic class DruidConfiguration { @Value("${spring.datasource.url}") private String dbUrl; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driverClassName}") private String driverClassName; @Value("${spring.datasource.initialSize}") private int initialSize; @Value("${spring.datasource.minIdle}") private int minIdle; @Value("${spring.datasource.maxActive}") private int maxActive; @Value("${spring.datasource.maxWait}") private int maxWait; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.validationQuery}") private String validationQuery; @Value("${spring.datasource.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") private boolean testOnReturn; @Value("${spring.datasource.poolPreparedStatements}") private boolean poolPreparedStatements; @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}") private int maxPoolPreparedStatementPerConnectionSize; @Value("${spring.datasource.filters}") private String filters; @Value("${spring.datasource.connectionProperties}") private String connectionProperties; @Value("${spring.datasource.useGlobalDataSourceStat}") private boolean useGlobalDataSourceStat; @Bean //聲明其為Bean實例 @Primary //在同樣的DataSource中,首先使用被標注的DataSource public DruidDataSource dataSource(){ DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(this.dbUrl); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); //configuration datasource.setInitialSize(initialSize); datasource.setMinIdle(minIdle); datasource.setMaxActive(maxActive); datasource.setMaxWait(maxWait); datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setValidationQuery(validationQuery); datasource.setTestWhileIdle(testWhileIdle); datasource.setTestOnBorrow(testOnBorrow); datasource.setTestOnReturn(testOnReturn); datasource.setPoolPreparedStatements(poolPreparedStatements); datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat); try { datasource.setFilters(filters); } catch (SQLException e) { System.err.println("druid configuration initialization filter: "+ e); } datasource.setConnectionProperties(connectionProperties); return datasource; }}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283配置完成之后,啟動應用程序,可以再瀏覽器中的SQL監控中查看SQL的執行數、時間、事務等情況。
部分轉自:https://www.cnblogs.com/zfding/p/7821967.html以及 https://www.cnblogs.com/shyroke/p/8045077.html附上github上,druid的托管地址:https://github.com/alibaba/druid————————————————版權聲明:本文為CSDN博主「木霖森77」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/mulinsen77/article/details/87778601