从连接池获取连接时出现Got minus one from a read call异常
本帖最后由 liuwei_blog 于 2010-11-29 15:50:49 编辑 在测试中
如果只有一个方法连接数据库,准失败抛出Got minus one from a read call异常。
如果有2个方法查询数据库,通常第一个方法失败抛出Got minus one from a read call异常,第二个方法成功。
JDBC 基本正常,偶尔也会抛出Got minus one from a read call异常,几率很小。
怀疑主要是连接池的问题,数据库可能也有问题,连接池配置如下:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@192.168.0.100:1521:orcl</value>
</property>
<property name="username">
<value>user</value>
</property>
<property name="password">
<value>123456</value>
</property>
<property name="initialSize">
<value>10</value>
</property>
<property name="maxActive">
<value>600</value>
</property>
<property name="maxIdle">
<value>100</value>
</property>
<property name="minIdle">
<value>1</value>
</property>
<property name="maxWait">
<value>6000</value>
</property>
<property name="timeBetweenEvictionRunsMillis">
<value>200</value>
</property>
<property name="minEvictableIdleTimeMillis">
<value>3000</value>
</property>
<property name="numTestsPerEvictionRun">
<value>1</value>
</property>
<property name="validationQuery">
<value>select sysdate from dual</value>
</property>
<property name="testOnBorrow">
<value>false</value>
</property>
<property name="testOnReturn">
<value>false</value>
</property>
<property name="testWhileIdle">
<value>false</value>
</property>
</bean>
报错信息如下:
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Error preloading the connection pool
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:241)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:336)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:102)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)
at com.ihandy.yuncai.studio.service.studio.impl.PortfolioInfoServiceImpl$$EnhancerByCGLIB$$ae8171ec.selectPortfolioByTypeId(<generated>)
at com.ihandy.yuncai.studio.service.studio.PortfolioInfoServiceTest.testselectPortfolioByTypeId(PortfolioInfoServiceTest.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.commons.dbcp.SQLNestedException: Error preloading the connection pool
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1238)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:203)
... 29 more
Caused by: java.sql.SQLException: Io 异常: Got minus one from a read call
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:404)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:468)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:314)
at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294)
at org.apache.commons.pool.impl.GenericObjectPool.addObject(GenericObjectPool.java:1617)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1235)
... 31 more
[解决办法]
这一段没什么问题,关键你Exception都能看错,明明是不能创建连接Exception
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Error preloading the connection pool
你第一次调用肯定抛Exception,然后才开始创建连接,没等关闭呢,又调用,当然没问题了
[解决办法]
你看看sqlnet.ora 文件,有没有添加IP限制,监听日志里面有没有错误信息。
[解决办法]
还有不知道你那边什么情况,plsql是否能连的上,如果plsql能连上,那你看看你的jdbc驱动有没有问题,最好用oracle安装目录里的
[解决办法]
sqlnet.ora 里只有一句:
#SQLNET.AUTHENTICATION_SERVICES= (NTS)
还是注释掉的...........
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
tcp.validnode_checking=no
你把这两个加上试试