宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動態(tài)
精選推薦

Spring Boot 2.x基礎(chǔ)教程:使用國產(chǎn)數(shù)據(jù)庫連接池Druid

管理 管理 編輯 刪除

配置Druid數(shù)據(jù)源

這一節(jié)的實踐我們將基于《JdbcTemplate訪問MySQL數(shù)據(jù)庫》一文的代碼基礎(chǔ)上進(jìn)行。所以,讀者可以從文末的代碼倉庫中,檢出chapter3-1目錄來進(jìn)行下面的實踐學(xué)習(xí)。

下面我們就來開始對Spring Boot項目配置Druid數(shù)據(jù)源:

第一步:在pom.xml中引入druid官方提供的Spring Boot Starter封裝。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

第二步:在application.properties中配置數(shù)據(jù)庫連接信息。

Druid的配置都以spring.datasource.druid作為前綴,所以根據(jù)之前的配置,稍作修改即可:

spring.datasource.druid.url=jdbc:mysql://localhost:3306/test
spring.datasource.druid.username=root
spring.datasource.druid.password=
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

第三步:配置Druid的連接池。

與Hikari一樣,要用好一個數(shù)據(jù)源,就要對其連接池做好相應(yīng)的配置,比如下面這樣:

spring.datasource.druid.initialSize=10
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.minIdle=1
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=true
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxOpenPreparedStatements=20
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.validation-query-timeout=500
spring.datasource.druid.filters=stat

關(guān)于Druid中各連接池配置的說明可查閱下面的表格:

配置缺省值說明
name配置這個屬性的意義在于,如果存在多個數(shù)據(jù)源,監(jiān)控的時候可以通過名字來區(qū)分開來。如果沒有配置,將會生成一個名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此屬性至少在1.0.5版本中是不起作用的,強(qiáng)行設(shè)置name會出錯。詳情-點此處open in new window
url連接數(shù)據(jù)庫的url,不同數(shù)據(jù)庫不一樣。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username連接數(shù)據(jù)庫的用戶名
password連接數(shù)據(jù)庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。詳細(xì)看這里open in new window
driverClassName根據(jù)url自動識別這一項可配可不配,如果不配置druid會根據(jù)url自動識別dbType,然后選擇相應(yīng)的driverClassName
initialSize0初始化時建立物理連接的個數(shù)。初始化發(fā)生在顯示調(diào)用init方法,或者第一次getConnection時
maxActive8最大連接池數(shù)量
maxIdle8已經(jīng)不再使用,配置了也沒效果
minIdle最小連接池數(shù)量
maxWait獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
poolPreparedStatementsfalse是否緩存preparedStatement,也就是PSCache。PSCache對支持游標(biāo)的數(shù)據(jù)庫性能提升巨大,比如說oracle。在mysql下建議關(guān)閉。
maxPoolPreparedStatementPerConnectionSize-1要啟用PSCache,必須配置大于0,當(dāng)大于0時,poolPreparedStatements自動觸發(fā)修改為true。在Druid中,不會存在Oracle下PSCache占用內(nèi)存過多的問題,可以把這個數(shù)值配置大一些,比如說100
validationQuery用來檢測連接是否有效的sql,要求是一個查詢語句,常用select 'x'。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會起作用。
validationQueryTimeout單位:秒,檢測連接是否有效的超時時間。底層調(diào)用jdbc Statement對象的void setQueryTimeout(int seconds)方法
testOnBorrowtrue申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。
testOnReturnfalse歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。
testWhileIdlefalse建議配置為true,不影響性能,并且保證安全性。申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效。
keepAlivefalse (1.0.28)連接池中的minIdle數(shù)量以內(nèi)的連接,空閑時間超過minEvictableIdleTimeMillis,則會執(zhí)行keepAlive操作。
timeBetweenEvictionRunsMillis1分鐘(1.0.14)有兩個含義: 1) Destroy線程會檢測連接的間隔時間,如果連接空閑時間大于等于minEvictableIdleTimeMillis則關(guān)閉物理連接。 2) testWhileIdle的判斷依據(jù),詳細(xì)看testWhileIdle屬性的說明
numTestsPerEvictionRun30分鐘(1.0.14)不再使用,一個DruidDataSource只支持一個EvictionRun
minEvictableIdleTimeMillis連接保持空閑而不被驅(qū)逐的最小時間
connectionInitSqls物理連接初始化的時候執(zhí)行的sql
exceptionSorter根據(jù)dbType自動識別當(dāng)數(shù)據(jù)庫拋出一些不可恢復(fù)的異常時,拋棄連接
filters屬性類型是字符串,通過別名的方式配置擴(kuò)展插件,常用的插件有: 監(jiān)控統(tǒng)計用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall
proxyFilters類型是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters,是組合關(guān)系,并非替換關(guān)系

到這一步,就已經(jīng)完成了將Spring Boot的默認(rèn)數(shù)據(jù)源HikariCP切換到Druid的所有操作。

#配置Druid監(jiān)控

既然用了Druid,那么對于Druid的監(jiān)控功能怎么能不用一下呢?下面就來再進(jìn)一步做一些配置,來啟用Druid的監(jiān)控。

第一步:在pom.xml中引入spring-boot-starter-actuator模塊

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

第二步:在application.properties中添加Druid的監(jiān)控配置。


spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

