1. 問題描述
若日志報 ORA-12519 TNS:no appropriate service handler found,是數據庫連接失敗的錯誤,12519 錯誤是監聽不能提供服務。
2. 原因
原因是我們定義數據連接後,點擊連接時,此時會用掉一個連接池中的一個連接。
而在定義數據集後,點擊預覽按鈕,此時連接池就會分配連接,可能會使用之前那個連接(之前的連接已釋放),或分配一個其他的連接或新建一個連接。
若此時連接池所有連接都已用完,就會報如下錯誤:
當客戶請求數據庫連接時,首先是查看連接池中是否有空閑連接(指當前沒有分配出去的連接)。
假如存在空閑連接,則把連接分配給用戶,并作相應的處理(即标記該連接爲正在使用,引用計數加 1)。
假如沒有空閑連接,則查看當前所開的連接數是不是已經達到 maxConn(最大連接數),若沒達到就重新創建一個連接給請求的客戶;
若達到就按設定的 maxWaitTime(最大等待時間)進行等待;
若等待 maxWaitTime 後,仍沒有空閑連接,就抛出無空閑連接的異常給用戶。
3. 解決方案
若您在FR 連接池屬性 的設置中,已将最大連接數設置得過大,還出現如上的報錯,此時通常就是數據庫進程(processes)達到上限導緻的,可增大數據庫中的連接數目來解決此問題。如下在數據庫中修改最大連接數:
查看當前的連接數
select count(*) from V$process;
查看數據庫允許的最大連接數
select value from V$parameter where name='processes';
修改最大連接數爲1000
alter system set processes=1000 scope=spfile
重啓數據庫,再查詢最大連接數,數字改變就表示已修改成功。
說明:當客戶釋放數據庫連接時,先判定該連接的引用次數是否已超過規定值,假如超過就删除該連接,并判定當前連接池内總的連接數是否小於 minConn(最小連接數),若小於就将連接池布滿;假如沒超過就将該連接标記爲開放狀态,可供再次複用。可看出正是這套策略保證了數據庫連接的有效複用,避免頻繁地建立、釋放連接所帶來的系統資源開銷。