我想知道是否有人能对这个话题有所了解,因为我已经绞尽脑汁好几天了,不太明白为什么这个问题行不通。我有三个类-- main、RetrieveDBVersion、GetOracleConnection --我一直在用oracle JDBC、UCP和Java1.7进行一些测试。根据Oracle文档,如果我使用连接池,当我关闭连接、使其失效并将其设置为空看这里时,连接将立即返回到池中。所以我决定让它旋转一下,看看它是否会像文档所说的那样执行。在我的主要应用程序中,我有一个简单的循环,它通过调用RetrieveDBVersion进行200次连接。RetrieveDBVersion只是执行一个查询并返回驱动程序版本。我的循环工作正常,直到我达到了神奇的68,然后我收到一个错误状态
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速递数据库,而我正在从我的桌面上运行它们。为什么我要继续犯这个错误?如果我要把连接送回游泳池呢?
发布于 2017-04-22 03:49:07
因此,在小心之后,从Oracle论坛得到一些额外的帮助。我终于理解了为什么上面引用的代码会给出我正在接收的错误消息。请看这里的答复,因为每次循环运行时,我都会设置数据源,实际上我创建了多个池。这样做的方法是创建一个池,而不是从该池中拉出连接。替换GetOracleConnection的新代码,我为数据源创建了一个单例类,在代码中,我只是从数据源中检索连接,如下所示
Connection conn = Database.getInstance().GetPoolSource().getConnection();
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;
}
}https://stackoverflow.com/questions/43530326
复制相似问题