出現這個問題的原因是數據庫對空閑的連接時間做了限制。
1.SELECT name, value FROM gv$parameter WHERE name = 'resource_limit'; 使用該sql查詢是否啟用了限制,如果結果是true,說明已啟用。
2.select username,PROFILE from dba_users where username='?'; 如果1中的結果是true,查詢相關的profile:問號的位置填寫連接數據庫的賬戶(username),注意大小寫。查詢出該賬戶關聯的profile,通常結果為“DEFAULT”.
3.select RESOURCE_NAME,LIMIT from dba_profiles where profile='DEFAULT' and resource_name='IDLE_TIME'; 如果2中執行的結果不是DEFAULT,那么修改sql中的DEFAULT為實際的profile值。
4.根據3中的結果可以看到時間限制的值,這個值需要比應用使用的數據庫連接池的空閑時間要長。如果不想做限制,可以直接使用sql取消限制:alter profile default limit idle_time unlimited;
問題解決。
參考文檔:
1.ORA-02396: exceeded maximum idle time — oracle-tech
一般為了防止過多活動的session占用資源,可以對允許連接到數據庫的session個數,已連接到數據庫的session空閑時間等進行限制(當然也可以對嘗試連接次數等其它很多內容進行限制)。方式就是可以通過創建一個profile配置,然后將這個profile配置賦給每個用戶。
要使用這種限制的前提是將resource_limit這個參數設置為TRUE。
alter system set RESOURCE_LIMIT=true;
創建用戶時如果未指定具體profile,會有一個默認的profile,名稱是DEFAULT,如下所示:
SELECT * FROM dba_profiles WHERE PROFILE='DEFAULT';
這是這個名稱為DEFAULT的所有配置項參數。
其中IDLE_TIME就是一個session連上Oracle后不做任何事情,掛在那里的空閑時間。DEFAULT默認所有的參數都是UNLIMITED,也就是無限制。
但也可以對其進行修改。例如創建一個名稱為idletime_profile的profile,並指定其中idle_time參數值是1,單位是分鍾。
SQL> create profile idletime_profile limit idle_time 1;
Profile created.
並將該profile賦給用戶bisal
SQL> alter user bisal profile idletime_profile;
User altered.
這樣當用bisal登錄到Oracle后,持續1分鍾不干事,再次執行某個操作時就會報ORA-02396: exceeded maximum idle time, please connect agai