報“ Got minus one from a read call”的錯誤


在部署應用的時候,有時候應用可以直接啟動,但偶爾應用卻無法啟動,報錯信息是:
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

就是一個應用連接數據庫的初始化參數,只要將之調小即可解決問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM