Mybatis自帶連線池原始碼解析

2021-10-06 17:26:34 字數 3969 閱讀 4780

poolmaximumactiveconnections

連線池最大活躍連線數,預設為10個。

poolmaximumidleconnections

連線池最大空閒連線數,預設為5個。

poolmaximumcheckouttime

最大可**時間,當活躍連線數達到上限時,如果此時有連線請求,則會檢查當前活躍連線列表中最早的那個連線是否超過這個時間,預設為20s。

pooltimetowait

連線數滿了,也沒有連線超時,當前連線等待這個時間後,再重新嘗試獲取連線,預設為20s。

idleconnections

空閒連線數,這是乙個list集合。

list

idleconnections =

newarraylist

<

>

()

activeconnections

活躍連線數,這是乙個list集合。

list

activeconnections =

newarraylist

<

>()

;

獲取連線

private pooledconnection popconnection

(string username, string password)

throws sqlexception

}else

}else

catch

(sqlexception e)

will be set as null.

*/log.

debug

("bad connection. could not roll back");

}}//建立新的連線

conn =

newpooledconnection

(oldestactiveconnection.

getrealconnection()

,this);

conn.

setcreatedtimestamp

(oldestactiveconnection.

getcreatedtimestamp()

);conn.

setlastusedtimestamp

(oldestactiveconnection.

getlastusedtimestamp()

);oldestactiveconnection.

invalidate()

;if(log.

isdebugenabled()

)}else

if(log.

isdebugenabled()

)long wt = system.

currenttimemillis()

;//等待指定時間,獲取被歸還連線時喚醒

state.

wait

(pooltimetowait)

; state.accumulatedwaittime += system.

currenttimemillis()

- wt;

}catch

(interruptedexception e)}}

}if(conn != null)

conn.

setconnectiontypecode

(assembleconnectiontypecode

(datasource.

geturl()

, username, password));

conn.

setcheckouttimestamp

(system.

currenttimemillis()

);conn.

setlastusedtimestamp

(system.

currenttimemillis()

);//把當前連線放入活躍連線列表中

state.activeconnections.

add(conn)

; state.requestcount++

; state.accumulatedrequesttime += system.

currenttimemillis()

- t;

}else

state.badconnectioncount++

; localbadconnectioncount++

; conn = null;

//如果當前重新獲取連線的次數,超過了poolmaximumidleconnections+poolmaximumlocalbadconnectiontolerance,則直接丟擲異常。

if(localbadconnectioncount >

(poolmaximumidleconnections + poolmaximumlocalbadconnectiontolerance)

)throw

newsqlexception

("pooleddatasource: could not get a good connection to the database.");

}}}}

}if(conn == null)

throw

newsqlexception

("pooleddatasource: unknown severe error condition. the connection pool returned a null connection.");

}return conn;

}

歸還連線

protected

void

pushconnection

(pooledconnection conn)

throws sqlexception

pooledconnection newconn =

newpooledconnection

(conn.

getrealconnection()

,this);

//新增到空閒連線佇列中

state.idleconnections.

add(newconn)

; newconn.

setcreatedtimestamp

(conn.

getcreatedtimestamp()

);newconn.

setlastusedtimestamp

(conn.

getlastusedtimestamp()

);conn.

invalidate()

;if(log.

isdebugenabled()

)//喚醒wait的執行緒,可以重新獲取連線

state.

notifyall()

;}else

conn.

getrealconnection()

.close()

;if(log.

isdebugenabled()

) conn.

invalidate()

;}}else

state.badconnectioncount++;}

}}

獲取連線流程圖

歸還連線

go redis 連線池原始碼分析

1 建立連線和關閉連線 2 池子裡面取conn的管理 3 監控統計 4 整個pooler池子的關閉 結構體type connpool struct 池子裡面空閒的conn的同步channel connsmu sync.mutex conns conn 活躍的active conns idleconn...

mybatis連線池原理

補充說明 1.pooleddatasourc中包含乙個poolstate物件,這個物件包含了兩個集合,idleconnections 儲存連線池中空閒的執行緒 activeconnections 儲存連線池中活動的執行緒 2.建立新執行緒 pooledconnection conn new pool...

mybatis的連線池 事務

一 連線池 資料庫連線池負責分配,管理,釋放資料庫連線 實際開發中一般都會使用連線池,可以減少獲取連線所消耗的時間 mybatis 中資料來源的配置我們的資料來源配置就是在 sqlmapconfig.xml 檔案中 type pooled name driver value name url val...