【问题标题】:Hung queries on Oracle 9i over JDBC通过 JDBC 在 Oracle 9i 上挂起查询
【发布时间】:2014-07-01 23:01:58
【问题描述】:

最近我的 Oracle 9i 数据库从一个站点移动到另一个站点,从那以后我一直无法使用瘦 JDBC 驱动程序来查询它。

此数据库一直在异地并通过 VPN 连接 - 速度不快但可行。由于移动查询被发送到数据库,标题可能会回来然后停止。在 v$session 中,我的会话处于“非活动状态”,但查询仍列为存在。这将几乎无限期挂起 - 我已经看到它持续了 9 个小时,没有任何动作、回滚错误或任何东西。

当我从 Oracle 11 的 JDBC 驱动程序切换到 Oracle 9 驱动程序时,性能略有提高。我在 Oracle 网站上尝试了许多“防火墙后提示”(连接字符串更改和 JDBC 属性),但无济于事。

确实产生影响的一件事是将 fetchRow 的大小更改为 1 - 仍然非常缓慢,但在某些查询中可能会得到一些结果。

查询并不密集 - 即使 PK 查找也会失败,因为表中有 40 个小文本列。在 SqlPlus 上运行良好。

我正在使用 Linux(centOS 和 Fedora),尝试过 JDK 7 和 8,瘦 JDBC 驱动程序版本 9、11 和 12,并使用 SquirrelSQL、SQLWorkbench/J、SQLLine、groovy 脚本和 grails ap,结果都相同.

【问题讨论】:

  • 数据库会话等待的最后一个等待事件是什么?
  • 有没有办法在没有 DBA 权限的情况下获取等待事件?
  • 既然您可以访问v$session,那么wait_classwait_timeseconds_in_waitstate 对初学者有何作用?
  • 您是否查看过线程转储 (kill -3 ) 以了解实际线程正在处理什么?我已经看到 vpns “静默终止”套接字的问题,尤其是长时间运行的连接(例如,如果使用了 jdbc 连接池)。这会导致线程永远有效地卡在 read0 调用中。

标签: java oracle jdbc


【解决方案1】:

事实证明,在任何正常音量下都会出现严重的数据包丢失,这会导致其中一个 acks/synacks 丢失并无限期地挂起查询。

这是通过将 MTU 降低到 600(从操作系统默认值 1500)“解决”的。粗略的妥协,但正在奏效。

【讨论】:

    猜你喜欢
    • 2014-07-15
    • 2011-07-14
    • 2013-05-02
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多