此次灑家是在現有專案上測試druid連線池,從一個開發者的角度體驗druid的整合便利程度/穩定性,以及druid為人稱道的監控功能.
官方 github 地址:https://github.com/alibaba/druid/wiki/常見問題
廢話不多說,貼上常規整合druid方法,其實很簡單;
第一步:pom中新增druid依賴:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>複製程式碼
第二步:spring配置檔案中定義資料來源
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本屬性 url、user、password -->
<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="5" />
<property name="minIdle" value="20" />
<property name="maxActive" value="200" />
<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" />
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="1800" />
<!-- 開啟PSCache,並且指定每個連線上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- 配置監控統計攔截的filters -->
<property name="filters" value="stat" />
</bean>複製程式碼
第三步:web.xml中新增如下即可實現監控,如果僅僅想使用連線池也可不做這步配置
<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>
<!-- druid的Servlet -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>複製程式碼
至此我們已經配置完畢,按理說是可以跑起來的,但我這邊還是出了一些問題,這個後面說,我們先看看成功後的效果:
1.專案成功啟動後,輸入http://ip:埠+/druid/即可進入Druid Web URI Sta頁面
提供了sql監控頁面:
對比一下pg_stat_statements外掛監控sql的效果
還有 URl監控頁面
對比灑家自用的monitor訪問日誌監控工具效果
druid提供的監控效果如何不言而喻;
2.接下來說說druid的整合難易程度,整合過程中還是遇到一些問題的,對於現成的專案切換成druid連線池甚至還需要改java原始碼(如果業務上用到的話)
問題a:若資料庫為映象資料庫(比如docker部署的postgres映象資料庫),則切換為druid後會報錯無法啟動專案:
若將資料庫改為本地或者雲資料庫都可以成功啟動,唯獨使用使用映象資料庫會有這個問題(或許是配置的問題?有知道的少俠告知一下)
問題b:對現成專案切換為druid連線池可能產生程式碼報錯
總結:
缺點1.對資料庫為映象資料庫如docker部署的postgres會報錯服務起不來,看了官網文件暫時未找到解決辦法
2.url監控有資料但是統計還差那麼一點點細顆粒度比如一般要看特定時間範圍內特定介面的平均/最大最小響應時間這個不明白為啥他沒做全,並且他的資料似乎不能存入資料庫,可以存入日誌,我覺得還是直接存入資料庫的好
3.對於現有的專案從別的連線池遷移到druid連線池可能造成未知報錯,繼而需要改底層業務程式碼,對程式碼的入侵性還是有一些的 對比:將druid監控拆解開來看,每一項都沒有做到最好,每一項都有對應市面上做得更好的, 如對sql的統計沒有pg_stat_statements(一般運維會裝的獨立的資料庫監控元件)統計的詳細, 對url的監控沒有monitor.jar統計顆粒度細
一句話概括druid提供的監控確實挺方便,能夠滿足簡單需求,適合新專案且監控要求不高的應用場景;如果是現有維護中的專案,或者監控要求較高的專案,druid明顯可以做得更好;