在使用连接字符串进行Oracle JDBC连接时,我遇到了非常奇怪的错误。我将用户名命名为“sys”(应该是sys作为sysdba),理想情况下,它应该通过ojdbc6.jar提供,但在我的例子中,它来自mysql-连接器-java-8.0.11.jar,它也包含在我的项目中。请帮忙,因为我必须把两个罐子都放在我的项目里。
当我删除mysql-连接器-java-8.0.11.jar时,我会得到下面提到的预期的oracle错误。
private static Connection createConnectionOracle() {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@ (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.151)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))","sys","sys");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}实际结果:
java.sql.SQLNonTransientConnectionException: Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the main URL sections.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:108)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:71)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:79)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:131)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:231)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at com.dataguise.discoverAgent.util.Test.createConnectionOracle(Test.java:399)
at com.dataguise.discoverAgent.util.Test.main(Test.java:29)
Caused by: com.mysql.cj.exceptions.UnableToConnectException: Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the main URL sections.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:59)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:103)
... 5 more
Caused by: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the main URL sections.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:59)
at com.mysql.cj.conf.ConnectionUrlParser.parseConnectionString(ConnectionUrlParser.java:139)
at com.mysql.cj.conf.ConnectionUrlParser.<init>(ConnectionUrlParser.java:129)
at com.mysql.cj.conf.ConnectionUrlParser.parseConnectionString(ConnectionUrlParser.java:118)
at com.mysql.cj.conf.ConnectionUrl.getConnectionUrlInstance(ConnectionUrl.java:179)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:201)
... 4 more预期结果:
ava.sql.SQLException: ORA-28009: connection as SYS should be as SYSDBA or SYSOPER
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:389)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:382)
at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:600)
at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:445)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:380)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:760)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at com.dataguise.discoverAgent.util.Test.createConnectionOracle(Test.java:399)
at com.dataguise.discoverAgent.util.Test.main(Test.java:29)发布于 2019-08-09 11:35:10
此错误发生在MySQL连接器/J8版本8.0.11或更高版本(以及从未发布的MySQL连接器/J6版本)中。您需要升级到8.0.12或更高版本(最新版本为8.0.17,参见https://dev.mysql.com/downloads/connector/j/)。
当应用程序试图通过JDBC驱动程序连接到非MySQL数据库时,Connector/J碰巧也在类路径上,Connector/J抛出了一个SQLNonTransientConnectionException,从而阻止了应用程序连接到其数据库。使用此修复方法,Connector/J在连接字符串不以jdbc:mysql:或mysqlx:开始时返回null,因此对非MySQL数据库的连接不会被阻塞。(Bug #26724154,Bug #87600)
另见https://bugs.mysql.com/bug.php?id=87600
作为背景,通常情况下,不支持特定URL的JDBC驱动程序(例如基于jdbc:之后的子协议)应该返回null,并且只有当URL为驱动程序时才会引发异常,但是URL或创建连接有问题。
但是,即使在MySQL连接器/J驱动程序中存在此错误,您仍然能够连接到Oracle数据库,因为DriverManager将尝试每个驱动程序,直到它能够打开连接为止。如果没有驱动程序能够连接,它将抛出由任何驱动程序引发的第一个异常,或者--如果所有驱动程序返回null --它将抛出“找不到合适的驱动程序”。
在本例中,MySQL似乎是在Oracle驱动程序之前尝试过的驱动程序,正如您预期您的Oracle连接也会失败一样,它只是碰巧抛出了MySQL异常,因为这是第一个异常。
长话短说,更新您的MySQL连接器/J。
https://stackoverflow.com/questions/57427713
复制相似问题