日期:2014-05-20  浏览次数:21105 次

jdbc循环连接、断开oracle的诡异问题,请教大家
今天遇到一个奇怪的问题,Oralce数据库,重复获取jdbc连接、再立刻关闭,循环200次左右,即抛出异常:

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:
10.72.4.190:1521:orcl

已换Oracle的jdbc驱动,结果还是一样,都抛出类似的异常。期间,也调整了oracle的process数目,但不起作用,因为我实际是在单线程环境中进行的测试。

现在的疑问:
1.为什么Oralce jdbc关闭连接的方法,并没有真正关闭掉连接。
2.在单线程中,应该怎么做,才能彻底关闭jdbc连接。


恳请各位达人帮忙解惑,谢谢。。。



附:测试代码

int i = 0;
Class.forName("oracle.jdbc.driver.OracleDriver");

while (true)
{
  Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@10.72.4.190:1521:orcl", "SYSTEM", "abc");
  conn.close();
  i++;
}



------解决方案--------------------
因为被关掉的 Connection 并没有被 Oracle 数据库马上回收,而是处于 TIME_WAIT 状态。

Windows 中使用 netstat -ano | find ":1521" 可以看到所有的 1521 端口连接,看看有没有 TIME_WAIT 状态的
Linux 中使用 netstat -anp | grep 1521 同 Windows 中一样

TIME_WAIT 状态需要过一会儿才会真正意义上的断开