日期:2014-05-16  浏览次数:20469 次

关于一个数据库连接会报错ORA-12519(TNS:no appropriate service handler found)的问题的解答 不吐不快
下面的是这个网站我回答的博客的原文:写了一段代码想测试连接池的效率。发现在没有使用连接池的情况下对数据库执行100次连接查询的时候,就会报ORA-12519(TNS:no appropriate service handler found),并发连接数过大。而使用连接池就不会报错。疑问的是:我在不使用连接池进行每一次连接数据表查询时,都会及时关闭流,应该是每次都释放连接的吧(也就是用了一个连接就释放一个连接,下次循环再开一个连接,那这样连接数不都应该一直是1个吗),而且没有写多线程代码呀,为什么存在并发连接?这么循环操作后为什么还会得不到连接呢?
代码块如下:
Java代码
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)


------------------------------------------
问题补充:

neitheraaa 写道
试试吧  这个东西不好说 实际上你是释放了资源 但是由于你连接释放的只是你这个层面上的 真正的oracle设置项中的 数值太小 

我想知道的是 难道我这么写的代码不是连接数失踪保持为1个连接的吗?因为我每次连接都释放了资源啊 如果真是自由一个连接的话?如何来的并发连接 ?就一个main主线程,哪里来的并发环境
--------------------------------------------
该问题已经关闭: 吞吞吐吐

我今天上网来看了看 是不是真的一定会出现这个问题,wo 把代码拷贝过来试了一下 首先不说代码的质量问题 有点垃圾,这个在我的电脑上运行就是没有问题的 这个说明什么呢一定是oracle的配置项问题 参数的修改 ,我倒是没有别的意思 只是请这位仁兄能不能不要这么心浮气躁,这样能写出好的程序,解决问题嘛;我总结出来出现问题解决要分析可能出现的问题 ,大致找出解决的方向,至少是排查的方向,这样才能真正的学到解决问题的方法和思路。谢谢读者听我唠叨  有问题留言!肖辉 neitheraaa@126.com