在部署應用的時候,有時候應用可以直接啟動,但偶爾應用卻無法啟動,報錯信息是:
java.sql.SQLRecoverableException: IO Error: Got minus one from a read call
原因及解決方法
我有好幾個應用系統需要連接數據庫,測試發現如果這個應用在最開始啟動就不會報錯,如果是啟動了好幾個應用之后再啟動的話就會報錯了。
一個應用連接數據庫的時候是通過連接池的機制來連接的,數據庫用一個參數max-session來描述連接池的大小,而應用同樣也有一個參數,這個參數表示它連接數據庫連接池所占用的最少資源,例如:總共有10個應用需要連接數據庫,如果每個應用連接數據庫的最小連接數為10,那么10個應用總共會有100個連接(可以看做是線程數),這樣就要求數據庫連接池的max-session必須大於100,否則就會報“ Got minus one from a read call”的錯誤。
因此,有兩種方法可以解決這個問題:
(1)擴大數據庫連接池,這個需要系統數據庫管理員來協助完成
(2)減小應用連接數據庫時需要的初始化連接數
我的這個應用是java應用,關於數據庫的設置在配置文件jdbc.properties里面,內容如下:
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
其中
druid.initialSize=10
- 1
就是一個應用連接數據庫的初始化參數,只要將之調小即可解決問題。