首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle JDBC UCP和Java

Oracle JDBC UCP和Java
EN

Stack Overflow用户
提问于 2017-04-20 21:35:16
回答 1查看 4K关注 0票数 0

我想知道是否有人能对这个话题有所了解,因为我已经绞尽脑汁好几天了,不太明白为什么这个问题行不通。我有三个类-- mainRetrieveDBVersionGetOracleConnection --我一直在用oracle JDBC、UCP和Java1.7进行一些测试。根据Oracle文档,如果我使用连接池,当我关闭连接、使其失效并将其设置为空看这里时,连接将立即返回到池中。所以我决定让它旋转一下,看看它是否会像文档所说的那样执行。在我的主要应用程序中,我有一个简单的循环,它通过调用RetrieveDBVersion进行200次连接。RetrieveDBVersion只是执行一个查询并返回驱动程序版本。我的循环工作正常,直到我达到了神奇的68,然后我收到一个错误状态

代码语言:javascript
复制
java.sql.SQLException: Exception occurred while getting connection:  
oracle.ucp.UniversalConnectionPoolException:    
Cannot get Connection from Datasource: java.sql.SQLException: 
Listener refused the connection with the following error:
ORA-12516, TNS:listener could not find available handler with matching protocol stack

这些都是三种方法的细节。这些方法不在服务器环境中。他们只是在调用本地的oracle速递数据库,而我正在从我的桌面上运行它们。为什么我要继续犯这个错误?如果我要把连接送回游泳池呢?

  1. 导入com.jam.DB.JDBCVersion;导入静态java.lang.System.out;公共类MainApp {公共静态空(String[] args) { String myMainJDBCVar;尝试{ for(int i=1;i<200;i++ ){ myMainJDBCVar= JDBCVersion.RetrieveDBVersion();out.println(myMainJDBCVar +“”+ i);}out.println(“完成此操作!”);} System.out.println(e.getMessage());}
  2. RetrieveDBVersionimport java.sql.*;导入oracle.ucp.jdbc.ValidConnection;公共类JDBCVersion {公共静态字符串DBVersion;公共静态字符串RetrieveDBVersion()抛出SQLException { Connection conn = JDBCConnection.GetOracleConnection("test");尝试{ DatabaseMetaData meta = conn.getMetaData();//get驱动程序信息System.out.println("JDBC驱动程序版本为“+ meta.getDriverMajorVersion());DBVersion = meta.getDriverVersion();} catch (SQLException e) { e.printStackTrace();DBVersion = e.getMessage();}最后{System.out.println(“命中最后子句”);((ValidConnection) conn).setInvalid();conn.close();conn=null;}返回DBVersion;}
  3. pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");oracle.ucp.jdbc.PoolDataSource;GetOracleConnectionimport oracle.ucp.jdbc.PoolDataSource;import java.sql.*;public类JDBCConnection { public静态连接GetOracleConnection(String Enviroment)抛出SQLException{ PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();Connection conn = null;//ora.defaultConnection();尝试{GetOracleConnectionimport pds.setURL("jdbc:oracle:thin:@//localhost:1521/xe");pds.setUser("system");//pds.setInitialPoolSize(5);pds.setPassword("xxx");pds.setMaxStatements(10);conn = pds.getConnection();返回conn;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-22 03:49:07

因此,在小心之后,从Oracle论坛得到一些额外的帮助。我终于理解了为什么上面引用的代码会给出我正在接收的错误消息。请看这里的答复,因为每次循环运行时,我都会设置数据源,实际上我创建了多个池。这样做的方法是创建一个池,而不是从该池中拉出连接。替换GetOracleConnection的新代码,我为数据源创建了一个单例类,在代码中,我只是从数据源中检索连接,如下所示

Connection conn = Database.getInstance().GetPoolSource().getConnection();

代码语言:javascript
复制
package com.jam.DB;

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;

public class Database {

private static Database dbIsntance;
private static PoolDataSource pds;

private Database() {
    // private constructor //
}

public static Database getInstance() {
    if (dbIsntance == null) {
        dbIsntance = new Database();
    }
    return dbIsntance;
}

public PoolDataSource GetPoolSource() {

    if (pds == null) {
        pds = PoolDataSourceFactory.getPoolDataSource();

        try {

            pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
            pds.setURL("jdbc:oracle:thin:@//localhost:1521/xe");
            pds.setUser("system");
            pds.setPassword("xxxx");
            pds.setMaxStatements(15);
            return pds;

        } catch (Exception e) {

        }
        return pds;
    }

    return pds;

  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43530326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档