获取 Oracle JDBC 连接上的 MySQL 错误堆栈跟踪

2024-05-06

我在使用连接字符串进行 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(使用前将#替换为@)

获取 Oracle JDBC 连接上的 MySQL 错误堆栈跟踪 的相关文章

随机推荐

  • MassTransit AzureServiceBus 生成的队列

    我有一个托管在 Azure Service Fabric 解决方案中的 MT 设置的工作配置 我有一个发送消息的 API 和一个读取消息的无状态应用程序 在无状态应用程序中 我告诉它使用类型的消息TestMessage具有以下内容 cont
  • Facebook 自定义消息共享

    当我点击网站上的 Facebook 分享按钮时 我需要添加自定义消息 默认情况下 文本显示 对此说些什么 当我点击 Facebook 分享按钮时 我想将此消息更改为自定义消息 有没有办法用 sharer php 做到这一点 就像参数 t c
  • 按两个字段对 Python 列表进行排序 [重复]

    这个问题在这里已经有答案了 我从排序的 csv 创建了以下列表 list1 sorted csv1 key operator itemgetter 1 我实际上想按两个标准对列表进行排序 首先按字段 1 中的值 然后按字段 2 中的值 我该
  • 在 CASE 语句中使用 CAST 时出现数据转换错误

    运行以下命令时出现错误 将数据类型 nvarchar 转换为 float 时出错 declare completeCommand nvarchar max x paramVal nvarchar 100 paramName nvarchar
  • C# 数据类型到 SQL Server 数据类型

    如何将 C 数据类型 转换 为 SQL Server 数据类型 SqlDbType是已知的 i e C gt String SQL Server gt N String 尝试这个 它是一个 Extension 类 因此您要在文件上添加以下方
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含
  • 在 Shapely 中向现有多边形添加新点

    如何修改现有的多边形 首先 我想在其外部添加一个点 poly Polygon 0 0 1 1 1 0 我一直在寻找这样的东西 poly append at idx 3 Point 1 1 但我找不到任何类似的方法来做到这一点 添加或删除点是
  • Javascript 链接在 selenium excel vba 中没有响应

    我正在尝试做这样一行点击 javascript 链接的操作 FindElementById ctl00 ContentPlaceHolder1 LinkButton4 WaitDisplayed True 3000 Click 这条线没有任
  • 为 Visual Studio 2012 编译 Qt 4.8.x

    我应该采取哪些步骤来编译适用于 Visual Studio 2012 的 Qt 版本 4 8 x 我已经仔细遵循了已接受答案中的说明这个问题 https stackoverflow com questions 5601950 how to
  • 如何检测Web Api Post请求Json中的重复键

    当请求 Json 包含重复键时 我需要从 ASP NET Web API Post 请求返回 400 错误 例如 如果请求是 key1 value1 key2 1000 key2 2000 key3 value3 那么我希望由于有两个 ke
  • Java SSLException:证书中的主机名与 www.googleapis.com 不匹配

    环境 Mac OS X Lion 和 Linux Debian squeeze sid JDK 1 7 0 和 JDK 1 6 0 27 Error javax net ssl SSLException hostname in certif
  • 如何取消部署 Prediction IO 模型

    我正在使用预测 io 模板进行逻辑回归 我已经使用部署了一个模型pio deploy 它给了我一个测试我的问题的端口 我的问题是如何取消部署模型 是否有任何命令可以取消部署或者我必须使用以下命令找到端口的 PIDnetstat npl gr
  • 最可靠的分裂角色

    Update 如果您被迫在 split 方法中使用单个字符 那么哪个字符最可靠 可靠的定义 不属于被分割的各个子字符串的分割字符 我们目前使用 public const char Separator char 007 如果我没记错的话 我认
  • 如何使用 eslint 修复一条规则

    我想使用 eslint 命令标志 fix只是修复一条规则 我尝试了命令 eslint fix config eslintrcsomerules js 但这不起作用 如何达到目的 My eslintrcsomerules js文件如下 mod
  • 如何异步使用 HttpWebRequest (.NET)?

    如何异步使用 HttpWebRequest NET C Use HttpWebRequest BeginGetResponse http msdn microsoft com en us library system net httpweb
  • 如何使用 powershell Az 模块为 Azure AD 应用程序提供所需权限的访问权限

    我正在尝试重写 powershell 脚本来创建 Azure AD 应用程序并为其分配权限 该脚本使用 AzureAD 模块 我想使用新的 Az 模块 这样我就可以在 Linux MacOS 上运行它 创建新应用程序很容易 New AzAD
  • 如何编写简单的异步方法?

    使用带有 async await 关键字的最新 CTP5 我编写了一些代码 但显然无法编译 class Program public class MyClass async public Task
  • Java - SwingWorker - 我们可以从其他 SwingWorker 调用一个 SwingWorker 而不是 EDT

    我有一个SwingWorker如下 public class MainWorker extends SwingWorker Void MyObject 我调用了上面的Swing Worker来自东部夏令时间 MainWorker mainW
  • while(foo) 与 while(foo != NULL)

    有人可以解释一下如何while foo vs while foo NULL 是等价的 还 while foo vs while foo NULL 我知道 不是 但这就是我所知道的全部 假设foo是指针类型 while foo and whi
  • 获取 Oracle JDBC 连接上的 MySQL 错误堆栈跟踪

    我在使用连接字符串进行 Oracle JDBC 连接时遇到非常奇怪的错误 我将用户名指定为 sys 应该是 sys as sysdba 理想情况下 它应该来自 ojdbc6 jar 但就我而言 它来自 mysql connector jav