有相当长的一段时间没用oracle了,这两天兴趣来潮,安装了oracle11g,打开eclipse,写了一个jdbc的小应用,也不算什么应用,就是往指定的表里面插入大量数据而已,同时想在数据插入的时候,在cmd窗口,查询已插入的记录数。在运行前,先打开cmd窗口连接上oracle,接着启动应用,在第一个insert语句那里,就停止不动了,反复测试几次,发现还是老样子,debug一下,inspect发现pst.execute()有一个Exception,如下所示:"pst.execute()"
com.sun.jdi.VMDisconnectedException:GotIOException from Virtual Machine occurred invoking method.
后来发现并不是停止不动,而是处于阻塞状态。搜索了一个该异常,有朋友说是“端口冲突”,奇怪了,但这时把cmd的连接窗口退出来,应用就能够继续运行(看来真是端口冲突),接着再用cmd连接oracle,应用就彻底抛出异常,停止不动了。ORA-12519, TNS:no appropriate service handler found
The Connection descriptor used by the client was:
localhost:1521:orcl
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:280)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:319)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:344)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:148)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:545)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:221)
at dbconnection.oracle.OracleConnection.getConnection(OracleConnection.java:36)
at memcachedtest.jd.RoleDao.insert(RoleDao.java:19)
at memcachedtest.jd.RoleService.insert(RoleService.java:10)
at memcachedtest.jd.RoleService.main(RoleService.java:59)
Exception in thread "main" java.lang.NullPointerException
at memcachedtest.jd.RoleDao.insert(RoleDao.java:21)
at memcachedtest.jd.RoleService.insert(RoleService.java:10)
at memcachedtest.jd.RoleService.main(RoleService.java:59)
把oracle默认连接数由150改为1000之后,还是这种情况,只要cmd连接着oracle,该jdbc应用就运行不正常。有点奇怪了,以前用oracle的时候,都是一边用应用连接着oracle,同时用cmd或plus/sql连接(还开几个连接呢),并没有出现过这种所谓端口冲突的情况啊,不解,希望各位解释一下,谢谢了。

解决方案 »

  1.   

    你用cmd连接完数据库之后用一下的命令查看一下端口1521被占用了吗。
    如果被占用,再调用,就会出现你说的这种情况啊
    netstat -a
      

  2.   

    今天重启了机器,发现用cmd连接数据库之后,jdbc应用也可以照样运行,也就是不存在所谓的端口冲突现象了。但之前为什么用cmd连接之后,jdbc应用再连接就不能操作数据库呢?如果是端口冲突,我觉得用不用cmd连接,jdbc应用都不能正常工作的。1521是监听器监听的端口,假设存在端口冲突,某个进程把1521给占用了,那监听器可能都不能运行了,更别说用jdbc连接数据库,或是用cmd连接数据库了,疑惑中,求解释
      

  3.   

    你的整个过程说的不是很清楚,估计是INSERT后没有COMMIT,表被锁了,
    当程序终止后,释放锁
      

  4.   


    自动commit的。现在重现不了该现象,可能是跟阿冷说的那样,改天再深入看看,结账,thanks.