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...