連線池 druid
Druid是一個強大的新興資料庫連線池,相容DBCP,是阿里巴巴做的開源專案.
不僅提供了強悍的資料來源實現,還內建了一個比較靠譜的監控元件。
GitHub專案主頁:
QQ群: 點選連結加入群【阿里開源技術交流】
演示地址:
常見問題回答請參考:
一篇CSDN對Druid的介紹 druid簡單教程
因為想要監控資料,又不願意誰都可以訪問,所以想要配置個密碼.在開源群裡一問,就知道原來內部已經有實現了.
先貼完成後的程式碼:
web.xml 部分:
- <!-- Druid,監控資料庫,以及WEB訪問連線資訊 -->
- <!-- 參考: %E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter -->
- <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,*.jsp,/druid/*,/download/*</param-value>
- </init-param>
- <init-param>
- <param-name>sessionStatMaxCount</param-name>
- <param-value>2000</param-value>
- </init-param>
- <init-param>
- <param-name>sessionStatEnable</param-name>
- <param-value>true</param-value>
- </init-param>
- <init-param>
- <param-name>principalSessionName</param-name>
- <param-value>session_user_key</param-value>
- </init-param>
- <init-param>
- <param-name>profileEnable</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>DruidWebStatFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!-- 配置 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>
下面分享一下如何查詢的。
首先,因為使用的是 MAVEN, 所以檢視原始碼時maven會自動幫你下載. 我們在 web.xml 中點選com.alibaba.druid.support.http.StatViewServlet 進入class檔案,等一會原始碼下載好就可以檢視. 發現有類似下面這樣的程式碼:
- public class StatViewServlet extends ResourceSerlvet {
- private final static Log LOG = LogFactory.getLog(StatViewServlet.class);
- private static final long serialVersionUID = 1L;
- public static final String PARAM_NAME_RESET_ENABLE = "resetEnable";
- public static final String PARAM_NAME_JMX_URL = "jmxUrl";
- public static final String PARAM_NAME_JMX_USERNAME = "jmxUsername";
- public static final String PARAM_NAME_JMX_PASSWORD = "jmxPassword";
- private DruidStatService statService = DruidStatService.getInstance();
- /** web.xml中配置的jmx的連線地址 */
- private String jmxUrl = null;
- /** web.xml中配置的jmx的使用者名稱 */
- private String jmxUsername = null;
- /** web.xml中配置的jmx的密碼 */
- private String jmxPassword = null;
- .........
可以看出,繼承了StatViewServlet extends ResourceSerlvet
而在其中的 jmxUrl、jmxUsername 和 jmxPassword 很顯然是連線遠端 JMX時使用的,那麼我就想著去看看父類: com.alibaba.druid.support.http.ResourceSerlvet
- @SuppressWarnings("serial")
- public abstract class ResourceSerlvet extends HttpServlet {
- private final static Log LOG = LogFactory.getLog(ResourceSerlvet.class);
- public static final String SESSION_USER_KEY = "druid-user";
- public static final String PARAM_NAME_USERNAME = "loginUsername";
- public static final String PARAM_NAME_PASSWORD = "loginPassword";
- public static final String PARAM_NAME_ALLOW = "allow";
- public static final String PARAM_NAME_DENY = "deny";
- public static final String PARAM_REMOTE_ADDR = "remoteAddress";
- protected String username = null;
- protected String password = null;
- ..........
看到了 username 和 password,很高興,先配置了試試,但是配置這兩個初始化引數後沒起作用,於是繼續查詢. 看到了 service方法,我們知道,Servlet的業務邏輯就是從這裡開始的。
- public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- ......
- if (isRequireAuth() //
- && !ContainsUser(request)//
- && !("/login.html".equals(path) //
- || path.startsWith("/css")//
- || path.startsWith("/js") //
- || path.startsWith("/img"))) {
- if (contextPath == null || contextPath.equals("") || contextPath.equals("/")) {
- response.sendRedirect("/druid/login.html");
- } else {
- if ("".equals(path)) {
- response.sendRedirect("druid/login.html");
- } else {
- response.sendRedirect("login.html");
- }
- }
- return;
- }
- ......
發現呼叫了 isRequireAuth() 方法,看著像是判斷是否需要授權驗證,於是進去看
- public boolean isRequireAuth() {
- return this.username != null;
- }
那現在知道是 username 在作怪,也設定了,但是沒有起作用,於是搜尋 username ,
- public void init() throws ServletException {
- initAuthEnv();
- }
- private void initAuthEnv() {
- String paramUserName = getInitParameter(PARAM_NAME_USERNAME);
- if (!StringUtils.isEmpty(paramUserName)) {
- this.username = paramUserName;
- }
- String paramPassword = getInitParameter(PARAM_NAME_PASSWORD);
- if (!StringUtils.isEmpty(paramPassword)) {
- this.password = paramPassword;
- }
- ......
- String paramUserName = getInitParameter(PARAM_NAME_USERNAME);
- public static final String PARAM_NAME_USERNAME = "loginUsername";
- public static final String PARAM_NAME_PASSWORD = "loginPassword";
配置屬性列表
配置 |
預設值 |
說明 |
name |
配置這個屬性的意義在於,如果存在多個資料來源,監控的時候可以透過名字來區分開來。 |
|
jdbcUrl |
連線資料庫的url,不同資料庫不一樣。例如: |
|
username |
連線資料庫的使用者名稱 |
|
password |
連線資料庫的密碼。如果你不希望密碼直接寫在配置檔案中,可以使用ConfigFilter。詳細看這裡: |
|
driverClassName |
根據url自動識別 |
這一項可配可不配,如果不配置druid會根據url自動識別dbType,然後選擇相應的driverClassName |
initialSize |
0 |
初始化時建立物理連線的個數。初始化發生在顯示呼叫init方法,或者第一次getConnection時 |
maxActive |
8 |
最大連線池數量 |
maxIdle |
8 |
已經不再使用,配置了也沒效果 |
minIdle |
最小連線池數量 |
|
maxWait |
獲取連線時最大等待時間,單位毫秒。配置了maxWait之後,預設啟用公平鎖,併發效率會有所下降,如果需要可以透過配置useUnfairLock屬性為true使用非公平鎖。 |
|
poolPreparedStatements |
false |
是否快取preparedStatement,也就是PSCache。PSCache對支援遊標的資料庫效能提升巨大,比如說oracle。在mysql下建議關閉。 |
maxOpenPreparedStatements |
-1 |
要啟用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache佔用記憶體過多的問題,可以把這個數值配置大一些,比如說100 |
validationQuery |
用來檢測連線是否有效的sql,要求是一個查詢語句。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會其作用。 |
|
testOnBorrow |
true |
申請連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能。 |
testOnReturn |
false |
歸還連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能 |
testWhileIdle |
false |
建議配置為true,不影響效能,並且保證安全性。申請連線的時候檢測,如果空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連線是否有效。 |
timeBetweenEvictionRunsMillis |
有兩個含義: |
|
numTestsPerEvictionRun |
不再使用,一個DruidDataSource只支援一個EvictionRun |
|
minEvictableIdleTimeMillis |
||
connectionInitSqls |
物理連線初始化的時候執行的sql |
|
exceptionSorter |
根據dbType自動識別 |
當資料庫丟擲一些不可恢復的異常時,拋棄連線 |
filters |
屬性型別是字串,透過別名的方式配置擴充套件外掛,常用的外掛有: |
|
proxyFilters |
型別是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters,是組合關係,並非替換關係 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-1821979/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- druid連線池常見異常UI
- Druid-目前最好的連線池UI
- 聊聊資料庫連線池 Druid資料庫UI
- Druid MySQL 連線池本地實踐UIMySql
- 資料庫連線池-Druid資料庫連線池原始碼解析資料庫UI原始碼
- SpringBoot專案整合阿里Druid連線池Spring Boot阿里UI
- Java Druid資料庫連線池+SpringJDBCJavaUI資料庫SpringJDBC
- jsoup爬蟲技術+druid連線池JS爬蟲UI
- Spring Boot整合Druid資料庫連線池Spring BootUI資料庫
- druid資料庫連線池的配置類UI資料庫
- Springboot 整合阿里資料庫連線池 druidSpring Boot阿里資料庫UI
- Druid資料庫連線池使用體驗UI資料庫
- 資料庫連線池_druid基本使用&工具類資料庫UI
- springboot專案整合druid資料庫連線池Spring BootUI資料庫
- Druid資料庫連線池就這麼簡單UI資料庫
- Spring系列之整合Druid連線池及監控配置SpringUI
- springboot之Druid連線池講解+mybatis整合+PageHelper整合Spring BootUIMyBatis
- MyBatis學習-使用Druid連線池將Maybatis整合到springMyBatisUISpring
- SpringBoot中關於 HikariPool、Druid及常用連線池的比較Spring BootUI
- Druid連線池引數maxWait配置錯誤引發的問題UIAI
- 資料庫連線池優化配置(druid,dbcp,c3p0)資料庫優化UI
- SpringBoot2 基礎案例(07):整合Druid連線池,配置監控介面Spring BootUI
- 連線池
- springboot activiti 整合專案框架原始碼 shiro 安全框架 druid 資料庫連線池Spring Boot框架原始碼UI資料庫
- HTTP連線池HTTP
- django連線池Django
- 簡單的登入註冊(前端+後端+MySQL資料庫 DRuid連線池 DBUtils)前端後端MySql資料庫UI
- 解密httpclient,dbcp,jedis,c3p0,druid,okhttp都在使用的連線池技術解密HTTPclientUI
- 阿里Druid資料庫連線工具類阿里UI資料庫
- Http持久連線與HttpClient連線池HTTPclient
- 連線池和連線數詳解
- 詭異的druid連結池連結斷開故障經驗總結UI
- 自定義連線池
- ElasticSearch連線池建立Elasticsearch
- Golang SQL連線池梳理GolangSQL
- Tomcat 的 JDBC 連線池TomcatJDBC
- go 語言連線池Go
- 《四 資料庫連線池原始碼》手寫資料庫連線池資料庫原始碼
- springboot+atomikos+druid 資料庫連線失效分析Spring BootUI資料庫