我在使用连接字符串进行 Oracle JDBC 连接时遇到非常奇怪的错误。我将用户名指定为“sys”(应该是 sys as sysdba),理想情况下,它应该来自 ojdbc6.jar,但就我而言,它来自 mysql-connector-java-8.0.11.jar,它也包含在内在我的项目中。请帮忙,因为我必须将这两个罐子保留在我的项目中。
当我删除 mysql-connector-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)
MySQL Connector/J 8 版本 8.0.11 或更早版本(以及从未发布的 MySQL Connector/J 6 版本)会出现此错误。您需要升级到8.0.12或更高版本(当前最新版本是8.0.17,请参见https://dev.mysql.com/downloads/connector/j/ https://dev.mysql.com/downloads/connector/j/).
来自连接器/J 8.0.12 发行说明 https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-12.html:
当应用程序尝试通过以下方式连接到非 MySQL 数据库时
一些 JDBC 驱动程序和 Connector/J 恰好位于类路径上
另外,Connector/J 抛出了 SQLNonTransientConnectionException,这
阻止应用程序连接到其数据库。有了这个
修复,当连接字符串不存在时,Connector/J 返回 null
以 jdbc:mysql: 或 mysqlx: 开头,因此连接到非 MySQL
数据库没有被阻止。 (错误#26724154,错误#87600)
也可以看看https://bugs.mysql.com/bug.php?id=87600 https://bugs.mysql.com/bug.php?id=87600
作为背景,通常,不支持特定 URL 的 JDBC 驱动程序(例如基于子协议)jdbc:
),应该返回null
,并且仅当 URL 用于驱动程序但 URL 或创建连接存在问题时才应引发异常。
然而,即使 MySQL Connector/J 驱动程序存在此错误,您仍然可以连接到 Oracle 数据库,如下所示DriverManager
将尝试每个驱动程序,直到能够打开连接。如果没有驱动程序能够连接,它将抛出first任何驱动程序抛出异常,或者 - 如果所有驱动程序都返回null
- 它会抛出一个“没有找到合适的驱动程序”例外。
在这种情况下,看起来 MySQL 是在 Oracle 驱动程序之前尝试的驱动程序,并且正如您预计 Oracle 连接也会失败一样,它恰好抛出 MySQL 异常,因为这是第一个异常。
长话短说,更新您的 MySQL Connector/J。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)