写了一段代码想测试连接池的效率。发现在没有使用连接池的情况下对数据库执行100次连接查询的时候,就会报ORA-12519(TNS:no appropriate service handler found),并发连接数过大。而使用连接池就不会报错。疑问的是:我在不使用连接池进行每一次连接数据表查询时,都会及时关闭流,应该是每次都释放连接的吧(也就是用了一个连接就释放一个连接,下次循环再开一个连接,那这样连接数不都应该一直是1个吗),而且没有写多线程代码呀,为什么存在并发连接?这么循环操作后为什么还会得不到连接呢?
代码块如下:
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String username ="system";
String password = "admin";
startTime = System.currentTimeMillis();
for(int i=0;i<100;i++){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
Connection conn = DriverManager.getConnection(url,username,password);
Statement stmt = conn.createStatement();//创建陈述对象
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
//执行指定代码段
}
rs.close();
stmt.close();
conn.close();
}
System.out.println("经过100次循环调用,不使用连接池所花费的时间为"+(System.currentTimeMillis()-startTime)+"ms");报错信息:
Exception in thread "main" java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
The Connection descriptor used by the client was:
127.0.0.1:1521:xe at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at ConnectionPoolTest.main(ConnectionPoolTest.java:50)

解决方案 »

  1.   

    同一时间超过最大值连接数.SELECT * FROM v$resource_limit s WHERE s.RESOURCE_NAME='processes';
    查看processes数量是否达到最大进程数了,如果是的话,需要增大processes值。
    alter system set processes=300 scope=spfile;
      

  2.   

    我想知道的是为什么?都已经在每个循环里面释放了资源,在同一时刻,连接数不应该是1么 ?既然是1个连接,为什么会达到最大值?就一个main主线程 哪里来的并发?
      

  3.   

    在conn.close后面加上这句conn.Dispose();试试
      

  4.   

    因为被关掉的 Connection 并没有被 Oracle 数据库马上回收,而是处于 TIME_WAIT 状态。Windows 中使用 netstat -ano | find ":1521" 可以看到所有的 1521 端口连接,看看有没有 TIME_WAIT 状态的
    Linux 中使用 netstat -anp | grep 1521 同 Windows 中一样TIME_WAIT 状态需要过一会儿才会真正意义上的断开