【发布时间】:2019-08-14 08:05:21
【问题描述】:
我想知道是否有人可以对这个话题有所了解,因为我已经绞尽脑汁好几天了,不太明白为什么这不起作用。我有三个班
main, RetrieveDBVersion,GetOracleConnection 我一直在使用 oracle JDBC、UCP 和 Java 1.7 进行一些测试。
根据 Oracle 文档,如果我使用连接池,则连接将在我关闭连接后立即返回到池中,使其无效并将其设置为 null See Here。所以我决定试一试,看看它是否会像文档所说的那样运行。在我的主应用程序中,我有一个简单的循环,它通过调用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
这些是 3 种方法的详细信息。这些方法不在服务器环境中。他们只是调用本地 oracle express 数据库,而我正在从桌面运行它们。为什么我会不断收到此错误?如果我将连接返回到池中?
-
主要
import com.jam.DB.JDBCVersion; import static java.lang.System.out; public class MainApp { public static void main(String[] args) { String myMainJDBCVar; try{ for(int i=1; i<200; i++ ) { myMainJDBCVar= JDBCVersion.RetrieveDBVersion(); out.println(myMainJDBCVar + " " + i); } out.println("this is Done!"); } catch (Exception e) { System.out.println(e.getMessage()); } } } -
检索DBVersion
import java.sql.*; import oracle.ucp.jdbc.ValidConnection; public class JDBCVersion { public static String DBVersion; public static String RetrieveDBVersion()throws SQLException { Connection conn = JDBCConnection.GetOracleConnection("test"); try { DatabaseMetaData meta = conn.getMetaData(); //get driver info System.out.println("JDBC driver version is " + meta.getDriverMajorVersion()); DBVersion = meta.getDriverVersion(); } catch (SQLException e) { e.printStackTrace(); DBVersion = e.getMessage(); } finally { System.out.println("hit the finally clause"); ((ValidConnection) conn).setInvalid(); conn.close(); conn=null; } return DBVersion; } -
获取Oracle连接
import oracle.ucp.jdbc.PoolDataSource; import oracle.ucp.jdbc.PoolDataSourceFactory; import java.sql.*; public class JDBCConnection { public static Connection GetOracleConnection(String Enviroment) throws SQLException{ PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource(); Connection conn = null; //ora.defaultConnection(); try { pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); pds.setURL("jdbc:oracle:thin:@//localhost:1521/xe"); pds.setUser("system"); //pds.setInitialPoolSize(5); pds.setPassword("xxx"); pds.setMaxStatements(10); conn = pds.getConnection(); return conn; } catch(Exception e){ e.printStackTrace(); } return conn; }
【问题讨论】:
-
您有三个类,分别称为
Main()、RetrieveDBVersion()和GetOracleConnection()???为什么在 class 名称之后有()?还是您的意思是方法?如果是这样,那么 Java 命名约定规定方法名称应以小写字母开头。哦,您的main()方法名称确实以小写字母开头。 -
为什么您要继续使连接失效?此外,设置为 null 对逻辑没有影响。而且您应该只设置一次
DataSource。谁知道当你不断重新配置数据源时会发生什么。 -
我的意思是三个方法,每个都在一个类中。很抱歉造成混乱
-
@Andreas,我正在尝试在具有许多用户的服务器上模拟连接,并尝试证明池的工作原理。
-
为什么
RetrieveDBVersion()使用static字段,而不是局部变量。非常糟糕的逻辑。