在部署應用的時候,有時候應用能夠直接啓動,但偶爾應用卻沒法啓動,報錯信息是:
java.sql.SQLRecoverableException: IO Error: Got minus one from a read calljava
我有好幾個應用系統須要鏈接數據庫,測試發現若是這個應用在最開始啓動就不會報錯,若是是啓動了好幾個應用以後再啓動的話就會報錯了。
一個應用鏈接數據庫的時候是經過鏈接池的機制來鏈接的,數據庫用一個參數max-session來描述鏈接池的大小,而應用一樣也有一個參數,這個參數表示它鏈接數據庫鏈接池所佔用的最少資源,例如:總共有10個應用須要鏈接數據庫,若是每一個應用鏈接數據庫的最小鏈接數爲10,那麼10個應用總共會有100個鏈接(能夠看作是線程數),這樣就要求數據庫鏈接池的max-session必須大於100,不然就會報「 Got minus one from a read call」的錯誤。
所以,有兩種方法能夠解決這個問題:
(1)擴大數據庫鏈接池,這個須要系統數據庫管理員來協助完成
(2)減少應用鏈接數據庫時須要的初始化鏈接數
個人這個應用是java應用,關於數據庫的設置在配置文件jdbc.properties裏面,內容以下:sql
jdbc.driverClass=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@nantianpaydb.baidupay.com:8002:ntpzn jdbc.user=cif jdbc.password=cif #druid datasource druid.initialSize=10 druid.minIdle=10 druid.maxIdle=100 druid.maxActive=500 druid.maxWait=30000 druid.timeBetweenEvictionRunsMillis=60000 druid.minEvictableIdleTimeMillis=300000 druid.validationQuery=SELECT 1 from dual druid.testWhileIdle=true druid.testOnBorrow=false druid.testOnReturn=false druid.poolPreparedStatements=true druid.maxPoolPreparedStatementPerConnectionSize=20 druid.filters=wall,stat
其中數據庫
druid.initialSize=10
就是一個應用鏈接數據庫的初始化參數,只要將之調小便可解決問題。session