上面的配置主要用于開啟stat監(jiān)控統(tǒng)計的界面以及監(jiān)控內(nèi)容的相關(guān)配置,具體釋意如下:

  • spring.datasource.druid.stat-view-servlet.url-pattern:訪問地址規(guī)則
  • spring.datasource.druid.stat-view-servlet.reset-enable:是否允許清空統(tǒng)計數(shù)據(jù)
  • spring.datasource.druid.stat-view-servlet.login-username:監(jiān)控頁面的登錄賬戶
  • spring.datasource.druid.stat-view-servlet.login-password:監(jiān)控頁面的登錄密碼

第三步:針對之前實現(xiàn)的UserService內(nèi)容,我們創(chuàng)建一個Controller來通過接口去調(diào)用數(shù)據(jù)訪問操作:

@Data
@AllArgsConstructor
@RestController
public class UserController {

    private UserService userService;

    @PostMapping("/user")
    public int create(@RequestBody User user) {
        return userService.create(user.getName(), user.getAge());
    }

    @GetMapping("/user/{name}")
    public List<User> getByName(@PathVariable String name) {
        return userService.getByName(name);
    }

    @DeleteMapping("/user/{name}")
    public int deleteByName(@PathVariable String name) {
        return userService.deleteByName(name);
    }

    @GetMapping("/user/count")
    public int getAllUsers() {
        return userService.getAllUsers();
    }

    @DeleteMapping("/user/all")
    public int deleteAllUsers() {
        return userService.deleteAllUsers();
    }

}

第四步:完成上面所有配置之后,啟動應(yīng)用,訪問Druid的監(jiān)控頁面http://localhost:8080/druid/,可以看到如下登錄頁面:

輸入上面spring.datasource.druid.stat-view-servlet.login-usernamespring.datasource.druid.stat-view-servlet.login-password配置的登錄賬戶與密碼,就能看到如下監(jiān)控頁面:

進(jìn)入到這邊時候,就可以看到對于應(yīng)用端而言的各種監(jiān)控數(shù)據(jù)了。這里講解幾個最為常用的監(jiān)控頁面:

數(shù)據(jù)源:這里可以看到之前我們配置的數(shù)據(jù)庫連接池信息以及當(dāng)前使用情況的各種指標(biāo)。

SQL監(jiān)控:該數(shù)據(jù)源中執(zhí)行的SQL語句極其統(tǒng)計數(shù)據(jù)。在這個頁面上,我們可以很方便的看到當(dāng)前這個Spring Boot都執(zhí)行過哪些SQL,這些SQL的執(zhí)行頻率和執(zhí)行效率也都可以清晰的看到。如果你這里沒看到什么數(shù)據(jù)?別忘了我們之前創(chuàng)建了一個Controller,用這些接口可以觸發(fā)UserService對數(shù)據(jù)庫的操作。所以,這里我們可以通過調(diào)用接口的方式去觸發(fā)一些操作,這樣SQL監(jiān)控頁面就會產(chǎn)生一些數(shù)據(jù):

圖中監(jiān)控項上,執(zhí)行時間、讀取行數(shù)、更新行數(shù)都通過區(qū)間分布的方式表示,將耗時分布成8個區(qū)間:

  • 0 - 1 耗時0到1毫秒的次數(shù)
  • 1 - 10 耗時1到10毫秒的次數(shù)
  • 10 - 100 耗時10到100毫秒的次數(shù)
  • 100 - 1,000 耗時100到1000毫秒的次數(shù)
  • 1,000 - 10,000 耗時1到10秒的次數(shù)
  • 10,000 - 100,000 耗時10到100秒的次數(shù)
  • 100,000 - 1,000,000 耗時100到1000秒的次數(shù)
  • 1,000,000 - 耗時1000秒以上的次數(shù)

記錄耗時區(qū)間的發(fā)生次數(shù),通過區(qū)分分布,可以很方便看出SQL運(yùn)行的極好、普通和極差的分布。 耗時區(qū)分分布提供了“執(zhí)行+RS時分布”,是將執(zhí)行時間+ResultSet持有時間合并監(jiān)控,這個能方便診斷返回行數(shù)過多的查詢。

SQL防火墻:該頁面記錄了與SQL監(jiān)控不同維度的監(jiān)控數(shù)據(jù),更多用于對表訪問維度、SQL防御維度的統(tǒng)計。

該功能數(shù)據(jù)記錄的統(tǒng)計需要在spring.datasource.druid.filters中增加wall屬性才會進(jìn)行記錄統(tǒng)計,比如這樣:


spring.datasource.druid.filters=stat,wall

注意:這里的所有監(jiān)控信息是對這個應(yīng)用實例的數(shù)據(jù)源而言的,而并不是數(shù)據(jù)庫全局層面的,可以視為應(yīng)用層的監(jiān)控,不可能作為中間件層的監(jiān)控。

本系列教程《Spring Boot 2.x基礎(chǔ)教程》點擊直達(dá)!open in new window。學(xué)習(xí)過程中如遇困難,建議加入Spring技術(shù)交流群open in new window,參與交流與討論,更好的學(xué)習(xí)與進(jìn)步!

#代碼示例

本文的相關(guān)例子可以查看下面?zhèn)}庫中的chapter3-3目錄:

請登錄后查看

CRMEB 最后編輯于2025-02-25 15:08:54

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無簡介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
1368
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動態(tài) 精選推薦 首頁頭條 首頁動態(tài) 首頁推薦
取 消 確 定
回復(fù)
回復(fù)
問題:
問題自動獲取的帖子內(nèi)容,不準(zhǔn)確時需要手動修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊

切換手機(jī)號登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服