【发布时间】: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_class、wait_time、seconds_in_wait和state对初学者有何作用? -
您是否查看过线程转储 (kill -3
) 以了解实际线程正在处理什么?我已经看到 vpns “静默终止”套接字的问题,尤其是长时间运行的连接(例如,如果使用了 jdbc 连接池)。这会导致线程永远有效地卡在 read0 调用中。