sql - 数据库链接连接超时

标签 sql oracle tomcat oracle10g

我有一个从 jsp 调用存储过程的 tomcat 服务器。在存储过程中,我有一个用数据填充临时表的查询。然后该临时表通过 dblink 连接到另一个表,以使用提示填充另一个临时表 - DRIVING_SITE。然后将最后一个临时表连接到我们数据库中的另一个表,以将结果集返回给 tomcat。

很抱歉,我真的无法为所有这些提供代码示例,但我遇到的问题是 - 在一段时间未使用数据库链接后,使用该链接进行的第一个查询将什么都不做并返回错误:

test.jsp caught exception, closing connection: ORA-02068: following severe error from DATABASE_LINK_NAME
ORA-03135: connection lost contact

在上次调用后 10 分钟左右内对数据库链接进行的每个后续查询都可以。临时表可大可小,查询的数据量似乎没有区别,但空闲时间后的第一次调用可能有 75% 的时间会出现此错误。有没有人遇到过这个问题?如果有,有什么解决方案吗?

查询的结构如下:

INSERT INTO temp_table_2
WITH last_submissions AS (
    SELECT /*+ DRIVING_SITE(some_schema.some_table_1) */
           bs.unique_id,
           CASE WHEN COUNT(bs.unique_id) > 1 THEN 'Y' ELSE 'N' END some_flag,
           MAX(trx.unique_id) last_submission
    FROM   (SELECT unique_id
            FROM   temp_table_1) oids,
           some_schema.some_table_1@DATABASE_LINK bs,
           some_schema.some_table_1@DATABASE_LINK trx
    WHERE  oids.unique_id = bs.unique_id
      AND  bs.non_unique_join_id = trx.non_unique_join_id
    GROUP BY bs.unique_id),
something_relevant AS (
    SELECT /*+ DRIVING_SITE(some_schema.some_table_2) */
           last_value_of_something.unique_id,
           last_value_of_something.some_flag,
           mv.value_description status
    FROM   (
        SELECT /*+ DRIVING_SITE(some_schema.some_table_1) */
               ls.unique_id,
               CASE WHEN COUNT(ls.unique_id) > 1 THEN 'Y' ELSE 'N' END some_flag,
               MAX(prd.prd_some_id) last_submission
        FROM   last_submissions ls,
               some_schema.some_table_1@DATABASE_LINK trx,
               some_schema.some_table_2@DATABASE_LINK prd
        WHERE  ls.last_submission = trx.unique_id
          AND  trx.some_unique_id = prd.some_unique_id (+)
        GROUP BY ls.unique_id) last_value_of_something,
        some_schema.some_table_2@DATABASE_LINK prd,
        some_schema.some_table_3@DATABASE_LINK cs,
        some_schema.some_display_value_table@DATABASE_LINK mv
    WHERE  last_value_of_something.last_submission = prd.prd_some_id (+)
      AND  prd.some_id = cs.some_id (+)
      AND  cs.status_code = mv.value (+)
      AND  mv.value_type (+) = 'SOME_INDICATOR_FOR_DISPLAY_VALUES')
SELECT ls.unique_id unique_id,
       NVL(pr.status, trx.some_code) status,
       CASE WHEN ls.some_flag = 'Y' OR pr.some_flag = 'Y' THEN 'Yes' ELSE 'No' END display_the_flag
FROM   /*+ DRIVING_SITE(some_schema.some_table_1) */
       last_submissions ls,
       some_schema.some_table_1@DATABASE_LINK trx,
       something_relevant pr
WHERE  ls.last_submission = trx.unique_id
  AND  ls.unique_id = pr.unique_id

最佳答案

您是否希望两个数据库服务器之间的网络稳定并允许连接存在一段时间?

当您使用数据库链接时,本地服务器会打开到远程服务器的连接。只要您的 session 打开以供其他查询使用,该连接就会保持打开状态。如果您看到连接断开,这通常意味着网络中有某些东西(通常是防火墙)正在检测并终止空闲连接。这也可能意味着两台服务器之间的网络不稳定。

理想情况下,您可以通过修复任何潜在的网络问题来解决问题。例如,如果有防火墙正在终止空闲连接,您应该能够修改防火墙配置以避免终止这些连接。

如果无法修复基础架构,您可以在每次查询后关闭与远程服务器的连接(或者至少在每次查询后可能会有很长的空闲时间)

ALTER SESSION CLOSE DATABASE LINK <<dblink name>>

然而,这意味着您可能会在每次查询时建立和断开与远程服务器的连接——这可能相对昂贵并且可能会给远程服务器带来更多负载(当然,取决于它发生的频率以及您可能有多少 session )。

通过数据库链接将数据提取到一系列临时表中以便为使用 Web 应用程序的人提供数据的整个过程也让我觉得这是一个潜在的问题架构。也许你有充分的理由这样做。但我会强烈考虑使用某种复制技术(物化 View 、Streams 或 GoldenGate 是内置选项),而不是在运行时通过数据库链接提取数据。

关于sql - 数据库链接连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19235107/

相关文章:

mysql group by,两个条件,限制1

c# - SQL 良好实践和外键

sql - 如何使用 Groovy 从 Oracle 获取光标?

oracle - 解锁 apex 管理员帐户

javascript - 加载 css 和 js

java - 将 Tomcat 中的 .war 应用程序部署到 root

mysql - SQL从表1中选择ID并将相同的ID更新到表2

mysql - 如何创建MySQL分层递归查询

java - 如何检查我们在 jdbc 中使用的是 oracle 8i 数据库?

java - 无法从 JSP 执行 servlet,但可以从直接 URL 访问(mvc mysql tomcat)