1、EF 、EFCore 中默認存在鏈接池,每次數據庫操作完成之後,會將連接丟到連接池。連接的釋放過程單獨管控(這裏不做詳細解釋);
2、當Oracle數據庫中設置有連接(會話)有效期時,到期後,Oracle服務端會中斷連接,並將會話標識為:SNIPED狀態;
註:查詢數據中已超時,未釋放的會話:select * from v$session where status = 'SNIPED';
3、當Oracle數據庫中連接超時後,EF連接池中的連接依然存在,若再次進行數據庫操作,則會提示 idle 超時異常;
解決方案:
方案1:調整數據庫設置,將數據庫中的“IDLE_TIME”設置未“UNLIMITED”,具體方式請自行百度;
可通過以下語句查看當前設置:
select username, b.* from dba_users a, dba_profiles b where a.profile = b.profile and username='IOT_SUB_ALL';
方案2:
在項目代碼數據庫連接字符串中添加:min pool size=0;設置,將EF連接池最小連接保持數設置為0(默認為1);
連接字符串樣式:
"User Id=用戶id;Password=密碼;Data Source=IP:端口/服務器名;min pool size=0;"
連接字符串參數詳細說明見:
/database/121/ODPNT/OracleConnectionClass.htm#ODPNT805