IO Error: 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
 

 

你可能感兴趣的:(异常)