成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

“自以為對(duì)的”MyBatis空閑連接探測(cè)的機(jī)制

開(kāi)發(fā) 前端
POOLED– 這種數(shù)據(jù)源的實(shí)現(xiàn)利用“池”的概念將 JDBC 連接對(duì)象組織起來(lái),避免了創(chuàng)建新的連接實(shí)例時(shí)所必需的初始化和認(rèn)證時(shí)間。這種處理方式很流行,能使并發(fā) Web 應(yīng)用快速響應(yīng)請(qǐng)求。

 [[392379]]

最近碰到個(gè)現(xiàn)象,某個(gè)應(yīng)用,每天在21:00-23:00才會(huì)執(zhí)行,連接數(shù)據(jù)庫(kù)執(zhí)行操作,間隔性出現(xiàn)連接超時(shí)的錯(cuò)誤,

  1. Connection timed out (Read failed) 

因?yàn)閼?yīng)用和數(shù)據(jù)庫(kù)是跨網(wǎng)段,咨詢了下,防火墻超時(shí)時(shí)間配置的是30分鐘,應(yīng)用用的MyBatis連接池,相關(guān)配置如下,

相關(guān)參數(shù)解釋,如下所示,

POOLED– 這種數(shù)據(jù)源的實(shí)現(xiàn)利用“池”的概念將 JDBC 連接對(duì)象組織起來(lái),避免了創(chuàng)建新的連接實(shí)例時(shí)所必需的初始化和認(rèn)證時(shí)間。這種處理方式很流行,能使并發(fā) Web 應(yīng)用快速響應(yīng)請(qǐng)求。

除了上述提到UNPOOLED下的屬性外,還有更多屬性用來(lái)配置POOLED的數(shù)據(jù)源:

poolMaximumActiveConnections – 在任意時(shí)間可存在的活動(dòng)(正在使用)連接數(shù)量,默認(rèn)值:10

poolMaximumIdleConnections – 任意時(shí)間可能存在的空閑連接數(shù)。

poolMaximumCheckoutTime – 在被強(qiáng)制返回之前,池中連接被檢出(checked out)時(shí)間,默認(rèn)值:20000 毫秒(即 20 秒)

poolTimeToWait – 這是一個(gè)底層設(shè)置,如果獲取連接花費(fèi)了相當(dāng)長(zhǎng)的時(shí)間,連接池會(huì)打印狀態(tài)日志并重新嘗試獲取一個(gè)連接(避免在誤配置的情況下一直失敗且不打印日志),默認(rèn)值:20000 毫秒(即 20 秒)。

poolMaximumLocalBadConnectionTolerance – 這是一個(gè)關(guān)于壞連接容忍度的底層設(shè)置, 作用于每一個(gè)嘗試從緩存池獲取連接的線程。如果這個(gè)線程獲取到的是一個(gè)壞的連接,那么這個(gè)數(shù)據(jù)源允許這個(gè)線程嘗試重新獲取一個(gè)新的連接,但是這個(gè)重新嘗試的次數(shù)不應(yīng)該超過(guò) poolMaximumIdleConnections 與 poolMaximumLocalBadConnectionTolerance 之和。默認(rèn)值:3(新增于 3.4.5)

poolPingQuery – 發(fā)送到數(shù)據(jù)庫(kù)的偵測(cè)查詢,用來(lái)檢驗(yàn)連接是否正常工作并準(zhǔn)備接受請(qǐng)求。默認(rèn)是“NO PING QUERY SET”,這會(huì)導(dǎo)致多數(shù)數(shù)據(jù)庫(kù)驅(qū)動(dòng)出錯(cuò)時(shí)返回恰當(dāng)?shù)腻e(cuò)誤消息。

poolPingEnabled – 是否啟用偵測(cè)查詢。若開(kāi)啟,需要設(shè)置 poolPingQuery 屬性為一個(gè)可執(zhí)行的 SQL 語(yǔ)句(最好是一個(gè)速度非常快的 SQL 語(yǔ)句),默認(rèn)值:false。

poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的頻率。可以被設(shè)置為和數(shù)據(jù)庫(kù)連接超時(shí)時(shí)間一樣,來(lái)避免不必要的偵測(cè),默認(rèn)值:0(即所有連接每一時(shí)刻都被偵測(cè) — 當(dāng)然僅當(dāng) poolPingEnabled 為 true 時(shí)適用)。

P.S.

https://mybatis.org/mybatis-3/zh/configuration.html#environments

按照這字面意思,一開(kāi)始我們理解poolPingConnectionsNotUsedFor參數(shù)控制的是連接多久沒(méi)用,即處于空閑狀態(tài),在參數(shù)poolPingEnabled開(kāi)啟時(shí),就會(huì)執(zhí)行poolPingQuery定義的SQL主動(dòng)探測(cè)。

如果按照這理解,poolPingConnectionsNotUsedFor設(shè)置了3000,即3秒,遠(yuǎn)小于30分鐘防火墻超時(shí)的設(shè)置,不應(yīng)該出現(xiàn)連接超時(shí)的現(xiàn)象。

我們懷疑過(guò)防火墻的配置,但從應(yīng)用端看,并不是所有的請(qǐng)求都超時(shí),而且防火墻端,沒(méi)看到什么異常。數(shù)據(jù)庫(kù)層,應(yīng)該未設(shè)置過(guò)相關(guān)的配置。

原因是什么?

作為一款成熟的產(chǎn)品,不太可能因?yàn)閎ug,更多還是對(duì)他的理解存在偏差。

下載3.3.0的源碼,鏈接如下,

https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.3.0

搜索這幾個(gè)參數(shù)所在的文件,找到了PooledDataSource類(lèi),可以看到這三個(gè)參數(shù)都設(shè)置了初始值,

看下這個(gè)pingConnection方法,

如果連接未關(guān)閉,判斷邏輯如下,

1. poolPingConnectionsNotUsedFor的值>=0;

2. getTimeElapsedSinceLastUse()>poolPingConnectionsNotUsedFor;

getTimeElapsedSinceLastUse()定義如下,

lastUsedTimestamp是在構(gòu)造函數(shù)PooledConnection中定義的,

PooledConnection會(huì)在獲取連接(popConnection)和回收連接(pushConnection)的時(shí)候調(diào)用,獲取連接和回收連接則會(huì)被getConnection()和invoke()調(diào)用,因此,(2)的意思是當(dāng)前這個(gè)連接空閑的時(shí)間是否大于這個(gè)參數(shù)poolPingConnectionsNotUsedFor定義的時(shí)間。

3. 如果滿足條件(1)和(2),則會(huì)執(zhí)行poolPingQuery的SQL,此處就是"select 1 from dual",如果執(zhí)行失敗,會(huì)關(guān)閉這個(gè)連接,

從應(yīng)用日志,能看到這些信息,

  1. Testing connection 0000000000 ... 
  2. Execution of ping query 'select 1 from dual' failed:  Connection timed out (Read failed) 

這個(gè)問(wèn)題的關(guān)鍵,就是這個(gè)pingConnection,在什么時(shí)候調(diào)用,就決定了poolPingConnectionsNotUsedFor什么時(shí)候起作用,可以看到,他是在這個(gè)isValid的方法中調(diào)用的,

而這個(gè)isValid是在每次獲取連接和回收連接時(shí)調(diào)用的,換句話說(shuō),他是被動(dòng)調(diào)用,并不是我們認(rèn)為的空閑時(shí)主動(dòng)調(diào)用,所以這個(gè)應(yīng)用,只是晚上會(huì)跑,空閑連接超過(guò)30分鐘是很正常的,

應(yīng)用開(kāi)了debug,這兩段之間的間隔時(shí)間,就是得到超時(shí)連接的時(shí)間,

經(jīng)過(guò)單線程測(cè)試,大約在15分鐘,

因此,對(duì)這種testOnBorrow的連接探測(cè)機(jī)制,各有優(yōu)缺點(diǎn),優(yōu)點(diǎn)就是會(huì)在一定程度保證應(yīng)用正常的業(yè)務(wù)請(qǐng)求得到可用的連接,畢竟不可用的連接都已經(jīng)被poolPingQuery定義的SQL測(cè)試了,一般情況下,不會(huì)讓正常的業(yè)務(wù)請(qǐng)求出現(xiàn)報(bào)錯(cuò),除非連接池沒(méi)任何可用的連接。缺點(diǎn)就是如果配置的poolPingConnectionsNotUsedFor很小,某些請(qǐng)求都會(huì)在執(zhí)行之前先進(jìn)行驗(yàn)證,但是換個(gè)角度,如果是高并發(fā),只要參數(shù)不是0,一般可能都不會(huì)滿足需要驗(yàn)證的條件,如果設(shè)置為0,就可能會(huì)有很多pingQuery定義的SQL執(zhí)行。而且,如果像上述單線程的操作,他會(huì)一個(gè)連接一個(gè)連接的嘗試,等待一個(gè)連接出現(xiàn)超時(shí)錯(cuò)誤的時(shí)間間隔是15分鐘,這就很低效了。

對(duì)連接池的選擇和配置,確實(shí)得結(jié)合實(shí)際場(chǎng)景需求來(lái)決策。

通過(guò)這個(gè)問(wèn)題,至少讓我明白,“自以為對(duì)的”機(jī)制正確還是錯(cuò)誤,還是看他的實(shí)現(xiàn),這才是最可靠的驗(yàn)證,而且,通過(guò)他的邏輯,可以讓我們借鑒一些設(shè)計(jì)路徑,多考慮他這么做背后的意義和影響,更有助我們將其用到正確的場(chǎng)景。

 

責(zé)任編輯:武曉燕 來(lái)源: bisal的個(gè)人雜貨鋪
相關(guān)推薦

2017-08-17 17:09:28

PostgreSQL 數(shù)據(jù)塊機(jī)制

2009-07-23 08:40:37

VMware遷移備份歸檔

2020-07-23 10:00:50

AI 數(shù)據(jù)人工智能

2018-11-07 10:18:33

2009-06-18 14:51:12

Hibernate緩存Hibernate

2015-12-14 10:20:57

Python程序員錯(cuò)誤

2020-10-27 06:56:53

IoT產(chǎn)品實(shí)踐

2012-02-23 09:58:23

2024-03-04 10:00:35

數(shù)據(jù)庫(kù)處理機(jī)制

2010-10-08 10:42:30

2020-12-30 07:49:32

KubernetesJava Spring Clo

2011-04-07 14:29:56

2021-07-27 07:12:11

Getter接口Setter

2021-11-23 15:40:36

人工智能AI

2015-10-08 08:46:29

職業(yè)建議

2022-10-20 15:58:51

人工智能研究

2025-01-02 14:50:34

MyBatis開(kāi)發(fā)緩存

2021-08-16 11:26:07

物聯(lián)網(wǎng)工業(yè) 4.0IoT

2011-07-18 08:57:13

MySQLwait_timeouDBCP

2010-10-26 17:17:37

創(chuàng)建ORACLE索引
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 蜜桃视频成人 | 九色网址| 日本综合在线观看 | 欧美成人一区二区 | 日本久久精品视频 | 国产免费xxx| 国产精品1区 | 国产在线永久免费 | 欧美一区二区三区视频 | 欧美成人免费电影 | 国产在线播放一区二区三区 | 日韩二三区 | 国产欧美一区二区三区久久 | 精品欧美一区二区三区久久久小说 | 欧美一区二区免费 | 美女国内精品自产拍在线播放 | 国产精品一级 | 日韩a v在线免费观看 | 久久久久成人精品免费播放动漫 | 精品国产欧美一区二区三区成人 | 国产免费一区二区三区免费视频 | 亚洲精品视频在线播放 | 99久久久久久久 | 成人免费一区二区三区视频网站 | 国产精品自在线 | 亚洲综合色 | 五月激情综合 | 最新国产精品视频 | 亚洲成人黄色 | 欧美成人一级 | 国产最新精品视频 | 99re热这里只有精品视频 | 国产成人精品网站 | 一区视频| 99热在线播放 | 亚洲免费在线观看 | 中文字幕不卡在线观看 | 全免费a级毛片免费看视频免费下 | 国产精品亚洲一区二区三区在线观看 | 一区二区三区四区av | 亚洲欧美在线观看 |