2013-10-07 145 views
0

我有一个tomcat服务器从jsp调用存储过程。在存储过程中,我有一个用数据填充临时表的查询。该临时表然后通过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, 
      [email protected]_LINK bs, 
      [email protected]_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, 
       [email protected]_LINK trx, 
       [email protected]_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, 
     [email protected]_LINK prd, 
     [email protected]_LINK cs, 
     [email protected]_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, 
     [email protected]_LINK trx, 
     something_relevant pr 
WHERE ls.last_submission = trx.unique_id 
    AND ls.unique_id = pr.unique_id 
+1

两个数据库之间是否存在防火墙,在空闲时间后丢弃连接?似乎可能在10分钟后。听起来像是一个网络问题,而不是一个特定的Oracle。 –

回答

2

你预计这两个数据库服务器之间的网络是稳定的,并允许连接到一段时间存在吗?

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

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

若固定的基础设施是不是一种选择,你可以关闭每个查询后连接到远程服务器(或至少每隔可能跟一个长的空闲时间查询后)

ALTER SESSION CLOSE DATABASE LINK <<dblink name>> 

那但是,这意味着您可能会在每个查询中设置并拆除与远程服务器的连接 - 这可能相对较为昂贵,并且可能会导致远程服务器上的负载更多(具体取决于它发生的频率以及您可能拥有多少次会话)。

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

+0

@Reimius - 您可以通过JDBC/ODBC驱动程序从中间层连接到每个数据库的事实并不意味着服务器之间的连接不会被某种防火墙终止。 –

+0

@Justin_Cave虽然 – Reimius

+0

@Reimius - 其他查询的工作有影响,如果他们在同一个会话中的查询之间有相似的空闲时间周期,yes。但是完全有可能有一个防火墙在N分钟后终止连接,这对于大量短时间运行的进程不会产生问题,但这对于经常在不到N分钟内运行的进程会产生问题,但有时会运行位长。单单最后一段真的不回答你问的问题,所以我不能删除所有的东西。随时接受你自己的答案。 –